我有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'
的记录。
我做错了什么?