SELECT * FROM TableA WHERE ColA IN ('B105', 'C101') --ColA에 Non-Clustered Index가 생성되어 있다. --Clustered Index는 생성되지 않았다. --이 Query는 실제 실행에서 Index Seek를 한다고 가정한다.
SELECT ColA FROM TableA WHERE ColA IN ('B105', 'C101')
--ColA에 Non-Clustered Index가 생성되어 있고, Index Seek를 가정한다. SELECT ColA, ColB --ColB가 Index만을 읽어서는 모른다. 데이터 페이지를 읽어야만 비로소 ColB를 가져올 수 있다. FROM TableA WHERE ColA IN ('B105', 'C101') SELECT ColA, ColB, ColC --ColC로 위와 마찬가지다. FROM TableA WHERE ColA IN ('B105', 'C101') SELECT ColA FROM TableA WHERE ColA IN ('B105', 'C101') AND ColB = '2005' --SELECT절에는 명시도지 않았지만 해당 Row가 조건에 맞는지 평가하려면 데이터 페이지를 읽어야 한다. SELECT ColA FROM TableA WHERE ColA IN ('B105', 'C101') ORDER BY ColC --정렬을 위해서는 ColC가 필요하기 때문에 역시 데이터 페이지를 읽어야 한다.
use pubs go exec sp_helpindex titles /* index_name index_description index_keys ----------------- ------------------------------------------------- ---------- titleind nonclustered located on PRIMARY title UPKCL_titleidind clustered, unique, primary key located on PRIMARY title_id */ dbcc show_statistics (titles, titleind) /* All density Average Length Columns ------------------- -------------------- --------------------- 5.5555556E-2 33.0 title 5.5555556E-2 39.0 title, title_id --> title_id에는 클러스터드 인덱스가 생성되어 있다. */
use tempdb; set statistics io on create table index_test ( seq bigint ); insert index_test select top 10000 row_number() over(order by(select 1)) seq from master..spt_values a cross join master..spt_values b; create index idx1 on index_test(seq); create unique index idx2 on index_test(seq); --non unique index select * from index_test with (index=idx1) where seq <= 255 --논리적 읽기 수 2, 조건이 seq <= 256 이면 논리적 읽기수 3 --unique index select * from index_test with (index=idx2) where seq <= 367 --논리적 읽기 수 2, 조건이 seq <= 368 이면 논리적 읽기수 3
/* 테이블별 인덱스에 대한 통계가 마지막으로 업데이트된 날짜 찾기 이종희 (필라넷) 2003.10. 작성 정원혁 (MS) 2004.8. 수정 */ SELECT USER_NAME( OBJECTPROPERTY( i.id, 'OwnerID' ) ) AS Owner ,OBJECT_NAME( i.id ) AS [Table] , i.name AS [Index] ,CASE INDEXPROPERTY( i.id , i.name , 'IsClustered') WHEN 1 THEN 'Y' ELSE '' END AS IsClustered ,CASE INDEXPROPERTY( i.id , i.name , 'IsUnique' ) WHEN 1 THEN 'Y' ELSE '' END AS IsUnique ,STATS_DATE( i.id , i.indid ) AS LastUpdatedDate ,dPages * 8. /1024 AS MB FROM sysindexes AS i WHERE OBJECTPROPERTY( i.id, 'IsMSShipped' ) = 0 AND 1 NOT IN ( INDEXPROPERTY( i.id , i.name , 'IsStatistics' ) , INDEXPROPERTY( i.id , i.name , 'IsAutoStatistics' ) , INDEXPROPERTY( i.id , i.name , 'IsHypothetical' ) ) AND i.indid BETWEEN 1 And 250 -- AND dPages > 100 --작은 크기 테이블 무시 AND (STATS_DATE( i.id , i.indid ) < getdate() - 15 OR STATS_DATE( i.id , i.indid ) IS NULL) --15일 이전까지도 업데이트 안된 것 ORDER BY Owner, [Table], [Index] --출처: dbguide.net