對於SQL Server,有很多因素會影響最終的執行計劃。在基本層面上,統計數據扮演着非常重要的角色,但他們基於數據,但並不總是全部數據。統計數據並不總是最新的。創建或重建索引時,統計數據應基於FULL/100%數據樣本。但是,自動統計刷新的採樣率遠遠低於100%,因此可以對實際上不代表大部分數據的範圍進行採樣。該操作的預計行數也起着一個作用,該作用可以基於表中的行數或過濾操作的統計數據。因此,過時的(或不完整的)統計信息會導致優化器選擇一個不太理想的計劃,就像表中的一些行可能導致它完全忽略索引一樣(這可能會更有效)。
正如在另一個答案中提到的,更獨特的(即選擇性)數據是索引將會更有用。但請記住,唯一有保證統計量的列是索引的前導(或「最左邊」或「第一個」)列。 SQL Server可以並且確實收集其他列的統計信息,甚至一些不在任何索引中,但只有在AutoCreateStatistics數據庫選項被設置(並且是默認情況下)的情況下。
另外,當這些字段在查詢中時,外鍵的存在可以幫助優化器。
但是問題中沒有考慮到的一個方面就是查詢本身。查詢稍有改變但仍然返回相同的結果,可能會有完全不同的執行計劃。也可以通過使用到使用索引無效:
LIKE '%' + field
或在功能包裝領域,如:
WHERE DATEADD(DAY, -1, field) < GETDATE()
現在,請記住,讀操作(理想情況下)索引更快,但DML操作(INSERT,UPDATE和DELETE)更慢(需要更多CPU和磁盤I/O),因爲索引需要維護。
最後,「估計的」CPU等等成本值並不總是依賴於。一個更好的測試是:
SET STATISTICS IO ON
run query
SET STATISTICS IO OFF
並專注於「邏輯讀取」。如果你減少邏輯讀取,那麼你應該提高性能。
最後,您將需要一組與生產中的數據相近的數據,以便對索引和查詢本身進行性能調整。
有沒有特別的數據庫?他們並不都處理相同的事情。 – 2011-01-24 21:20:33