1

I just have a simple query. On SQL Server 2008, sometimes it queries too long, nearly hang, sometimes not. The same sql on Oracle server, it always return at once.

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX 
FROM VM1DTA.DESCPF D, VM1DTA.ITEMPF I 
WHERE D.DESCPFX='IT'AND D.DESCITEM=I.ITEMITEM AND I.VALIDFLAG='1' 
AND D.DESCTABL = I.ITEMTABL AND D.DESCCOY = I.ITEMCOY AND "LANGUAGE" =  'E' 
AND "VALIDFLAG" =  '1' AND DESCTABL IN('T1680') 
ORDER BY LONGDESC ASC;

Each table has about 100k records.

Could someone point me about the root cause? Thanks

4

2 に答える 2

0

フリー テキスト フィールドで 2 つのテーブルを結合すると、多くのリソースと時間がかかることがわかりました。さらに、これらのフィールドは伝統的にインデックス化されていません。

代わりに使用する価値のあるインデックスまたは他の結合があるかどうかを確認してください。

また、フィールドにはフィルターがあり、インデックスでない限り、プロセッサが 2 つを結合するために多くの作業を行うため、I.ITEMTABLフィールドへの結合は必要ありません。D.DESCTBL

別の方法は、次のように where 句でサブクエリを使用することです。

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX
FROM   VM1DTA.DESCPF D
WHERE  D.DESCPFX = 'IT'
       AND D.LANGUAGE = 'E' 
       AND D.VALIDFLAG = '1' 
       AND D.DESCTABL = 'T1680'
       AND EXISTS (SELECT NULL
                   FROM   VM1DTA.ITEMPF I
                   WHERE  I.VALIDFLAG = '1' 
                          AND I.ITEMTBL = 'T1680'
                          AND D.DESCITEM = I.ITEMITEM 
                          AND D.DESCCOY = I.ITEMCOY)
ORDER BY LONGDESC ASC;
于 2012-12-15T23:02:50.667 に答える
0

問題が何であるかはわかりませんが、クエリでリファクタリングが使用される可能性があります。この行"VALIDFLAG" = '1'もプレフィックスがないため不要に見えます。それと何か関係があるのINか​​もしれません。

SELECT D.DESCITEM, D.LONGDESC, D.DESCTABL, D.DESCCOY, D.DESCPFX 
FROM
VM1DTA.DESCPF D INNER JOIN VM1DTA.ITEMPF I ON
D.DESCITEM=I.ITEMITEM
AND
D.DESCTABL = I.ITEMTABL
AND
D.DESCCOY = I.ITEMCOY
WHERE 
D.DESCPFX='IT'
AND
"LANGUAGE" =  'E' 
AND 
I.VALIDFLAG='1' 
AND
"VALIDFLAG" =  '1' 
AND 
I.DESCTABL = 'T1680'
ORDER BY 
LONGDESC ASC;

もう 1 つの確認事項は、すべての結合列にインデックスを配置することです。

お役に立てれば。

于 2012-12-15T06:53:51.627 に答える