SQLServer效能優化之活用臨時表

2021-09-22 05:33:51 字數 4915 閱讀 8383

繼續調優,今天上午分析了以下一條處理時間達40秒的sql語句

select *

from table 

where t_table_id in  

(select  distinct s.t_table_id 

from 

(  select distinct a.t_table_id,a.bt 

from   

(select left(bt,4) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) a,  

(select distinct left(bt,4) as bbt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) b  

where b.bbt like a.bbt and a.t_table_id<>b.t_table_id  

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

-- order by a.bt  

union all  

select distinct a.t_table_id,a.bt 

from   

(select right(bt,5) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) a,  

(select distinct right(bt,5) as bbt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0) b  

where b.bbt like a.bbt and a.t_table_id<>b.t_table_id   

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

and a.bbt not like '%'+(select right(convert(varchar(10),getdate()-1,20),2)+')') +'%'  

and b.bbt not like '%'+(select right(convert(varchar(10),getdate()-1,20),2)+')') +'%'  

) s   

)order by bt  

基本上可以認為是對同一張表的反覆操作,而且語句中夾雜了太多的全表掃瞄

sqlserver的執行計畫我個人認為圖形化介面固然是好,但是有些時候對於量化的i/o,cpu,cost輸出卻很不直觀,此外像該sql這樣的執行計畫,估計1600*1200的整個螢幕都無法顯示,可以認為基本是沒法看的

只能將sql分解成若干小sql,逐步找到瓶頸所在,例如

select left(bt,4) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

select distinct left(bt,4) as bbt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

這兩個語句的執行都非常快,並且結果集也比較小,但是兩條語句合併後並加上相關條件就非常緩慢。

乾脆直接構建兩個臨時表,反正都是全表掃瞄,用兩個臨時表做相互的join,測試之後發現只需要1秒

再構建下面的兩個sql臨時表,也做同樣的測試

最後再全部合併到一起進行測試,發現也就是2~3秒

實際上還可以再優化一些臨時表的構建,但效果達到了也就不願意嘗試了

也嘗試過用cte,不過似乎效果不佳

以下為優化後的sql樣例

/*with temp1 as

(select left(bt,4) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0),

temp2 as

(select distinct left(bt,4) as bbt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0),

te*** as

(select left(bt,5) as bbt,* from table where fsrq>getdate()-1 and gkbz=1 and scbz=0),

temp4 as

(select distinct left(bt,5) as bbt,t_table_id from table where fsrq>getdate()-1 and gkbz=1 and scbz=0)

*/print convert(varchar,getdate(),9)

select left(bt,4) as bbt,* into #temp1 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

select distinct left(bt,4) as bbt,t_table_id into #temp2 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

select right(bt,5) as bbt,* into #te*** from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

select distinct right(bt,5) as bbt,t_table_id into #temp4 from table where fsrq>getdate()-1 and gkbz=1 and scbz=0

select 

(select ms from xtclb where dm=lmxz and lb in (130,131) ) as '欄目選擇',

bt,mtly,czy 

from table 

where t_table_id in  

(select  distinct s.t_table_id 

from 

(  select distinct a.t_table_id,a.bt 

from   

#temp1 a,  

#temp2 b  

where b.bbt like a.bbt and a.t_table_id<>b.t_table_id  

and a.bbt not in ('aaaa','bbbb','cccc','dddd','eeee','ffff')

and b.bbt not in ('aaaa','bbbb','cccc','dddd','eeee','ffff')

union all  

select distinct a.t_table_id,a.bt 

from   

#te*** a,  

#temp4 b  

where b.bbt like a.bbt and a.t_table_id<>b.t_table_id   

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

and a.bbt not like '%'+(select right(convert(varchar(10),getdate()-1,20),2)+')') +'%'  

and a.bbt not like '%aaaa%' and a.bbt not like '%bbbb%' and a.bbt not like '%cccc%' 

and a.bbt not like '%dddd%' and a.bbt not like '%eeee%' and a.bbt not like '%ffff%' 

and b.bbt not like '%'+(select right(convert(varchar(10),getdate()-1,20),2)+')') +'%'  

) s   

)order by bt  

--option (loop join); 

--34

print convert(varchar,getdate(),9)   

/*drop table #temp1   

drop table #temp2

drop table #te***

drop table #temp4*/

SQL Server效能優化

一 分析階段 一般來說,在系統分析階段往往有太多需要關注的地方,系統各種功能性 可用性 可靠性 安全性需求往往吸引了我們大部分的注意力,但是,我們必須注意,效能是很重要的非功能性需求,必須根據系統的特點確定其實時性需求 響應時間的需求 硬體的配置等。最好能有各種需求的量化的指標。另一方面,在分析階段...

SQL Server 效能優化

伺服器效能優化 1.建立效能基線 2.建立監視 3.分析監視結果 1.windows工具 perfmon,tskmgr,eventmon,netmon 2.sql server 工具 事件探查器 查詢優化顧問 sql 管理器 log執行計畫 活動監視 各種report tsql 效能優化 1.目標 ...

SQLServer效能優化之查詢提示

資料庫於週日被重啟了,剛好看看優化後的效果,順便再找找新的需要優化的sql 剛好找到了類似的幾條語句,如下 select from tablea where id not in select id from tableb 從執行時間20秒 70秒不等。開始分析 首先是否用上索引,兩個id均是主鍵所以...