以文本方式查看主題 - 昂捷論壇 (http://www.26035.net/bbs/index.asp) -- □-技術研討會 (http://www.26035.net/bbs/list.asp?boardid=36) ---- 如何讓你的報表(查詢)運行速度更快 (http://www.26035.net/bbs/dispbbs.asp?boardid=36&id=7980) |
-- 作者:ssp -- 發(fā)布時間:2011/5/15 17:16:44 -- 如何讓你的報表(查詢)運行速度更快 現(xiàn)在數(shù)據(jù)庫服務器的配置都很高,雖然通過大內存、RAID技術解決了磁盤IO的瓶頸,但對于我們業(yè)務系統(tǒng)長期運行產(chǎn)生的海量數(shù)據(jù)來說對查詢優(yōu)化也是十分重要的。下面介紹幾種優(yōu)化方法: 1、數(shù)據(jù)轉儲和分區(qū)表:前者查詢起來麻煩,需要union兩個以上的表,轉儲時用刪除原表、插入歷史表的方法,可減少生產(chǎn)服務器的存儲空間(數(shù)量少查詢就快),用于處理極不常用的歷史數(shù)據(jù);使用分區(qū)表時需要在查詢時指定分區(qū)表名,操作起來不靈活,但清除歷史數(shù)據(jù)的速度比較快,可以把一個分區(qū)表數(shù)據(jù)刪除,非常適合銷售流水之類的數(shù)據(jù)。 2、在同樣情況下表多次掃描慢于一次描,所以用exists、not exists代替in、not in,來減少掃描次數(shù),并在寫關聯(lián)條件時盡量用索引字段。 3、join 快于left join 快于 full join。 4、在寫查詢時用“sp_help 表名”看下這個表有幾個索引,哪個索引最適合你,盡量把索引的第一個字段作為查詢的第一個條件,第二個字段作為查詢的第二個條件等。不要在索引字段上加函數(shù),如:datediff(day,c_date,@日期)=0,如果c_date是這個表的索引字段,那么數(shù)據(jù)庫引擎不會選擇這個索引,可以改成這樣c_date>=@日期 and c_date<dateadd(day,1,@日期),得出的結果是一樣的,但效率會差幾十倍(取決于數(shù)據(jù)量,越大越明顯),為什么會慢呢? 即使c_date不是索引字段這兩個查詢速度也是有區(qū)別的,加函數(shù)以后要經(jīng)過幾次運算才可以比較,不加函數(shù),就是日期和日期的直接比較。 5、數(shù)值型的條件的常量不要加引號,這樣有可能數(shù)值型的字段會被轉成字符型,如數(shù)值型的字段c_id=123456,最好不要寫成c_id=\'123456\' 6、全索引掃描慢于部分索引掃描,所以LIKE條件中的%_盡量放在最后面。 7、學會看查詢計劃,看下查詢的哪個部分效率低,有沒有優(yōu)化的可能。 8、采用高轉大容量大緩存的SAS盤、高緩存高速的RAID卡、多通道的高容量高速的內存。盡量使用64位系統(tǒng),64位系統(tǒng)字長比32位大一倍,還可以使用超大內存。32位系統(tǒng)要開啟pae啟動參數(shù),sql用awe分配內存,這樣才能使用大內存,減少磁盤的IO。
|