SQL Server查詢優(yōu)化的實(shí)際操作建議描述
此文章主要向大家講述的是SQL Server查詢優(yōu)化的實(shí)際操作建議,在實(shí)際操作中有些查詢本身就對(duì)資源的消耗很大。這與基本的數(shù)據(jù)庫(kù)與索引的相關(guān)問題有關(guān)。這些查詢的效率并不低,因?yàn)镾QL Server查詢優(yōu)化器會(huì)以最有效的可能方式實(shí)現(xiàn)這些查詢。
然而,它們確實(shí)消耗大量資源,而且 Transact-SQL 面向集合的性質(zhì)使這些查詢看起來(lái)效率很低。SQL Server查詢優(yōu)化器的智能水平無(wú)法消除這些構(gòu)造的固有資源成本。與不復(fù)雜的查詢相比,這些查詢的固有成本十分昂貴。雖然 Microsoft® SQL Server™ 2000 使用***的訪問計(jì)劃,但受到基礎(chǔ)構(gòu)造可能性的限制。例如,下列類型的查詢可能占用大量資源:
返回大結(jié)果集的查詢
高度不唯一的 WHERE 子句
不過有一些針對(duì)優(yōu)化查詢和提高查詢性能的建議,其中包括:
添加更多的內(nèi)存(尤其是如果服務(wù)器運(yùn)行許多復(fù)雜查詢而且其中幾個(gè)查詢執(zhí)行很慢)。
在有多個(gè)處理器的計(jì)算機(jī)上運(yùn)行 SQL Server。多個(gè)處理器使 SQL Server 得以利用并行查詢。
考慮重新編寫查詢
如果查詢使用游標(biāo),則確定如果使用效率更高的游標(biāo)類型(如快速只進(jìn)游標(biāo))或單純查詢能否更有效地編寫游標(biāo)查詢。單純查詢的性能一般優(yōu)于游標(biāo)操作。一組游標(biāo)語(yǔ)句通常是一個(gè)外循環(huán)操作,在此操作中,一旦使用內(nèi)部語(yǔ)句便開始處理外循環(huán)內(nèi)的每行,因此可考慮使用 GROUP BY 或 CASE 語(yǔ)句或改為使用子查詢。
如果應(yīng)用程序使用循環(huán),可考慮在查詢內(nèi)放入循環(huán)。應(yīng)用程序常包含帶參數(shù)化查詢的循環(huán),該循環(huán)執(zhí)行許多次并要求運(yùn)行應(yīng)用程序的計(jì)算機(jī)與 SQL Server 之間有網(wǎng)絡(luò)往返。可改為使用臨時(shí)表創(chuàng)建一個(gè)更復(fù)雜的查詢。只需提供一個(gè)網(wǎng)絡(luò)往返,SQL Server查詢優(yōu)化器即會(huì)更好地優(yōu)化這個(gè)查詢。
不要對(duì)同一查詢內(nèi)的單個(gè)表使用多個(gè)別名以模擬索引交叉。模擬索引交叉已沒有必要,因?yàn)?SQL Server 會(huì)自動(dòng)考慮索引交叉并且可以在同一查詢內(nèi)的相同表上使用多個(gè)索引。例如,給出下列示例查詢:
- SELECT * FROM lineitem WHERE partkey BETWEEN 17000
- AND 17100 AND shipdate BETWEEN '1/1/1994' AND '1/31/1994"
SQL Server 可以在 partkey 和 shipdate 列上都使用索引,然后在兩個(gè)子集之間執(zhí)行哈希匹配以獲得索引交叉。
只在必要時(shí)才使用查詢提示。若查詢使用在 SQL Server 早期版本上執(zhí)行的提示,則應(yīng)在不指定提示的情況下對(duì)該查詢進(jìn)行測(cè)試。提示會(huì)防礙SQL Server查詢優(yōu)化器選擇更好的執(zhí)行計(jì)劃。
利用 query governor 配置選項(xiàng)和設(shè)置??梢允褂?query governor 配置選項(xiàng)阻止執(zhí)行長(zhǎng)時(shí)間運(yùn)行的查詢,從而防止消耗系統(tǒng)資源。默認(rèn)情況下,query governor 配置選項(xiàng)允許執(zhí)行所有查詢,而不考慮查詢所需的時(shí)間。
然而,可以將查詢調(diào)控器設(shè)置到***秒數(shù),以允許執(zhí)行所有連接的所有查詢或只允許執(zhí)行特定連接的查詢。查詢調(diào)控器基于估計(jì)的查詢成本而不是實(shí)際的已用時(shí)間,因此沒有任何運(yùn)行時(shí)開銷。它還在長(zhǎng)時(shí)間運(yùn)行的查詢開始前便將其停止,而不是先運(yùn)行這些查詢直到達(dá)到某些預(yù)定義的限制為止。
【編輯推薦】