資料庫於週日被重啟了,剛好看看優化後的效果,順便再找找新的需要優化的sql
剛好找到了類似的幾條語句,如下
select * from tablea where id not in (select id from tableb)
從執行時間20秒~70秒不等。
開始分析
首先是否用上索引,兩個id均是主鍵所以不存在索引問題
其次分析一下索引,發現這兩個id雖然是主鍵,但卻不是聚集索引,而且id是通過newid()生成的完全無序的,因此這兩個表在索引上可以說毫無用處,因為完全都是無序的。
換個思路,如果這兩個id都是排序的,而且記錄數也都不算少,再進行關聯是不是會很快呢?還好sqlserver提供了merge join的hint提示,試試看吧
select * from tablea where id not in (select id from tableb) option (merge join);
執行後出現以下錯誤:
訊息 8622,級別 16,狀態 1,第 1 行
由於此查詢中定義了提示,查詢處理器未能生成查詢計畫。請重新提交查詢,並且不要在查詢中指定任何提示,也不要使用 set forceplan。
查了以下相關文件,也就是說該語句不支援option (merge join);
那麼換成not exists再試一下,看看效果是否會好一些
select * from tablea where not exists(select 1 from tableb where tablea.id=tableb.id)
通過測試後,發現稍微速度提高了一點點
最後再新增上option (merge join),試試看,居然變成了0秒
select * from tablea where not exists(select 1 from tableb where tablea.id=tableb.id) option (merge join);
調優大獲成功,呵呵。
總結:不是所有相關表都一定要建索引(或者聚合索引),以後可以多試試sqlserver的查詢提示。
效能優化 找到SQL SERVER中的書籤查詢
我們在建立索引的時候,對於調節篩選列是大家都能夠注意到的。但是對於包含列檢查會被忽略。從而導致大量的lookup 也就是書籤查詢。那麼我如何才能找出某個表是不是執行了書籤查詢,執行了多少次書籤查詢呢?好訊息是,sql server 有各種各樣的動態管理檢視,其中 sys.dm db index op...
SQL Server效能優化
一 分析階段 一般來說,在系統分析階段往往有太多需要關注的地方,系統各種功能性 可用性 可靠性 安全性需求往往吸引了我們大部分的注意力,但是,我們必須注意,效能是很重要的非功能性需求,必須根據系統的特點確定其實時性需求 響應時間的需求 硬體的配置等。最好能有各種需求的量化的指標。另一方面,在分析階段...
SQL Server 效能優化
伺服器效能優化 1.建立效能基線 2.建立監視 3.分析監視結果 1.windows工具 perfmon,tskmgr,eventmon,netmon 2.sql server 工具 事件探查器 查詢優化顧問 sql 管理器 log執行計畫 活動監視 各種report tsql 效能優化 1.目標 ...