server|最佳化
有些查詢天生就消耗大量資源。這與基本的資料庫和索引問題有關。這些查詢的效率並不低,因為查詢最佳化工具會以最有效可能方式實現這些查詢。然而,它們確實消耗大量資源,而且 Transact-SQL 面向集合的性質使這些查詢看起來效率很低。查詢最佳化工具的智能水平無法消除這些構造的固有資源成本。與不複雜的查詢相比,這些查詢的固有成本十分昂貴。雖然 Microsoft(r) SQL Server? 2000 使用最佳的訪問計劃,但受到基礎構造可能性的限制。
例如,下列類型的查詢可能佔用大量資源:
返回大結果集的查詢
高度不唯一的 WHERE 子句
不過有一些針對最佳化查詢和提高查詢效能的建議,其中包括:
添加更多的記憶體(尤其是如果伺服器運行許多複雜查詢而且其中幾個查詢執行很慢)。
在有多個處理器的電腦上運行 SQL Server。多個處理器使 SQL Server 得以利用並行查詢。有關更多資訊,請參見並行查詢處理。
考慮重新編寫查詢。
如果查詢使用遊標,則確定如果使用效率更高的遊標類型(如快速順向資料指標)或單純查詢能否更有效地編寫遊標查詢。單純查詢的效能一般優於遊標操作。一組遊標語句通常是一個外迴圈操作,在此操作中,一旦使用內部語句便開始處理外迴圈內的每行,因此可考慮使用 GROUP BY 或 CASE 語句或改為使用子查詢。
如果應用程式使用迴圈,可考慮在查詢內放入迴圈。應用程式常包含帶參數化查詢的迴圈,該迴圈執行許多次並要求運行應用程式的電腦與 SQL Server 之間有網路往返。可改為使用暫存資料表建立一個更複雜的查詢。只需提供一個網路往返,查詢最佳化工具即會更好地最佳化這個查詢。
不要對同一查詢內的單個表使用多個別名以類比索引交叉。類比索引交叉已沒有必要,因為 SQL Server 會自動考慮索引交叉並且可以在同一查詢內的相同表上使用多個索引。例如,給出下列樣本查詢:
SELECT * FROM lineitem
WHERE partkey BETWEEN 17000 AND 17100 AND
shipdate BETWEEN ’1/1/1994’ AND ’1/31/1994"
SQL Server 可以在 partkey 和 shipdate 列上都使用索引,然後在兩個子集之間執行雜湊匹配以獲得索引交叉。
只在必要時才使用查詢提示。若查詢使用在 SQL Server 早期版本上執行的提示,則應在不指定提示的情況下對該查詢進行測試。提示會防礙查詢最佳化工具選擇更好的執行計畫。有關更多資訊,請參見 SELECT。
利用 query governor 配置選項和設定。可以使用 query governor 配置選項阻止執行長時間啟動並執行查詢,從而防止消耗系統資源。預設情況下,query governor 配置選項允許執行所有查詢,而不考慮查詢所需的時間。然而,可以將查詢管理員設定到最大秒數,以允許執行所有串連的所有查詢或只允許執行特定串連的查詢。查詢管理員基於估計的查詢成本而不是實際的經過時間,因此沒有任何運行時開銷。它還在長時間啟動並執行查詢開始前便將其停止,而不是先運行這些查詢直到達到某些預定義的限制為止。有關更多資訊,請參見 query governor cost limit 選項和 SET QUERY_GOVERNOR_COST_LIMIT。