【发布时间】:2017-02-14 17:52:17
【问题描述】:
下面是一个类似于我正在使用的代码的 sn-p。
DECLARE
@UserParam = NULL --optional paramater
SELECT
rtrim(item) [aKey]
INTO
#aKeyTable
FROM
myDB.dbo.fnSplit(@UserParam,',')
SELECT
/* Lots of columns, not important to the question */
FROM
myDB.dbo.tableB b
JOIN myDB.dbo.tableC c ON c.cKey = b.bKEY
AND (c.columnA IN
(
SELECT
aKey
FROM
#aKeyTable
)
OR @UserParam IS NULL)
我的问题是:如何删除子查询以提高性能。
要求:
- @UserParam 是可选的
- @UserParam 可以有多个逗号分隔的参数
- @UserParam 必须匹配 tableC 中的 columnA 或者为 NULL
- 使用 WHERE 子句也不是一种选择,它也会对性能影响太大
我使用的是 SQL Server 2014
更新:我的整个查询很长,平均需要大约 15-20 秒才能运行,具体取决于参数,但根据执行计划,这个子查询使用了 89% 的性能。我在之前的 WHERE 子句中有它,性能相当,有时更慢。
谢谢
【问题讨论】:
-
AND (c.columnA IN应该是WHERE . . .
标签: sql-server performance join subquery