如何解决sql查询中的性能问题?

如何解决sql查询中的性能问题?,sql,sql-server,tsql,Sql,Sql Server,Tsql,所有开发人员都知道,IN和DISTINCT为所有sql查询创建问题。我的同事创建了下面的查询,但现在他不在我的雇佣公司工作。请查看下面的代码。如何调整查询以获得高性能 SELECT xxx , COUNT(DISTINCT Id) Count FROM Test (NOLOCK) WHERE IsDeleted = 0 AND xxx IN ( SELECT CAST(value AS INT)

所有开发人员都知道,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
所有开发人员都知道,IN和DISTINCT为所有sql查询创建问题

这不一定是真的。它们确实会影响性能,但有时是必要的

这可能没什么大不了的。它会被评估一次。如果您有另一种方法来传递列表,比如使用临时表,那就更好了

CountID可疑。我希望id已经是唯一的了。如果是这样,那么只需使用COUNT*


除非您真的知道自己在做什么,否则不建议使用NOLOCK。处理可能不一致的数据是危险的。

我使用Sentry One Plan Explorer来帮助找到我遇到性能问题的查询的调整点:

首先,您需要确定在您的环境中有什么好的性能,然后找到查询中最差的部分并首先对其进行优化

最后,考虑如何存储数据,查找有必要添加索引的位置。 最好是为XXX列创建索引


所有开发人员都知道,对于所有添加的sql查询,在和DISTINCT create问题中,这是一个相当宽泛的语句。你的问题也是如此。也许从查看查询计划开始吧?所有开发人员都知道,在所有sql查询的不同创建问题中,该语句是错误的;您刚刚发现一位开发人员不同意该语句。可能您的查询速度慢的原因是IsDeleted或xxx未包含在索引中,因此数据引擎必须扫描整个表。是时候查看执行计划了。请发布架构和示例数据,并进行解释。否则,我们只是猜测。。。