如果输入一个参数,即:
,我的视图可以快速运行SELECT * FROM v_myView WHERE myVal = 'thisValue';
如果我要求它提供多个值IN
,它将花费大约20秒的时间来评估整个视图的数据,并从数据中选择结果。所以这很慢:
SELECT * FROM v_myView WHERE myVal IN (SELECT theseValues FROM myTable);
我要记住,对于我知道的数据集很小的情况,从SELECT theseValues FROM myTable
和v_myView
分别查询UNION ALL
的所有结果将更快一些这样我就可以有效地生成查询:
SELECT * FROM v_myView WHERE myVal = 'thisValue1'
UNION ALL
SELECT * FROM v_myView WHERE myVal = 'thisValue2'
UNION ALL
etc...;
是否有任何方法可以在不使用存储过程或动态sql的情况下在“简单”查询中强制执行此操作,还是我将不得不长期这样做?
答案 0 :(得分:0)
看看执行计划以及基础表和视图的结构,可以更好地回答问题。
通常,使用EXISTS可以在三种常用的方法中获得最佳性能:
但是,比较取决于基础表的结构和索引。
查询:
SELECT *
FROM v_myView V
WHERE EXISTS (
SELECT 1
FROM myTable T
WHERE T.theseValues = V.myVal
);
但是查询也应该包含必需的索引,以便能够获得良好的性能: