服務(wù)器解析請(qǐng)求的SQL語(yǔ)句。
1:SQL計(jì)劃緩存,經(jīng)常用查詢分析器的朋友大概都知道這樣一個(gè)事實(shí),往往一個(gè)查詢語(yǔ)句在第一次運(yùn)行的時(shí)候需要執(zhí)行特別長(zhǎng)的時(shí)間,但是如果你馬上或者在一定時(shí)間內(nèi)運(yùn)行同樣的語(yǔ)句,會(huì)在很短的時(shí)間內(nèi)返回查詢結(jié)果粱锐。
原因:
1):服務(wù)器在接收到查詢請(qǐng)求后,并不會(huì)馬上去數(shù)據(jù)庫(kù)查詢,而是在數(shù)據(jù)庫(kù)中的計(jì)劃緩存中找是否有相對(duì)應(yīng)的執(zhí)行計(jì)劃,如果存在,就直接調(diào)用已經(jīng)編譯好的執(zhí)行計(jì)劃,節(jié)省了執(zhí)行計(jì)劃的編譯時(shí)間。
2):如果所查詢的行已經(jīng)存在于數(shù)據(jù)緩沖存儲(chǔ)區(qū)中,就不用查詢物理文件了,而是從緩存中取數(shù)據(jù),這樣從內(nèi)存中取數(shù)據(jù)就會(huì)比從硬盤上讀取數(shù)據(jù)快很多,提高了查詢效率.數(shù)據(jù)緩沖存儲(chǔ)區(qū)會(huì)在后面提到硅蹦。
2:如果在SQL計(jì)劃緩存中沒(méi)有對(duì)應(yīng)的執(zhí)行計(jì)劃,服務(wù)器首先會(huì)對(duì)用戶請(qǐng)求的SQL語(yǔ)句進(jìn)行語(yǔ)法效驗(yàn),如果有語(yǔ)法錯(cuò)誤,服務(wù)器會(huì)結(jié)束查詢操作,并用返回相應(yīng)的錯(cuò)誤信息給調(diào)用它的應(yīng)用程序。
服務(wù)器解析請(qǐng)求的SQL語(yǔ)句闷煤。
1:SQL計(jì)劃緩存,經(jīng)常用查詢分析器的朋友大概都知道這樣一個(gè)事實(shí),往往一個(gè)查詢語(yǔ)句在第一次運(yùn)行的時(shí)候需要執(zhí)行特別長(zhǎng)的時(shí)間,但是如果你馬上或者在一定時(shí)間內(nèi)運(yùn)行同樣的語(yǔ)句,會(huì)在很短的時(shí)間內(nèi)返回查詢結(jié)果童芹。
原因:
1):服務(wù)器在接收到查詢請(qǐng)求后,并不會(huì)馬上去數(shù)據(jù)庫(kù)查詢,而是在數(shù)據(jù)庫(kù)中的計(jì)劃緩存中找是否有相對(duì)應(yīng)的執(zhí)行計(jì)劃,如果存在,就直接調(diào)用已經(jīng)編譯好的執(zhí)行計(jì)劃,節(jié)省了執(zhí)行計(jì)劃的編譯時(shí)間曹傀。
2):如果所查詢的行已經(jīng)存在于數(shù)據(jù)緩沖存儲(chǔ)區(qū)中,就不用查詢物理文件了,而是從緩存中取數(shù)據(jù),這樣從內(nèi)存中取數(shù)據(jù)就會(huì)比從硬盤上讀取數(shù)據(jù)快很多,提高了查詢效率.數(shù)據(jù)緩沖存儲(chǔ)區(qū)會(huì)在后面提到辐脖。
2:如果在SQL計(jì)劃緩存中沒(méi)有對(duì)應(yīng)的執(zhí)行計(jì)劃,服務(wù)器首先會(huì)對(duì)用戶請(qǐng)求的SQL語(yǔ)句進(jìn)行語(yǔ)法效驗(yàn),如果有語(yǔ)法錯(cuò)誤,服務(wù)器會(huì)結(jié)束查詢操作,并用返回相應(yīng)的錯(cuò)誤信息給調(diào)用它的應(yīng)用程序。
注意:此時(shí)返回的錯(cuò)誤信息中,只會(huì)包含基本的語(yǔ)法錯(cuò)誤信息,例如select 寫成selec等,錯(cuò)誤信息中如果包含一列表中本沒(méi)有的列,此時(shí)服務(wù)器是不會(huì)檢查出來(lái)的,因?yàn)橹皇钦Z(yǔ)法驗(yàn)證,語(yǔ)義是否正確放在下一步進(jìn)行皆愉。
3:語(yǔ)法符合后,就開(kāi)始驗(yàn)證它的語(yǔ)義是否正確,例如,表名,列名,存儲(chǔ)過(guò)程等等數(shù)據(jù)庫(kù)對(duì)象是否真正存在,如果發(fā)現(xiàn)有不存在的,就會(huì)報(bào)錯(cuò)給應(yīng)用程序,同時(shí)結(jié)束查詢嗜价。
4:接下來(lái)就是獲得對(duì)象的解析鎖,我們?cè)诓樵円粋€(gè)表時(shí),首先服務(wù)器會(huì)對(duì)這個(gè)對(duì)象加鎖,這是為了保證數(shù)據(jù)的統(tǒng)一性,如果不加鎖,此時(shí)有數(shù)據(jù)插入,但因?yàn)闆](méi)有加鎖的原因,查詢已經(jīng)將這條記錄讀入,而有的插入會(huì)因?yàn)槭聞?wù)的失敗會(huì)回滾,就會(huì)形成臟讀的現(xiàn)象。
5:接下來(lái)就是對(duì)數(shù)據(jù)庫(kù)用戶權(quán)限的驗(yàn)證,SQL語(yǔ)句語(yǔ)法,語(yǔ)義都正確,此時(shí)并不一定能夠得到查詢結(jié)果,如果數(shù)據(jù)庫(kù)用戶沒(méi)有相應(yīng)的訪問(wèn)權(quán)限,服務(wù)器會(huì)報(bào)出權(quán)限不足的錯(cuò)誤給應(yīng)用程序,在稍大的項(xiàng)目中,往往一個(gè)項(xiàng)目里面會(huì)包含好幾個(gè)數(shù)據(jù)庫(kù)連接串,這些數(shù)據(jù)庫(kù)用戶具有不同的權(quán)限,有的是只讀權(quán)限,有的是只寫權(quán)限,有的是可讀可寫,根據(jù)不同的操作選取不同的用戶來(lái)執(zhí)行,稍微不注意,無(wú)論你的SQL語(yǔ)句寫的多么完善,完美無(wú)缺都沒(méi)用幕庐。
6:解析的最后一步,就是確定最終的執(zhí)行計(jì)劃久锥。當(dāng)語(yǔ)法,語(yǔ)義,權(quán)限都驗(yàn)證后,服務(wù)器并不會(huì)馬上給你返回結(jié)果,而是會(huì)針對(duì)你的SQL進(jìn)行優(yōu)化,選擇不同的查詢算法以最高效的形式返回給應(yīng)用程序。例如在做表聯(lián)合查詢時(shí),服務(wù)器會(huì)根據(jù)開(kāi)銷成本來(lái)最終決定采用hash join,merge join ,還是loop join,采用哪一個(gè)索引會(huì)更高效等等,不過(guò)它的自動(dòng)化優(yōu)化是有限的,要想寫出高效的查詢SQL還是要優(yōu)化自己的SQL查詢語(yǔ)句异剥。
當(dāng)確定好執(zhí)行計(jì)劃后,就會(huì)把這個(gè)執(zhí)行計(jì)劃保存到SQL計(jì)劃緩存中,下次在有相同的執(zhí)行請(qǐng)求時(shí),就直接從計(jì)劃緩存中取,避免重新編譯執(zhí)行計(jì)劃瑟由。
第三步:語(yǔ)句執(zhí)行。
服務(wù)器對(duì)SQL語(yǔ)句解析完成后,服務(wù)器才會(huì)知道這條語(yǔ)句到底表態(tài)了什么意思,接下來(lái)才會(huì)真正的執(zhí)行SQL語(yǔ)句冤寿。
此時(shí)分兩種情況:
1):如果查詢語(yǔ)句所包含的數(shù)據(jù)行已經(jīng)讀取到數(shù)據(jù)緩沖存儲(chǔ)區(qū)的話,服務(wù)器會(huì)直接從數(shù)據(jù)緩沖存儲(chǔ)區(qū)中讀取數(shù)據(jù)返回給應(yīng)用程序,避免了從物理文件中讀取,提高查詢速度歹苦。
2):如果數(shù)據(jù)行沒(méi)有在數(shù)據(jù)緩沖存儲(chǔ)區(qū)中,則會(huì)從物理文件中讀取記錄返回給應(yīng)用程序,同時(shí)把數(shù)據(jù)行寫入數(shù)據(jù)緩沖存儲(chǔ)區(qū)中,供下次使用青伤。
說(shuō)明:SQL緩存分好幾種,這里有興趣的朋友可以去搜索一下,有時(shí)因?yàn)榫彺娴拇嬖?使得我們很難馬上看出優(yōu)化的結(jié)果,因?yàn)榈诙螆?zhí)行因?yàn)橛芯彺娴拇嬖?會(huì)特別快速,所以一般都是先消除緩存,然后比較優(yōu)化前后的性能表現(xiàn),這里有幾個(gè)常用的方法:
DBCC DROPCLEANBUFFERS
從緩沖池中刪除所有清除緩沖區(qū)。
DBCC FREEPROCCACHE
從過(guò)程緩存中刪除所有元素殴瘦。
DBCC FREESYSTEMCACHE
從所有緩存中釋放所有未使用的緩存條目狠角。SQL Server 2005 數(shù)據(jù)庫(kù)引擎會(huì)事先在后臺(tái)清理未使用的緩存條目,以使內(nèi)存可用于當(dāng)前條目蚪腋。但是丰歌,可以使用此命令從所有緩存中手動(dòng)刪除未使用的條目。
這只能基本消除SQL緩存的影響,目前好像沒(méi)有完全消除緩存的方案,如果大家有,請(qǐng)指教屉凯。
執(zhí)行順序:
- FROM 子句返回初始結(jié)果集立帖。
- WHERE 子句排除不滿足搜索條件的行。
- GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個(gè)唯一值的組中悠砚。
- 選擇列表中指定的聚合函數(shù)可以計(jì)算各組的匯總值晓勇。
- 此外,HAVING 子句排除不滿足搜索條件的行灌旧。
- 計(jì)算所有的表達(dá)式宵蕉;
- 使用order by對(duì)結(jié)果集進(jìn)行排序。
8.查找你要搜索的字段节榜。
二 oracle 共享原理
ORACLE將執(zhí)行過(guò)的SQL語(yǔ)句存放在內(nèi)存的共享池(shared buffer pool)中,可以被所有的數(shù)據(jù)庫(kù)用戶共享
當(dāng)你執(zhí)行一個(gè)SQL語(yǔ)句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前的執(zhí)行過(guò)的語(yǔ)句完全相同, ORACLE就能很快獲得已經(jīng)被解析的語(yǔ)句以及最好的 執(zhí)行路徑. 這個(gè)功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用
三 oracle 語(yǔ)句提高查詢效率的方法
.1:.. where column in(select * from ... where ...);
2:... where exists (select 'X' from ...where ...);
第二種格式要遠(yuǎn)比第一種格式的效率高别智。在Oracle中可以幾乎將所有的IN操作符子查詢改寫為使用EXISTS的子查詢
使用EXIST宗苍,Oracle系統(tǒng)會(huì)首先檢查主查詢,然后運(yùn)行子查詢直到它找到第一個(gè)匹配項(xiàng)薄榛,這就節(jié)省了時(shí)間
Oracle系統(tǒng)在執(zhí)行IN子查詢時(shí)讳窟,首先執(zhí)行子查詢,并將獲得的結(jié)果列表存放在在一個(gè)加了索引的臨時(shí)表中
避免使用having字句
避免使用HAVING子句, HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾. 這個(gè)處理需要排序,總計(jì)等操作. 如果能通過(guò)WHERE子句限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷
Shared locks (S) 共享鎖
Update locks (U): 更新鎖是共享鎖和獨(dú)占鎖的組合.用UPDLOCK保持更新鎖
Exclusive locks (X): 獨(dú)占鎖是為了鎖定數(shù)據(jù)被一個(gè)session修改的數(shù)據(jù), 而不能夠被另外的session修改. 只能指定NOLOCK來(lái)讀取.
Intent locks (I): 意向鎖用于建立鎖的層次結(jié)構(gòu). 意向鎖包含三種類型:意向共享 (IS)敞恋、意向排他 (IX) 和意向排他共享 (SIX)丽啡。
數(shù)據(jù)庫(kù)引擎使用意向鎖來(lái)保護(hù)共享鎖S 鎖)或排他鎖X 鎖)放置在鎖層次結(jié)構(gòu)的底層資源上。 意向鎖之所以命名為意向鎖硬猫,是因?yàn)樵谳^低級(jí)別鎖前可獲取它們补箍,因此會(huì)通知意向?qū)㈡i放置在較低級(jí)別上。
意向鎖有兩種用途:
防止其他事務(wù)以會(huì)使較低級(jí)別的鎖無(wú)效的方式修改較高級(jí)別資源啸蜜。
提高數(shù)據(jù)庫(kù)引擎在較高的粒度級(jí)別檢測(cè)鎖沖突的效率坑雅。
Schema locks (Sch): 架構(gòu)鎖
Schema stability lock(Sch-S): 保持架構(gòu)穩(wěn)定性,用在生成執(zhí)行計(jì)劃時(shí),不會(huì)阻止對(duì)數(shù)據(jù)的訪問(wèn).
Schema modification lock (Sch-M):用在DDL操作時(shí).當(dāng)架構(gòu)正在被改變時(shí), 阻止對(duì)對(duì)象數(shù)據(jù)的訪問(wèn).
Bulk Update locks (BU):
數(shù)據(jù)庫(kù)引擎在將數(shù)據(jù)大容量復(fù)制到表中時(shí)使用了大容量更新 (BU) 鎖, 并指定了 TABLOCK 提示或使用 sp_tableoption 設(shè)置了 table lock on bulk load 表選項(xiàng). 大容量更新鎖BU 鎖)允許多個(gè)線程將數(shù)據(jù)并發(fā)地大容量加載到同一表, 同時(shí)防止其他不進(jìn)行大容量加載數(shù)據(jù)的進(jìn)程訪問(wèn)該表.
Key - Range locks
在使用可序列化事務(wù)隔離級(jí)別時(shí), 對(duì)于 Transact-SQL 語(yǔ)句讀取的記錄集, 鍵范圍鎖可以隱式保護(hù)該記錄集中包含的行范圍. 鍵范圍鎖可防止幻讀. 通過(guò)保護(hù)行之間鍵的范圍, 它還防止對(duì)事務(wù)訪問(wèn)的記錄集進(jìn)行幻像插入或刪除.
Microsoft SQL Server 數(shù)據(jù)庫(kù)引擎死鎖監(jiān)視器定期檢查陷入死鎖的任務(wù)。 如果監(jiān)視器檢測(cè)到循環(huán)依賴關(guān)系衬横,將選擇其中一個(gè)任務(wù)作為犧牲品裹粤,然后終止其事務(wù)并提示錯(cuò)誤。 這樣蜂林,其他任務(wù)就可以完成其事務(wù)遥诉。 對(duì)于事務(wù)以錯(cuò)誤終止的應(yīng)用程序拇泣,它還可以重試該事務(wù),但通常要等到與它一起陷入死鎖的其他事務(wù)完成后執(zhí)行矮锈。
鎖由數(shù)據(jù)庫(kù)引擎的一個(gè)部件稱為“鎖管理器”)在內(nèi)部管理. 當(dāng)數(shù)據(jù)庫(kù)引擎實(shí)例處理Transact-SQL 語(yǔ)句時(shí), 數(shù)據(jù)庫(kù)引擎查詢處理器會(huì)決定將要訪問(wèn)哪些資源. 查詢處理器根據(jù)訪問(wèn)類型和事務(wù)隔離級(jí)別設(shè)置來(lái)確定保護(hù)每一資源所需的鎖的類型. 然后, 查詢處理器將向鎖管理器請(qǐng)求適當(dāng)?shù)逆i. 如果與其他事務(wù)所持有的鎖不會(huì)發(fā)生沖突, 鎖管理器將授予該鎖.
不使用select * 可以:
1)不用去解析數(shù)據(jù)字典中的相應(yīng)字段霉翔。
2)減少不必要的網(wǎng)絡(luò)流量。
3)防止應(yīng)用上引用愕难,導(dǎo)致后續(xù)如果添加字段可能問(wèn)題出現(xiàn)早龟。
如果列名包含了所有的列那么和SELECT * 沒(méi)有區(qū)別。
如果只有部分列猫缭,那就僅僅SELECT你所需要的葱弟,比SELECT * 效率高,特別是有時(shí)候這些列可以直接來(lái)自索引猜丹。
列存儲(chǔ)是不定長(zhǎng)的芝加,ORACLE讀到塊之后必須算出每個(gè)列的偏移,然后去取列數(shù)據(jù)射窒,每行都要算藏杖。越靠后的列這個(gè)計(jì)算開(kāi)銷越大。SELECT的列越多這個(gè)開(kāi)銷越大脉顿。
首先我們要分析清楚select *和select a1,a2,a3的區(qū)別蝌麸。
首先sql server是按照數(shù)據(jù)塊來(lái)存取數(shù)據(jù)的,一個(gè)數(shù)據(jù)塊是8K艾疟,當(dāng)你需要的數(shù)據(jù)在某個(gè)數(shù)據(jù)塊上時(shí)来吩,sql server會(huì)將整個(gè)8K的數(shù)據(jù)從磁盤上加載到內(nèi)存中,而不僅僅是讀取你需要的a1蔽莱、a2這幾個(gè)字段弟疆,從這種意義上來(lái)說(shuō),select *和select a1,a2,a3這種寫法速度是一樣的盗冷。
但是有一個(gè)問(wèn)題在于有索引怠苔,當(dāng)有索引的時(shí)候就不一樣了,比如a1, a2, a3都在索引字段里面(包括inclue)仪糖,這個(gè)時(shí)候如果select a1, a2,a3的話只要掃描索引就好了柑司,而select *卻要掃描表,通常這種情況下select a1, a2, a3要快一些锅劝。但是如果只有a1, a2在索引中帜羊,而a3不在索引中,那么select a1, a2, a3的時(shí)候就需要先掃描索引得到a1, a2鸠天,再通過(guò)索引找到表中對(duì)應(yīng)的數(shù)據(jù)塊取出來(lái)a3(注意取a3的時(shí)候是8K數(shù)據(jù)塊一起取得)讼育,這時(shí)你會(huì)發(fā)現(xiàn)select a1, a2, a3又沒(méi)什么優(yōu)勢(shì)了。當(dāng)取得數(shù)據(jù)特別多的時(shí)候,掃描索引再去查找表奶段,反而不如直接掃描表來(lái)的快饥瓷,所以有時(shí)可能select *反而快。
所以要具體問(wèn)題具體分析痹籍,具體的要看查詢計(jì)劃呢铆,確定問(wèn)題所在。
數(shù)據(jù)最小單位是頁(yè) (也就是你所說(shuō)的塊)大小8K左右 另外聚集索引掃描與表掃描在IO開(kāi)銷與執(zhí)行時(shí)間上差距非常小 可以忽略不計(jì)蹲缠,索引查找與表掃描差距才是最大的棺克,索引查找只需要選擇性的找描部分?jǐn)?shù)據(jù)頁(yè)。
另外聚集索引數(shù)據(jù)直接存在葉子節(jié)點(diǎn)线定,而非聚集索引只是存指向數(shù)據(jù)的指針娜谊。你說(shuō)的第二種情況屬于書簽查找,原理正如你所說(shuō)斤讥!
到底是select * 快還是select a1,a2 與索引確實(shí)有系纱皆,生成的執(zhí)行計(jì)劃不同執(zhí)行時(shí)間也會(huì)不同,當(dāng)然返回所有列與返回選定列 拋開(kāi)索引的影響芭商,肯定是列越少IO的開(kāi)銷就越小速度也就越快
SQL SERVER復(fù)制技術(shù)類型有三種派草,分別是:快照復(fù)制、事務(wù)復(fù)制铛楣、合并復(fù)制近迁。
SQL SERVER 服務(wù)器于客戶端的交互主要依靠Open Data Services(簡(jiǎn)稱ODS)組件,中文名 “開(kāi)放數(shù)據(jù)服務(wù)”簸州。在《SQL SERVER 2000技術(shù)內(nèi)幕》中钳踊,譯者將Open Data Services 翻譯為“開(kāi)放式數(shù)據(jù)服務(wù)”,但是這里的OPEN應(yīng)該意味著“把數(shù)據(jù)開(kāi)放”勿侯,“開(kāi)放式”有一點(diǎn)不準(zhǔn)確,聯(lián)系上下文來(lái)看的話缴罗,無(wú)傷大雅助琐。
ODS組件主要負(fù)責(zé)監(jiān)聽(tīng)新的連接,清理失敗的連接面氓,以及將關(guān)系引擎返回的數(shù)據(jù)集兵钮、消息和狀態(tài)值等信息返回給客戶端。ODS組件可以響應(yīng)一下三種事件:連接事件舌界、語(yǔ)言事件掘譬、以及遠(yuǎn)程存儲(chǔ)過(guò)程事件。也就是說(shuō)呻拌,當(dāng)我們打開(kāi)查詢分析器葱轩,填好SQL服務(wù)器名稱,用戶名和密碼點(diǎn)擊確定后,SQL服務(wù)器的ODS將觸發(fā)連接事件進(jìn)行安全性檢查靴拱。如果安全性檢查能夠通過(guò)垃喊,ODS組件將準(zhǔn)許建立連接,其具體的操作就是將在服務(wù)器端為客戶端分配兩個(gè)輸入緩沖區(qū)(讀緩沖區(qū))和一個(gè)輸出緩沖區(qū)(寫緩沖區(qū))袜炕。其中本谜,寫緩沖區(qū)用于存儲(chǔ)關(guān)系引擎返回的數(shù)據(jù)集,當(dāng)寫緩沖被填滿(達(dá)到4096個(gè)字節(jié))或者數(shù)據(jù)集SQL語(yǔ)句已經(jīng)執(zhí)行完畢以后偎窘,寫緩沖中的數(shù)據(jù)將被封裝成一個(gè)TDS包(TDS將在后面詳述)通過(guò)NET-LIB返回給客戶端乌助。ODS維護(hù)著與客戶端的連接,當(dāng)客戶端斷開(kāi)連接或者意外斷網(wǎng)的時(shí)候陌知,ODS將負(fù)責(zé)回收資源他托,釋放為客戶端而保持的鎖等資源。
這里有一個(gè)性能相關(guān)的問(wèn)題大家要注意一下纵诞。當(dāng)關(guān)系引擎源源不斷地將得到的數(shù)據(jù)集寫入輸出緩沖區(qū)時(shí)上祈,當(dāng)輸出緩沖區(qū)被填滿而數(shù)據(jù)集仍然沒(méi)有返回完畢時(shí),輸入緩沖區(qū)內(nèi)的數(shù)據(jù)將被源源不斷地發(fā)送到SQL客戶端浙芙,在這期間登刺,為該SQL客戶端而分配的排它鎖等資源將一直保持,直到關(guān)系引擎返回?cái)?shù)據(jù)集完畢嗡呼。這也意味著纸俭,當(dāng)客戶端與服務(wù)器端之間的網(wǎng)速慢得傳輸數(shù)據(jù)出現(xiàn)較大延遲,客戶端來(lái)不及讀取返回?cái)?shù)據(jù)時(shí)南窗,鎖將會(huì)保留揍很,甚至掃描也將被懸掛,那樣SQL服務(wù)器將或多或少受到影響万伤。
TDS的全稱叫Tabular Data Stream窒悔,中文名叫表格數(shù)據(jù)流。它是SQL 客戶端與服務(wù)器端用來(lái)通信的專用協(xié)議敌买。它包含了描述列名稱简珠、數(shù)據(jù)類型、命令(比如中途取消)虹钮、各種客戶端與服務(wù)器“協(xié)商”的令牌(就好像IP數(shù)據(jù)包中包含擁塞控制信息一樣)等信息
對(duì)于數(shù)據(jù)量比較大的表其實(shí)不是很建議對(duì)大表排序或者對(duì)大表的某個(gè)重復(fù)次數(shù)多的字段去重運(yùn)算聋庵。所以我們這里可以對(duì)ShipCity進(jìn)行優(yōu)化一下≤搅唬可以對(duì)ShipCity創(chuàng)建一個(gè)非聚集索引祭玉。
CREATE INDEX Index_ShipCity On Orders(ShipCity desc)
go
ShipCountry和CustomerID的分組查詢看上去很類似,但是為什么執(zhí)行計(jì)劃會(huì)不同呢春畔?這是因?yàn)镾hipCountry包含了大量的重復(fù)值脱货,CustomerID重復(fù)值非常少岛都,所以Sql server系統(tǒng)給ShipCountry推送的哈希聚合,而CustomerID推送的是流聚合。也就是說(shuō)Sql server系統(tǒng)會(huì)動(dòng)態(tài)的根據(jù)查詢的情況選擇合適的聚合方式。所以我們?cè)谧鯯QL優(yōu)化的時(shí)候不能僅根據(jù)SQL語(yǔ)句來(lái)優(yōu)化甫窟,還得結(jié)合具體數(shù)據(jù)分布的環(huán)境费坊。
運(yùn)算過(guò)程監(jiān)控指標(biāo)
4.1.監(jiān)控元素:
可視化查看運(yùn)行時(shí)間
T-sql語(yǔ)句查詢時(shí)間
占用內(nèi)存
T-sql語(yǔ)句查詢IO