立即执行的SELECT语句,永远插入表变量

时间:2012-11-08 01:37:37

标签: sql-server insert table-variable

我在下面有以下SQL代码。它需要永远完成,但如果我只运行SELECT DISTINCT ID, ParentID FROM Y WHERE ID IN (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

发生了什么,这没有任何意义。

3 个答案:

答案 0 :(得分:2)

尝试使用临时表。表变量仅针对一行进行了优化,并假设它是将要获得的。

了解更多here

答案 1 :(得分:1)

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

答案 2 :(得分:1)

此行为可能有多种原因。如果没有执行计划,我们只能猜测原因,并且无法确定原因。

  1. 由于您在查询中使用DISTINCT ID,我认为ID不是主键。您是否可以修改查询以在PK子句中使用WHERE

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

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

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