켄 헨더슨씨가 쓴 '강력한 SQL 프로그래밍을 위한 T-SQL'이라는 책에 보면, 제목에 해당하는 글이 나온다.
identity가 걸린 pk컬럼에 index를 생성하는 것은 최적화된 방법이 아닌데, 그 이유는
1. 특정 범위의 키 값에 대하여 테이블을 쿼리할 수 없고 순차적 pk 컬럼에 대하여 ORDER BY를 수행할 수 없기 때문이다.
2. clustered identity pk는 사용자들이 테이블에 로우를 추가할 때 데이터베이스의 동일한 영역에 대하여 경합이 벌어지게 할 수 있는데, 이를 'hot sopt'이라 한다.
라고 기술하고 있습니다.
이 글을 읽다가... 저는 그런 단점말고 아래와 같은 다른 장점도 있다는 생각을 평소에 하고 있었습니다.
a. clustered identity pk는 순차 증가하므로, index 및 data page의 재정렬 작업이 마지막 페이지에서만 일어난다.
b. clustered identity pk는 update가 발생하지 않는다. (물론 identity가 아니더라도 update가 발생하진 않겠지만, 발생할 수도 있다는 가정하에..) 그러므로 1번과 마찬가지로 index 및 data page의 재정렬 작업이 발생하지 않는다.
그래서 이런 내용에 대한 논의가 있을거라는 생각에 웹에서 검색을 해 봤습니다.
..more
>접기
아래 내용들은 위와 같은 내용에 대한 궁금증으로 글을 올린 사람이 밝혀놓은 링크들의 내용을 간략히 소개한 것이다.
출처 :
http://www.sqlservercentral.com/forums/shwmessage.aspx?forumid=5&messageid=143768
http://www.sql-server-performance.com/clustered_indexes.asp
여기 내용 중
As a rule of thumb, every table should have a clustered index. Generally, but not always, the clustered index should be on a column that monotonically increases--such as an identity column, or some other column where the value is increasing--and is unique. In many cases, the primary key is the ideal column for a clustered index.
If you have any experience with performance tuning SQL Server 6.5, you may have heard that is not a good idea to add a clustered index to a column that monotonically increases because it can cause a "hotspot" on the disk that can cause performance problems. That advice is true in SQL Server 6.5.
In SQL Server 7.0 and 2000, "hotspots" aren't generally a problem. You would have to have over 1,000 transactions a second before a "hotspot" were to negatively affect performance. In fact, a "hotspot" can be beneficial under these circumstances because it eliminates page splits.
Here's why. If you are inserting new rows into a table that has a clustered index as its primary key, and the key monotonically increases, this means that each INSERT will physically occur one after another on the disk. Because of this, page splits won't occur during INSERTs, which in itself saves overhead. This is because SQL Server has the ability to determine if data being inserted into a table has a monotonically increasing sequence, and won't perform page splits when this happens.
If you are inserting a lot of rows into a heap (a table without a clustered index), data is not inserted in any particular order onto data pages, whether the data is monotonically or not monotonically increasing. This results in SQL Server having to work harder (more reads) to access the data when requested from disk. On the other hand, if a clustered index is added to a table, data is inserted sequentially on data pages, and generally less disk I/O is required to retrieve the data when requested from disk.
If data is inserted into a clustered index in more or less random order, data is often inserted randomly into physical data pages, which is similar to the problem of inserting any data into a heap.
So again, often, the best overall recommendation is to add a clustered index to a column that monotonically increases (assuming there is a column that does so). This is especially true if the table is subject to many INSERTS, UPDATES, and DELETES. But if a table is subject to few data modification, but to many SELECT statements, then this advice is less useful, and other options for the clustered index should be considered. Read the other tips on this page to learn of situations where you should place the clustered index on other columns. [7.0, 2000] Updated 11-15-2004
-> 여기선 identity가 걸린 pk 컬럼에 clustered index를 거는 것을 권장한다. 위에 설명한 a와 동일한 이유로. 단 마지막 부분에 보면 거의 변화가 없고 SELECT만 많은 경우는 덜 유용한 방법이라고 설명하고 있다.
하나 중요한 설명이 있는데, 켄 헨더슨씨가 설명한 2번 문제가 SQL Server 6.5에서는 문제가 되지만 SQL Server 7.0과 2000에서는 그다지 문제가 되지 않는다는 설명도 있다.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/optimsql/odp_tun_1_6583.asp
Use integer keys for clustered indexes. Additionally, clustered indexes benefit from being created on unique, nonnull, or IDENTITY columns. For more information, see Using Clustered Indexes.
-> 달랑 identity 컬럼에 clustered를 만들라고만 나왔네요 --''
이 외에 사람들의 의견이 조금씩 차이가 있는데...
이 글을 읽는 분의 생각은 어떠신지요...?