这种方式是否被优化以检索数据库中不存在的值?

时间:2012-01-26 09:54:27

标签: sql-server-2005 common-table-expression

要检索不在db中的值,我使用Common Table Expression,如下所示:

;WITH new_id (id) AS (
  SELECT '0x01'
  UNION ALL SELECT '0x00'
  UNION ALL SELECT '0x03'
  UNION ALL SELECT '0x04'
  UNION ALL SELECT '0x05'
)

SELECT  id AS p
FROM   new_id ni EXCEPT(SELECT id FROM table)

这是检索未存储在DB中的值的优化方法吗?

亲切的问候,

弗洛里安

1 个答案:

答案 0 :(得分:3)

那应该没事。

对于大量的行(特别是如果它们包含长字符串值)我注意到这些常量的内部表可以take a long time to compile但我怀疑你会在30行中遇到这个问题。

从快速测试结果来看,它们优于表变量,因为SQL Server似乎维护了一些有关它们的统计信息,因此可以选择合适的连接类型。

我刚刚尝试了一个包含500行和50个不同值的CTE,并且下面计划中的估计行数是正确的。 (虽然在编译时完成所有这些工作并且可能为此目的生成了一个明确的id列表,但是SQL Server不仅仅将其替换为计划而不是不得不在运行时再次这样做)

Plan