简单的SQL查询太长了

时间:2012-12-15 05:54:01

标签: sql oracle sql-server-2008

我只是有一个简单的查询。在SQL Server 2008上,有时查询时间太长,几乎挂起,有时不挂起。在Oracle服务器上使用相同的sql,它总是立即返回。

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;

每张表有大约100k条记录。

有人能指出我的根本原因吗?感谢

2 个答案:

答案 0 :(得分: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 :(得分: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;