我已经根据我在工作中使用的应用程序生成的几个表创建了一个View。生成View的SQL包含许多CASE WHEN表达式,因为原始表缺少我运行的报告所需的一些逻辑。
我做的一件事是,当一个Item在表之间不匹配时,我希望某些列中有0个值。
round(case when e.Item=p.Item then p.ColumnA else 0 end,6) as NewColumnA
ColumnA的数据类型为FLOAT,看起来NewColumA也是FLOAT。但是当我在View上运行查询并指定我不想要NewColumnA为零的记录时,它运行得非常慢。但是,如果我在VIEW中的CASE WHEN之外添加一个ROUND,它的运行速度要快得多(80s vs 0.5s)。
{{1}}
现在,这解决了我的性能问题,但我认为这不是解决它的“最佳实践”方式。我也非常有兴趣了解问题所在。
答案 0 :(得分:0)
对视图中的计算值使用查询会降低查询速度,因为它需要在视图中进行所有计算才能进行比较。
在您的视图中将e.Item和p.Item包含在不同的别名下,在本演示中我使用了e_item和p_item。
将此应用于WHERE子句,并且不要在WHERE子句中包含NewColumnA:
WHERE
exists(SELECT e_item EXCEPT SELECT p_item)
使用上面的语法来防止NULL值给出错误的结果。
如果您的列永远不会包含null,则只需使用
即可WHERE
e_item <> p_item