我只是有一个简单的查询。在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条记录。
有人能指出我的根本原因吗?感谢
答案 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;