我遇到的情况是,我必须动态创建 SQL 字符串,并且我正在尝试尽可能使用参数和 sp_executesql,以便我可以重用查询计划。在进行大量在线阅读和个人经验中,我发现“NOT IN”和“INNER/LEFT JOIN”在基础(最左边)表很大(150 万行,大约 50 列)时执行缓慢且昂贵)。我还读到应避免使用任何类型的函数,因为它会减慢查询速度,所以我想知道哪个更糟糕?
我过去曾使用过这种解决方法,尽管我不确定这是最好的做法,以避免在项目列表中使用“NOT IN”,例如,当我传递 3 个字符串的列表时例如,使用管道分隔符(仅在元素之间):
LEN(@param1) = LEN(REPLACE(@param1, [col], ''))
代替:
[col] NOT IN('ABD', 'RDF', 'TRM', 'HYP', 'UOE')
...想象一下字符串列表的长度为 1 到大约 80 个可能的值,并且此方法也不适合参数化。
在这个例子中,我可以使用“=”来表示 NOT IN,并且我会使用传统的列表技术来表示 IN,或者 !=(如果这样更快的话),尽管我对此表示怀疑。这比使用 NOT IN 更快吗?
作为可能的第三种选择,如果我知道所有其他可能性(IN 可能性,列表可能长 80-95 倍)并通过它们,会怎样?这将在应用程序的业务层中完成,以减轻 SQL Server 的工作负载。对于查询计划重用来说,这不是一个很好的可能性,但如果它可以让一个大的令人讨厌的查询减少一两秒,那为什么不呢?
我还擅长 SQL CLR 函数创建。既然上面是字符串操作,那么 CLR 函数是最好的吗?
想法?
预先感谢您提供的任何和所有帮助/建议/等。