1

我有一个相对简单的查询,通常需要不超过 10 秒才能返回。如下:

SELECT personid 
FROM vw_has_copyright 
WHERE (Orderid IN (SELECT orderid 
                   FROM orders WHERE eventid = 1234)) 
GROUP BY personid 
ORDER BY personid

现在它只是在我运行这个查询时挂起。如果我运行select orders.orderid from orders where orders.eventid = 1234- 然后使用从此查询生成的列表,select personid from vw_has_copyright where Orderid in (*my list here...*)它工作正常。

那么为什么它不再使用嵌套选择查询呢?看起来很奇怪,但我不确定如何调试它?提前致谢!!

- -编辑 - -

相当尴尬的是,问题在于我没有正确维护我的索引。由于我的订单表索引上的高度碎片化,查询突然停止工作,但是在重建和重组它们之后,查询现在又可以工作了!故事的寓意 - 照顾你的数据库!

4

3 回答 3

1

IN非常棘手,特别是在通常有大量记录的订单表上。我建议将其更改为 EXISTS 甚至是常规加入。

是一个很好的链接,解释了这三个操作数之间的区别

于 2012-05-09T09:47:38.443 回答
0

尝试这样的事情

SELECT CopyRight.personid 
FROM vw_has_copyright CopyRight
     Inner Join orders order on order.orderid = CopyRight.Orderid
WHERE  order.eventid = 1234
GROUP BY CopyRight.personid 
ORDER BY CopyRight.personid
于 2012-05-09T09:50:17.317 回答
0

您应该定期执行索引维护和统计更新,以确保查询始终如一地执行。

检查执行计划以查看 SQL Server 是否在执行任何意外(表扫描与索引查找)也很重要。

于 2012-05-09T10:23:11.170 回答