【发布时间】:2019-10-20 07:01:39
【问题描述】:
我需要优化视图查询,
以下是视图中使用的查询之一:
SELECT * FROM <tablename>
WHERE (2=(SELECT value FROM dbo.version WHERE a=<somevalue>))
虽然它显示执行次数为0,但扫描<tablename>时给出的成本为19%
如何优化其执行计划?
如果我像下面这样运行查询,它的成本是 0%
SELECT * FROM <tablename> WHERE (2=(1))
这里是视图:
CREATE VIEW v1
AS
SELECT * FROM t1 WHERE (1=(SELECT value FROM config WHERE year=2019))
UNION ALL
SELECT * FROM t2 WHERE (2=(SELECT value FROM config WHERE year=2019))
GO
目前 t1 和 t2 都在实际执行计划中,但如果 ist select 为真,我希望不评估第二次选择,反之亦然
【问题讨论】:
-
请选择一个数据库平台来标记
-
嗯,当然成本会更低......它是一个文字,它总是 FALSE 与带有谓词的子查询相比,它可能有也可能没有它可以使用的索引。如果这是 sql server,请发布实际执行计划:brentozar.com/pastetheplan 我删除了 Oracle 标记,因为其他所有内容都指向 SQL Server……但您仍然需要选择一个版本。另外,您的问题非常模糊和不清楚。我们需要一个真实的、可重现的问题。您的视图可能会变慢的原因有很多。
-
我需要以这样一种方式优化计划,即查询应首先检查 where 子句并且不要进入表内。更新了问题中的查询
标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2