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

我不确定问题是什么,但您的查询可以使用一些重构。这条线看起来也不需要,"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;

要查看的另一件事是将索引放在所有连接列上。

希望这可以帮助。

于 2012-12-15T06:53:51.627 回答
0

我发现通过自由文本字段连接两个表会占用大量资源和时间。此外,这些字段传统上无论如何都不会被索引。

尝试查看是否有任何值得使用的索引或其他连接。

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 回答