Sql server SELECT语句立即执行,插入到表变量中需要花费很长时间

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 发生了什么,这是没有意义的。即使它是一个简

我有下面的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

发生了什么,这是没有意义的。

即使它是一个简单的选择,几乎会立即执行,但如果你有一个大数据集,输入将花费更长的时间,因为它将在处理条件之前收集所有数据。使用和存在于它的位置,它很可能会运行得更快

尽管这是一个简单的选择,几乎会立即执行,但如果您有一个大数据集,则执行IN将花费更长的时间,因为它将在处理条件之前收集所有数据。使用和存在于它的位置,它很可能会运行得更快

这种行为可能有多种原因。没有执行计划,我们只能猜测原因,无法确定确切原因

  • 由于您在查询中使用的是
    DISTINCT ID
    ,因此我假设
    ID
    不是主键。您可以在
    WHERE
    子句中修改查询以使用
    PK

  • 表Y中的数据可能太大,大约数百万,并且由于缺少索引(在表上)和存在(在查询中),查询将花费很长时间

  • 尝试此代码只是为了检查速度

    SELECT DISTINCT ID, ParentID
    FROM Y WHERE ID IN (3,4)
    

  • 这种行为可能有多种原因。没有执行计划,我们只能猜测原因,无法确定确切原因

  • 由于您在查询中使用的是
    DISTINCT ID
    ,因此我假设
    ID
    不是主键。您可以在
    WHERE
    子句中修改查询以使用
    PK

  • 表Y中的数据可能太大,大约数百万,并且由于缺少索引(在表上)和存在(在查询中),查询将花费很长时间

  • 尝试此代码只是为了检查速度

    SELECT DISTINCT ID, ParentID
    FROM Y WHERE ID IN (3,4)
    

  • 尝试使用临时表来代替。table变量只针对一行进行了优化,并假设它将得到一行


    阅读更多内容

    尝试使用临时表。table变量只针对一行进行了优化,并假设它将得到一行


    阅读更多内容

    发布两个版本的查询计划。我们在这里讨论的是多少行?插入表变量的查询的限制是它们不能使用并行计划。发布两个版本的查询计划。我们在这里讨论的是多少行?插入表变量的查询的限制是它们不能使用并行计划。整个过程(包括最终选择*)需要那么长时间吗?您需要将其取出并隔离,以验证是否是插入而不是fnial SELECT占用了那么长的时间。整个过程(包括最终SELECT*)是否占用了那么长的时间?您需要将其取出并隔离,以验证花费的时间是否是INSERT而不是fnial SELECT。使用临时表的解决方案可能会奏效。这是因为“表变量仅针对一行进行了优化”的解释是毫无意义的。两者之间插入性能的任何差异都将是因为并行计划与串行计划。使用临时表的解决方案可能有效。这是因为“表变量仅针对一行进行了优化”的解释是毫无意义的。两者之间插入性能的任何差异都是因为并行计划与串行计划。