查詢的時候應該盡量按照復合索引中的順序來做條件查詢;(比如IXC中spInterActiveInstance_GetByIDToStat條件and ProcessState<>99的位置);
如果在程序中有For或者是Foreach,在存儲過程中又有IF Exists,那就要看是否可以在表中加入復合索引了,IF Not Exists可以轉換為IF Exists來使用索引;
在查詢中盡量少使用*或者全表字段來查詢數據。第一,返回的數據集比較大;第二,產生更多的IO操作;第三,會使用到Bookmark lookup的查詢計劃,性能有所下降;如果能使用到覆蓋索引來查詢是最理想的;
下面關於查詢的性能比較
返回行數較多:索引覆蓋>聚集索引>表掃描>堆集的非聚集索引>聚集的非聚集索引
返回行數較少:索引覆蓋=聚集索引>堆集的非聚集索引>聚集的非聚集索引>表掃描
比較難理解的可能是:堆集的非聚集索引>聚集的非聚集索引。下面是個人見解,堆表就是沒有聚集索引的表,實質上就是在一個沒有聚集索引的表中加入非聚集索引和一個在聚集表中加入同一字段的非聚集索引;(聚集)非聚集索引-定位器-聚集索引-Bookmark lookup-返回指定字段值;(堆集)非聚集索引-定位器-對應的數據行的指針-返回指定字段值;
不要在Where字句中的列名加函數;如果有對列值進行判斷的,盡量把操作符(比如+、-、*等)放到=號的右邊;