2015-10-18 35 views
1

我有以下查詢如何修改要sargable- SQL

update r 
    set Comp = t.Comp 
from [QlikDataWarehouse].[dbo].[Vente]r 
inner join 
    [QlikDataWarehouse].[dbo].[Budget] t 
    on t.[Code Site] = r.[Code Site] and 
     t.[Code Rayon] = substring(r.[Code Structure],1,4) and 
     t.[Date Time] = convert(date,r.[Date Time]) 
where r.[Date Time] >= '2015-01-01 00:0:00.000'; 

nmber預算的行約爲80萬和周圍350個+百萬行VENTE。我創建索引vente([Date Time], [Code Site], [Code Structure])Budget([Code Site], [Code Rayon], Date Time])。但查詢需要數天時間。

t.[Code Rayon]是一個int類型 t.[Date Time]是一個日期型 r.[Date Time]爲datetime型 有沒有一種方法,使條款在優化搜索?

任何幫助將是最感激。

+0

您是否嘗試過使用查詢計劃來查看性能命中的位置,希望能夠識別正在發生的大型表掃描? – Lima

+0

什麼是查詢計劃?兩個表中總共有多少行?代碼網站+核心人造絲+日期時間是否獨一無二? –

+0

壞消息。我認爲沒有重構的方式.. –

回答

0

如果您希望這是可排隊的,那麼在它們上添加計算列和索引。

. . . 
from [QlikDataWarehouse].[dbo].[Vente] r inner join 
    [QlikDataWarehouse].[dbo].[Budget] t 
    on t.[Code Site] = r.[Code Site] and 
     t.[Code Rayon] = substring(r.[Code Structure],1,4) and 
     t.[Date Time] = convert(date,r.[Date Time]) 
where r.[Date Time] >= '2015-01-01 00:0:00.000'; 

要處理的加入:

alter table Vente add code4 as (left([Code Structure], 4); 
alter table Vente add datecol as cast([Date Time] as date); 
create index idx_vente_4 on Vente([Code Site], code4, datecol, [Date Time]; 

而編寫查詢作爲其中的一部分:

from [QlikDataWarehouse].[dbo].[Vente] r inner join 
    [QlikDataWarehouse].[dbo].[Budget] t 
    on t.[Code Site] = r.[Code Site] and 
     t.[Code Rayon] = code4 and 
     t.[Date Time] = datecol 
where r.[Date Time] >= '2015-01-01 00:0:00.000'; 

join之前過濾數據:

alter table Vente add yyyy as (year([Date Time]) 
create index idx_vente_4 on Vente(yyyy, [Code Site], code4, datecol, [Date Time]; 

然後寫這個標準t的查詢爲:

from [QlikDataWarehouse].[dbo].[Vente] r inner join 
    [QlikDataWarehouse].[dbo].[Budget] t 
    on t.[Code Site] = r.[Code Site] and 
     t.[Code Rayon] = code4 and 
     t.[Date Time] = datecol 
where r.yyyy = 2015;