溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL Server查詢優(yōu)化中的兩個(gè)選項(xiàng)

發(fā)布時(shí)間:2020-08-11 09:47:32 來(lái)源:ITPUB博客 閱讀:123 作者:sqysl 欄目:關(guān)系型數(shù)據(jù)庫(kù)

本文中,我們將介紹兩個(gè)SQL Server中的可用概念,它們是使用SQL Server時(shí)值得注意的技術(shù)。

1.         OPTIMIZE FOR Unknown

SQL Server 2005版本中增加了OPTIMIZE FOR提示(hint),允許DBA確定用于基數(shù)評(píng)估和優(yōu)化的字面值。 如果我們有一張數(shù)據(jù)分布傾斜的表,OPTIMIZE FOR能被用于優(yōu)化為廣泛范圍參數(shù)值提供合理性能的通用值。當(dāng)對(duì)所有參數(shù)值來(lái)說(shuō)性能并非最好時(shí),相比有時(shí)做查找(seek,對(duì)于選擇性較好的參數(shù)值),有時(shí)做掃描(scan,對(duì)于選擇性一般的參數(shù)值),所有場(chǎng)景具備同樣的執(zhí)行時(shí)間也許會(huì)更可取,這依賴于最初編譯期間傳入的參數(shù)值。

不幸的是,OPTIMIZE FOR僅允許字面值。如果變量為類似日期時(shí)間(datetime)或順序數(shù)(其本質(zhì)隨時(shí)間而增長(zhǎng)),那么,確定的任何固定值不久將因變得過(guò)時(shí)而不得不修改該提示來(lái)確定一個(gè)新值。即使該參數(shù)值域隨時(shí)間保持相對(duì)穩(wěn)定,但提供字面值時(shí)你不得不實(shí)驗(yàn)和發(fā)現(xiàn)一個(gè)足夠好的通用值,這有時(shí)是很難的或很費(fèi)時(shí)間的。

最后,為OPTIMIZER FOR提供數(shù)值將通過(guò)改變使用該參數(shù)的謂詞基數(shù)評(píng)估而影響計(jì)劃的選擇。在OPTIMIZE FOR提示中,如果你提供了一個(gè)不存在或稀有值,那么,你就減少了基數(shù)評(píng)估值,這將會(huì)影響成本和最終計(jì)劃的選擇。

如果你只想得到一個(gè)“平均”值而并不關(guān)心該值是什么,OPTIMIZE FOR (@variable_name UNKNOWN)提示將導(dǎo)致優(yōu)化器忽略影響基數(shù)評(píng)估的這個(gè)參數(shù)值。取而代之是用柱狀圖,基數(shù)評(píng)估將由密度、關(guān)鍵信息或依賴謂詞的固定選擇性評(píng)估得出。這將導(dǎo)致一個(gè)并不需要DBA必須一直監(jiān)視和改變參數(shù)值來(lái)維護(hù)一致性能的可預(yù)見(jiàn)評(píng)估。

語(yǔ)法變化將告訴優(yōu)化器忽視所有參數(shù)值,這只需確定OPTIMIZE FOR UNKNOWN并漏掉括號(hào)和變量名。確定OPTIMIZE FOR將導(dǎo)致ParameterCompiledValue從showplan XML輸出中消失,正像參數(shù)嗅探(sniffing)沒(méi)有發(fā)生一樣。不管傳遞的參數(shù),最終計(jì)劃將是一樣的,并且,也許會(huì)給出更加可預(yù)見(jiàn)的查詢性能。

2.         QUERYTRACEON 和 QUERYRULEOFF

有些場(chǎng)景中,開(kāi)發(fā)人員也許建議用跟蹤標(biāo)志(trace flag)來(lái)避免查詢計(jì)劃或優(yōu)化器問(wèn)題。或者,他們也許發(fā)現(xiàn)禁用某個(gè)特定優(yōu)化器規(guī)則會(huì)阻止特定問(wèn)題的發(fā)生。一些跟蹤標(biāo)志很常見(jiàn),以至于難以預(yù)見(jiàn)開(kāi)啟這些跟蹤標(biāo)志是否能很好的解決所有查詢問(wèn)題,或該問(wèn)題是否只針對(duì)研究的特定查詢。類似的,大多數(shù)優(yōu)化器規(guī)則并非本身不好,整個(gè)系統(tǒng)范圍內(nèi)禁用該規(guī)則可能會(huì)導(dǎo)致其他方面的性能退化。

SQL Server 2008中,可以在特定查詢運(yùn)行期間開(kāi)啟某個(gè)跟蹤標(biāo)志,或通過(guò)如下未被歸檔QUERYTRACEON或QUERYRULEOFF提示僅在查詢編譯期間禁用某個(gè)優(yōu)化器規(guī)則。

select @v_test=c1 from t1 where c1=2 option(recompile,querytraceon 2389);

select @v_test=c1 from t1 where c1=2 option(recompile,queryruleoff OmitMyidx);

上述第二個(gè)語(yǔ)句顯示的語(yǔ)法也許會(huì)導(dǎo)致“no plan”錯(cuò)誤。預(yù)先未與開(kāi)發(fā)人員討論以確保完全理解該規(guī)則及禁用可能帶來(lái)的后果,就不應(yīng)該使用QUERYRULEOFF。數(shù)據(jù)庫(kù)屬主通常擁有創(chuàng)建一個(gè)計(jì)劃指導(dǎo)(plan guide)所需的足夠權(quán)限,而用QUERYTRACEON/QUERYRULEOFF提示創(chuàng)建一個(gè)計(jì)劃指導(dǎo)則需要sysadmin權(quán)限,因?yàn)楦淖冞@些設(shè)置也許有系統(tǒng)而非數(shù)據(jù)庫(kù)范圍的含義。

結(jié)論

最后,清楚你的環(huán)境中何時(shí)使用這些查詢優(yōu)化或查詢調(diào)優(yōu)技術(shù)很重要,請(qǐng)?jiān)谑褂眠@些技術(shù)前,分析具體情況并進(jìn)行足夠的測(cè)試。.

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI