Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果查询包含批次id';s在';在第'条中;_Sql Server_Azure Sql Database - Fatal编程技术网

Sql server 如果查询包含批次id';s在';在第'条中;

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

我有一个大的查询,可以通过id获取多行,比如

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的数组可以包含间隙,并且可以随机排序。