如果查询在 'IN CLAUSE' 中包含很多 ID,MS SQL 服务器是否会自动创建临时文件 table

Does MS SQL Server automatically create temp table if the query contains a lot id's in 'IN CLAUSE'

我有一个大查询要通过 id 获取多行

SELECT * 
FROM TABLE 
WHERE Id in (1001..10000)

此查询运行速度非常慢,并以超时异常结束。 它的临时修复是限制查询,将此查询分成每 1000 个 ID 的 10 个部分。

我听说在这种情况下使用临时表可能会有所帮助,但看起来 ms sql 服务器会自动在下面执行此操作。

处理此类问题的最佳方法是什么?

您可以使用临时 table:

编写如下查询
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;

这将需要为 [Table] 中的每一行计算表达式 Id=1000 OR Id=1001 OR /*...*/ OR Id=10000,这可能比使用临时 table 需要更长的时间。带有临时 table 的示例在 #ids 中获取每个 Id 并使用索引在 [Table] 中查找相应的 Id

这都是假设1000到10000之间的Id是有空隙的,否则写起来会更容易

SELECT * 
FROM [TABLE]
WHERE Id BETWEEN 1001 AND 10000;

这还需要 [Table].Id 上的索引来加快速度。