闲谈SQL脚本优化
摘要:
? ? ? 閑來無事,便想尋找大師級(jí)別優(yōu)化SQL腳本案例,也算是讀后留點(diǎn)筆記,摘錄內(nèi)容都會(huì)鏈接到所參考網(wǎng)址,如有冒犯,還望博主見諒;有些文章只有多動(dòng)手多動(dòng)腦才能理解其中的意思,看了需要實(shí)際操作,才不枉大師們的良苦用心;
一、正確的建立索引?[摘錄:我是如何在SQLServer中處理每天四億三千萬記錄的]
首先,我們需要明白幾個(gè)索引的要點(diǎn):
- 索引之后,按索引字段重復(fù)最少的來排序,會(huì)達(dá)到最優(yōu)的效果。以我們的表來說,如果建立了No的聚集索引,把No放在where子句的第一位是最佳的,其次是Id,然后是MgrObjId,最后是時(shí)間,時(shí)間索引如果表是一個(gè)小時(shí)的,最好不要用
- where子句的順序決定了查詢分析器是否使用索引來查詢。比如建立了MgrObjId和Id的索引,那么where MgrObjId='' and Id='' and Dtime=''就會(huì)采用索引查找,而where Dtime='' and MgrObjId='' and Id=''則不一定會(huì)采用索引查找。
- 把非索引列的結(jié)果列放在包含列中。因?yàn)槲覀儣l件是MgrObjId和Id以及Dtime,因此返回結(jié)果中只需包含Dtime和Value即可,因此把Dtime和Value放在包含列中,返回的索引結(jié)果就有這個(gè)值,不用再查物理表,可以達(dá)到最優(yōu)的速度。
如何在SQLServer中處理億萬級(jí)別的數(shù)據(jù)(歷史數(shù)據(jù)),可以按以下方面進(jìn)行:
- 去掉表的所有索引
- 用SqlBulkCopy進(jìn)行插入
- 分表或者分區(qū),減少每個(gè)表的數(shù)據(jù)總量
- 在某個(gè)表完全寫完之后再建立索引
- 正確的指定索引字段
- 把需要用到的字段放到包含索引中(在返回的索引中就包含了一切)
- 查詢的時(shí)候只返回所需的字段
二、數(shù)據(jù)查詢優(yōu)化[摘錄:記一次SQLServer的分頁優(yōu)化兼談?wù)勈褂肦ow_Number()分頁存在的問題]
- 在SQLServer中,ROW_NUMBER的分頁應(yīng)該是最高效的了,而且兼容SQLServer2005以后的數(shù)據(jù)庫
- 通過“欺騙”查詢引擎的小技巧,可以控制查詢引擎部分的優(yōu)化過程
-
ROW_NUMBER分頁在大頁數(shù)時(shí)存在性能問題,可以通過一些小技巧進(jìn)行規(guī)避
- 盡量通過cte利用索引
- 把不參與where條件的表放到分頁的cte外面
- 如果參與where條件的表過多,可以考慮把不參與分頁的表先做一個(gè)臨時(shí)表,減少IO
- 在較大頁數(shù)的時(shí)候強(qiáng)制使用hash join可以減少io,從而獲得很好的性能
-
使用with(forceseek)可以強(qiáng)制查詢因此進(jìn)行索引查詢
轉(zhuǎn)載于:https://www.cnblogs.com/xibei666/p/4238440.html
總結(jié)
- 上一篇: VC中的Unicode
- 下一篇: Java assert