sql-server – 如果查询在’IN CLAUSE’中包含批次ID,MS SQL Server是否会自动创建临时表

我有一个很大的查询来获取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可以加快速度.

点赞