简单的SQL嵌套选择查询不再有效

时间:2012-05-09 09:39:46

标签: sql sql-server-2008 view nested

我有一个相对简单的查询,返回通常不会超过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...*)一起运行正常。

那么为什么它不再使用嵌套的选择查询?看起来很奇怪,但我不确定如何进行调试呢?在此先感谢!!

--- --- EDIT

相当令人尴尬的是,问题是我没有正确维护我的索引。由于我的订单表索引的高度碎片,查询突然停止工作,但是在重建和重新组织后,查询现在再次起作用!故事的道德 - 照顾你的数据库!!

3 个答案:

答案 0 :(得分:1)

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

Here是一个非常好的链接,解释了这3个操作数之间的区别

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

答案 2 :(得分:0)

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

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