Sql server SELECT语句立即执行,插入到表变量中需要花费很长时间
我有下面的SQL代码。这需要花费很长时间才能完成,但如果我只运行Sql server SELECT语句立即执行,插入到表变量中需要花费很长时间,sql-server,insert,table-variable,Sql Server,Insert,Table Variable,我有下面的SQL代码。这需要花费很长时间才能完成,但如果我只运行选择DISTINCT ID,ParentID FROM Y,其中ID位于(3,4),它会立即完成 DECLARE @table TABLE ( ID int, ParentID int ) INSERT INTO @table SELECT DISTINCT ID, ParentID FROM Y WHERE ID IN (3,4) SELECT * FROM @table 发生了什么,这是没有意义的。即使它是一个简
选择DISTINCT ID,ParentID FROM Y,其中ID位于(3,4)
,它会立即完成
DECLARE @table TABLE
(
ID int,
ParentID int
)
INSERT INTO @table
SELECT DISTINCT ID, ParentID FROM Y WHERE ID IN (3,4)
SELECT * FROM @table
发生了什么,这是没有意义的。即使它是一个简单的选择,几乎会立即执行,但如果你有一个大数据集,输入将花费更长的时间,因为它将在处理条件之前收集所有数据。使用和存在于它的位置,它很可能会运行得更快 尽管这是一个简单的选择,几乎会立即执行,但如果您有一个大数据集,则执行IN将花费更长的时间,因为它将在处理条件之前收集所有数据。使用和存在于它的位置,它很可能会运行得更快 这种行为可能有多种原因。没有执行计划,我们只能猜测原因,无法确定确切原因
DISTINCT ID
,因此我假设ID
不是主键。您可以在WHERE
子句中修改查询以使用PK
SELECT DISTINCT ID, ParentID
FROM Y WHERE ID IN (3,4)
这种行为可能有多种原因。没有执行计划,我们只能猜测原因,无法确定确切原因
DISTINCT ID
,因此我假设ID
不是主键。您可以在WHERE
子句中修改查询以使用PK
SELECT DISTINCT ID, ParentID
FROM Y WHERE ID IN (3,4)
尝试使用临时表来代替。table变量只针对一行进行了优化,并假设它将得到一行
阅读更多内容尝试使用临时表。table变量只针对一行进行了优化,并假设它将得到一行
阅读更多内容发布两个版本的查询计划。我们在这里讨论的是多少行?插入表变量的查询的限制是它们不能使用并行计划。发布两个版本的查询计划。我们在这里讨论的是多少行?插入表变量的查询的限制是它们不能使用并行计划。整个过程(包括最终选择*)需要那么长时间吗?您需要将其取出并隔离,以验证是否是插入而不是fnial SELECT占用了那么长的时间。整个过程(包括最终SELECT*)是否占用了那么长的时间?您需要将其取出并隔离,以验证花费的时间是否是INSERT而不是fnial SELECT。使用临时表的解决方案可能会奏效。这是因为“表变量仅针对一行进行了优化”的解释是毫无意义的。两者之间插入性能的任何差异都将是因为并行计划与串行计划。使用临时表的解决方案可能有效。这是因为“表变量仅针对一行进行了优化”的解释是毫无意义的。两者之间插入性能的任何差异都是因为并行计划与串行计划。