【发布时间】:2014-12-29 22:48:03
【问题描述】:
我有这样的查询
SELECT NUM,
col1,
col2,
col3,
col4,
col5,
col6
FROM (SELECT NUM,
col1,
col2
FROM (SELECT a.mid AS NUM,
a.col1 AS col1,
a.col2 AS col2
FROM tbl a (nolock)
WHERE a.mid IN ( '09-404811,10-433495,10-433575,10-423789' )) AS MainQuery
UNPIVOT ( LabelValue
FOR Label IN (NUM,
col1,
col2 ) ) AS UnpvtQuery) LT
INNER JOIN #SetItemsTable tt
ON tt.col7 = LT.col1
WHERE LT.NUM IN ( '09-404811,10-433495,10-433575,10-423789' )
ORDER BY Charindex(NUM, '09-404811,10-433495,10-433575,10-423789')
这只是原始查询的表示。为 IN() 提供的值列表大约为 400+。
这个查询的问题是
ORDER BY CHARINDEX(NUM,'09-404811,10-433495,10-433575,10-423789') 需要将近 25 秒才能执行。否则查询的其余部分只需要 6 秒。
我正在使用CHARINDEX(),因为我需要与 IN() 中的值出现的顺序相同的结果。
我怎样才能有效地完成这项工作。
【问题讨论】:
-
最简单的方法是使用高效的拆分函数。它是否会比您当前的方法明显更快还有待观察......
-
LT.NUM IN ( '09-404811,10-433495,10-433575,10-423789' )无论如何都不会做你想做的事。那是错字吗?应该是LT.NUM IN ( '09-404811','10-433495','10-433575','10-423789' )。 -
@Martin 你是对的。这是一个错字。实际上我正在使用一个拆分函数,它接受一个逗号分隔的列表而不是单个字符串。
-
所以让split函数返回一个索引列以及值,改为join而不是in,并按索引排序。
-
根据骗局中的答案。
标签: sql sql-server