2016-11-07 58 views
0

我有一個查詢,如下所示:查詢速度慢,即使加盟條件列在SQL Server中有索引

select distinct 
    b.INSTANCE_ID, b.itemnumber, 
    isnull((a.ITEM_REV + ' ' + a.ITEM_CN), 'Introductory') itemrev, 
    b.bom_itemnumber, b.bom_rev 
into 
    parts_bom_stg2 
from 
    PARTS_BOMD a 
inner join 
    parts_bom_stg b on a.ITEM_NUMBER = b.itemnumber 
        and b.itemrev = a.ITEM_REV; 

其估計的執行計劃是:

enter image description here

指標上兩個表的item_number和item_rev列。

我不能在查詢中消除不同。我猜它由於這個不同而滯後。有誰知道我可以如何優化它。兩張表都有近500萬行。

Parts_BOMD的表結構:

結構 Parts_bom_stg
CREATE TABLE [dbo].[PARTS_BOMD] 
(
    [BOM_ID] [varchar](4000) NULL, 
    [ITEM_REV] [varchar](80) NULL, 
    [ITEM_CN] [varchar](4000) NULL, 
    [ITEM_NUMBER] [varchar](80) NULL, 
    [ITEMNUMBER] [varchar](4000) NULL, 
    [FINDNUM] [varchar](4000) NULL, 
    [QTY] [varchar](4000) NULL, 
    [ITEMDESCRIPTION] [varchar](4000) NULL, 
    [ITEMREV] [varchar](4000) NULL, 
    [itemSize] [varchar](4000) NULL, 
    [REFDES] [varchar](4000) NULL, 
    [BOMText02] [varchar](4000) NULL, 
    [itemList21] [varchar](4000) NULL, 
    [SUMMARYCOMPLIANCE] [varchar](4000) NULL, 
    [BOMMULTITEXT30] [varchar](4000) NULL, 
    [BOMNotes] [varchar](4000) NULL, 
    [itemList10] [varchar](4000) NULL, 
    [BOMList01] [varchar](4000) NULL, 
    [BOMList03] [varchar](4000) NULL, 
    [BOMList02] [varchar](4000) NULL, 
    [itemText22] [varchar](4000) NULL, 
    [itemText23] [varchar](4000) NULL, 
    [itemLifecyclePhase] [varchar](4000) NULL, 
    [ITEMP2MULTILIST05] [varchar](4000) NULL, 
    [itemText15] [varchar](4000) NULL, 
    [RNUM] [varchar](4000) NULL 
) 

CREATE TABLE [dbo].[parts_bom_stg] 
(
    [INSTANCE_ID] [bigint] NOT NULL, 
    [itemnumber] [varchar](80) NULL, 
    [itemrev] [varchar](80) NULL, 
    [bom_itemnumber] [varchar](max) NULL, 
    [bom_rev] [varchar](500) NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
+0

向我們展示您的**表格結構!** –

+0

編輯的問題 –

+3

爲什麼一切'[varchar](4000)'?桌上有什麼索引? –

回答

1

,如果你不能改變表結構或數據類型,然後ATLEAST 解釋爲什麼你不能溝明顯。 什麼是你有沒有明顯的投入,那麼它將是明確的。 爲什麼你會從表格中選擇所有行,你將顯示哪些地方?

爲什麼不使用分頁?

另外ITEM_NUMBER和itemrev在這兩個表中都是可以爲空的,所以你可以在where子句中加入額外的條件。

「ITEM_NUMBER地方不是null itemrev不爲空」

如果can'd做這做那,那麼你可以重新寫你的查詢,並給予一試。

--create table parts_bom_stg2() 
insert into parts_bom_stg2 
select 
    b.INSTANCE_ID, b.itemnumber, 
    isnull((a.ITEM_REV + ' ' + a.ITEM_CN), 'Introductory') itemrev, 
    b.bom_itemnumber, b.bom_rev 
from 
    PARTS_BOMD a 
inner join 
    parts_bom_stg b on a.ITEM_NUMBER = b.itemnumber 
and b.itemrev = a.ITEM_REV 
where not exists(select INSTANCE_ID from parts_bom_stg2 c 
where c.INSTANCE_ID=b.INSTANCE_ID and b.itemnumber=c.itemnumber [write the where condition properly here]) 
+0

沒有不同我得到重複的記錄。雖然這些列是可以空的,但他們總是有數據。我想創建具有重複記錄的parts_bom_stg2,然後刪除重複項。它的創建工作正在進行中,因此我無法確定刪除重複記錄的查詢是否具有相同的執行時間。 –

+0

爲什麼你不能使用分頁? – KumarHarsh

+0

我會試試看。 –

0

那麼這就是我所做的。這是一個壞方法,但它確實解決了我的問題:

declare @sql3 varchar(1000) 
declare @sql4 varchar(1000) 
declare @sql5 varchar(1000) 
begin 

DECLARE drop_constraint CURSOR FOR 
select distinct itemnumber, itemrev from parts_bom_stg 
--print @sql3 

OPEN drop_constraint 
FETCH NEXT FROM drop_constraint INTO @sql3,@sql5 

WHILE @@FETCH_STATUS = 0   
BEGIN  

insert into parts_bom_stg2 
select DISTINCT b.INSTANCE_ID,b.itemnumber, isnull((a.ITEM_REV + ' '+ a.ITEM_CN),'Introductory') itemrev, b.bom_itemnumber, b.bom_rev 

from PARTS_BOMD a 
inner join parts_bom_stg b 
on a.ITEM_NUMBER = b.itemnumber 
and b.itemrev = a.ITEM_REV 
where b.itemnumber = @sql3 
and b.itemrev = @sql5 

Print @sql3 + '  ' + @sql5 
FETCH NEXT FROM drop_constraint INTO @sql3,@sql5 

     -- open cursor to recreate references 
     --cursor in which references are stored  
     end 
    CLOSE drop_constraint   
DEALLOCATE drop_constraint 
end 
GO 

這花了差不多一個小時。但它比以前少了一些。查詢耗時2.5小時,但仍然無效。

謝謝大家的支持。非常感謝! :)