所有开发人员都知道,“ IN”和DISTINCT会为所有sql查询创建问题。我的同事在下面的查询中创建了一个查询,但现在他不在我受雇的公司工作。请看下面的代码。如何调整查询以提高性能?
SELECT xxx
, COUNT(DISTINCT Id) Count
FROM Test (NOLOCK)
WHERE IsDeleted = 0
AND xxx IN
(
SELECT CAST(value AS INT)
FROM STRING_SPLIT(@ProductIds, ',')
)
GROUP BY xxx
答案 0 :(得分:2)
所有开发人员都知道,“ IN”和DISTINCT会为所有sql查询创建问题。
这不一定是正确的。它们确实会影响性能,但有时它们是必需的。
IN
可能没什么大不了的。它被评估一次。如果您还有另一种传递列表的方法(例如使用临时表),那会更好。
COUNT(DISTINCT id)
可疑。我希望id
已经是唯一的。如果是这样,则只需使用COUNT(*)
。
除非您真的知道自己在做什么,否则不建议使用WITH (NOLOCK)
。处理可能不一致的数据很危险。
答案 1 :(得分:1)
我使用过Sentry One Plan Explorer来帮助查找我遇到性能问题的查询的调整点: https://www.sentryone.com/plan-explorer
首先,您需要确定环境中的良好性能,然后查找查询中最糟糕的部分并对其进行优化。
最后,考虑一下如何存储数据,寻找必要时添加索引的地方。
答案 2 :(得分:1)