2016-11-07 4 views
0

は、私は、クエリを持って遅いですitem_numberとitem_revの両方の表の列。クエリは次のように

私はこのクエリーで別のものを捨てることはできません。私はこの区別のために遅れがあると思う。誰も私がそれをどのように最適化できるか知っていますか?どちらの表にも500万行近くあります。テーブルParts_BOMD

表構造:

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 
) 

構造Parts_bom_stgの:あなたがテーブル構造やデータ型を変更することはできません場合は、明確な捨てることができない理由

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

が、その後少なくとも 説明。 あなたのputputとは何か区別がついているかどうかは分かりません。 なぜあなたは両方のテーブルからすべての行を選択しますか?表示する場所は?

なぜページングを使用しないのですか?

また、ITEM_NUMBERとitemrevは両方のテーブルでnullableです。したがって、where句に余分な条件を入れることができます。 「ITEM_NUMBERがnullでなく、itemrevがnullではない」

あなたはこれとそれを行う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

別名がなければ、重複したレコードを取得します。これらの列はNULL値ですが、常にその列にデータがあります。重複したレコードで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 

これは約1時間かかりました。しかしそれは以前よりもずっと少なかった。クエリには2.5時間かかりましたが、まだ動作しませんでした。

ご協力いただきありがとうございます。本当に感謝! :)

関連する問題