我有一个相对简单的查询,返回通常不会超过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
相当令人尴尬的是,问题是我没有正确维护我的索引。由于我的订单表索引的高度碎片,查询突然停止工作,但是在重建和重新组织后,查询现在再次起作用!故事的道德 - 照顾你的数据库!!
答案 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是否正在执行任何意外操作(表扫描与索引搜索)也很重要。