2016-11-07 62 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小时,但仍然无效。

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