Sql server 如果查询包含批次id';s在';在第'条中;
我有一个大的查询,可以通过id获取多行,比如Sql server 如果查询包含批次id';s在';在第'条中;,sql-server,azure-sql-database,Sql Server,Azure Sql Database,我有一个大的查询,可以通过id获取多行,比如 SELECT * FROM TABLE WHERE Id in (1001..10000) 此查询运行非常慢,最后出现超时异常。 它的临时修复程序正在使用限制进行查询,请将此查询拆分为每1000个id的10个部分 我听说在这种情况下使用临时表可能会有所帮助,但看起来MSSQLServer也会自动在下面这样做 处理此类问题的最佳方法是什么?您可以使用临时表按如下方式编写查询: CREATE TABLE #ids(Id INT NOT NULL P
SELECT *
FROM TABLE
WHERE Id in (1001..10000)
此查询运行非常慢,最后出现超时异常。
它的临时修复程序正在使用限制进行查询,请将此查询拆分为每1000个id的10个部分
我听说在这种情况下使用临时表可能会有所帮助,但看起来MSSQLServer也会自动在下面这样做
处理此类问题的最佳方法是什么?您可以使用临时表按如下方式编写查询:
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;
我的猜测是,它可能会比原始查询运行得更快。可以直接使用索引进行查找(如果索引存在于[表].Id
列中)
您的原始查询将转换为
SELECT *
FROM [TABLE]
WHERE Id=1000 OR Id=1001 OR /*...*/ OR Id=10000;
这将需要对[表]
中的每一行计算表达式Id=1000或Id=1001或/*…*/或Id=10000
,这可能比使用临时表需要更长的时间。带有临时表的示例获取#ids
中的每个Id
,并使用索引在[表]
中查找相应的Id
所有这些都假设ID中存在1000到10000之间的间隙。否则写起来就容易多了
SELECT *
FROM [TABLE]
WHERE Id BETWEEN 1001 AND 10000;
这还需要在
[Table].Id上建立一个索引以加快速度。这可能会对您有所帮助。使用一个临时表重写它,并与所说的临时表连接起来,这并不是那么多工作。您可以在临时表的Id上添加主键,以加快查找速度。我猜在你的情况下,它会运行得更快,有数千个Id。@TT。谢谢你的回答,你能给出一些脚本的例子吗。我还想知道,也许微软的sql server已经在做这件事了,所以这将是多余的,甚至没有微软的sql版本那么有效。可能我们需要在之后删除临时表。ID列上有索引吗?@JosephIdziorek,yesYes,ID的数组可以包含间隙,并且可以随机排序。