【问题标题】:Optimize sql query execution plan优化sql查询执行计划
【发布时间】:2019-10-20 07:01:39
【问题描述】:

我需要优化视图查询,

以下是视图中使用的查询之一:

SELECT * FROM <tablename> 
WHERE (2=(SELECT value FROM dbo.version WHERE a=<somevalue>))

虽然它显示执行次数为0,但扫描&lt;tablename&gt;时给出的成本为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


【解决方案1】:

根据version的内容,你或许可以这样重写:

SELECT t.* 
FROM <tablename> t
INNER JOIN dbo.version v ON v.value = 2 AND a=<somevalue> 

如果这导致结果集中出现重复,则应用可能会有所帮助。但是,我还不太清楚查询优化器是否会做得更好:

SELECT t.*
FROM <tablename> t
CROSS APPLY (SELECT TOP 1 v.value FROM dbo.version v WHERE v.value = 2 AND a=<somevalue>) z

您可能还需要根据a 列的含义进行调整。

【讨论】:

  • 嘿乔尔,谢谢,我尝试了这些,但成本仍然显示在表 t 的执行计划中,理想情况下它不应该转到表,如果条件未评估为真
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多