Оптимизировать план выполнения SQL-запросов - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно оптимизировать запросы для просмотров,

Ниже приведен один из запросов, используемых в представлениях:

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

Несмотря на то, что он показывает число выполнения как 0, но он дает стоимость как 19% при сканировании <tablename>

Как оптимизировать план выполнения?

Если я выполню запрос, как показано ниже, он даст 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 входят в фактический план выполнения, но я хочу, чтобы 2nd select не оценивался, если ist select равен true, и наоборот

1 Ответ

0 голосов
/ 04 июня 2019

Вы можете переписать его так, в зависимости от содержимого version:

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

Если это приводит к дублированию в наборе результатов, APPLY может помочь. Однако пока неясно, будет ли оптимизатор запросов работать лучше:

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.

...