我有一个很大的查询来获取id的多行
SELECT *
FROM TABLE
WHERE Id in (1001..10000)
此查询运行速度非常慢,最终会出现超时异常.
它的临时修复是查询限制,将此查询分解为每1000个ID的10个部分.
我听说在这种情况下使用临时表可能会有所帮助,但也看起来像ms sql server自动在下面执行它.
处理这类问题的最佳方法是什么?
最佳答案 您可以使用临时表如下编写查询:
CREATE TABLE #ids(Id INT NOT NULL PRIMARY KEY);
INSERT INTO #ids(Id) VALUES (1001),(1002),/*add your individual Ids here*/,(10000);
SELECT
t.*
FROM
[Table] AS t
INNER JOIN #ids AS ids ON
ids.Id=t.Id;
DROP TABLE #ids;
我的猜测是它可能比原始查询运行得更快.可以使用索引直接进行查找(如果它存在于[Table] .Id列中).
您的原始查询转换为
SELECT *
FROM [TABLE]
WHERE Id=1000 OR Id=1001 OR /*...*/ OR Id=10000;
这将需要对[表]中的每一行表达式Id = 1000或Id = 1001 OR / * … * / OR Id = 10000进行评估,这可能比临时表需要更长的时间.带有临时表的示例获取#ids中的每个Id,并使用索引在[Table]中查找相应的Id.
这一切都假设在1000和10000之间的Ids中存在间隙.否则它将更容易编写
SELECT *
FROM [TABLE]
WHERE Id BETWEEN 1001 AND 10000;
这还需要[Table]上的索引.Id可以加快速度.