虽然条件为假,但仍会执行代码

时间:2014-03-06 11:44:50

标签: tsql sql-server-2008-r2

我有view V。 由于引用了许多其他视图和表,从此视图中选择数据大约需要十秒钟才能执行。没有办法改变这一点。

此外,还有一个更改日志表(CL),它保存有关V(和/或其他一些表/视图)的某些数据集是否必须重新加载的信息,例如:

id, refId, table
1, 1, V
2, 2, V
3, 3, A
4, 1, B

id是PK,自动增量。 refId指的是每个引用表/视图的id列。 table包含引用表/视图的名称

现在,有一个查询检查CL中是否有数据集引用视图V.

Q1:

SELECT 
  V.*
FROM 
  CL
INNER JOIN V 
  ON V."id" = CL."refId"
  AND CL."table" = 'V'

在上面的例子中,来自CL的两个记录受到影响(id 1和2)。

如果没有任何记录受到影响(CL中没有“table”='V'的记录)我会期望0执行第二个查询Q1的即时结果(认为优化器会确定连接条件返回0导致CL,因此不需要在视图V上执行选择,这是瓶颈,但确实如此。)

我在此之后尝试过:

a)将连接条件(CL."table" = 'V')的一部分移动到WHERE子句。

b)完全删除JOIN并将其重写为

IF (( SELECT COUNT(1) FROM CL WHERE "table" = 'V' ) > 0 )
BEGIN
  <Do something which references the bottleneck-View V>
END

如果IF条件返回false,我希望不执行BEGIN和END之间的代码。但它是。 b)中查询的运行时与SELECT * FROM V几乎相同,即使CL中没有table ='V'的记录。

我做错了什么?

0 个答案:

没有答案