如果查询在 '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
上的索引来加快速度。
我有一个大查询要通过 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
上的索引来加快速度。