Оптимизация SQL-запроса с помощью Union All - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть запрос с 4 запросами выбора, объединенными с помощью Union All, чтобы вернуть один набор результатов, это довольно сложные запросы выбора, но в них не участвуют объединения, они фактически выбирают из двух разных представлений.Я просто смотрю на оптимизацию, но не совсем уверен, с чего мне начать.«Фактический план выполнения» гласит, что «Расчетная стоимость поддерева» равна 2.12357, я всегда предполагал, что если он больше 1, то это довольно медленный запрос?это правильное предположение?Я также проверил весь план, и в нем нет сканирования таблиц, только сканирования кластеризованных индексов и поиска кластеризованных индексов, которые, как я полагаю, снова в порядке?Тем не менее, есть много хеш-матчей.В любом случае, этот запрос будет выполняться много раз, поэтому я хотел бы оптимизировать его как можно лучше.Надеюсь, это имеет какой-то смысл.

Хорошо, SQL выглядит следующим образом

CREATE PROCEDURE [dbo].[CompareFiles] -- Add the parameters for the stored procedure here
@VersionID int, 
@SyncRequestID int,     
@RegionID int, 
@LanguageID int 
AS
BEGIN

SELECT 'Delete' AS Action, Type, SUBSTRING(FullPath,2,LEN(FullPath)-1) AS FullPath, FileNameOnServer, FileSize FROM View1
WHERE NOT EXISTS(SELECT 1 FROM View2 where View2.FullPath = View1.FullPath 
AND View2.VersionId = @VersionID
AND View2.RegionID = @RegionID 
AND View2.LanguageID = @LanguageID
)
AND View1.SyncRequestID = @SyncRequestID

UNION ALL 

SELECT 'Add' AS Action, Type, SUBSTRING(FullPath,2,LEN(FullPath)-1) AS FullPath, FileNameOnServer,FileSize FROM View2  
WHERE NOT EXISTS(SELECT 1 FROM View1 where View1.FullPath = View2.FullPath AND View1.SyncRequestID = @SyncRequestID)
AND 
View2.VersionId = @VersionID
AND View2.RegionID = @RegionID
AND View2.LanguageID = @LanguageID

UNION ALL 

SELECT 'Delete' AS Action, Type, SUBSTRING(FullPath,2,LEN(FullPath)-1) AS FullPath, FileNameOnServer, FileSize FROM View2 
WHERE EXISTS
(
    SELECT 1 FROM View2 fd2 
    WHERE 
        View2.FullPath = fd2.FullPath AND fd2.VersionID = @VersionID
AND 
    View2.FileNameOnServer <> fd2.FileNameOnServer 
AND 
    fd2.RegionID = @RegionID
AND 
    fd2.LanguageID = @LanguageID 
)
AND 
    View2.VersionId = (SELECT VersionID FROM SyncRequest WHERE SyncRequestID = @SyncRequestID)
AND 
    View2.RegionID = @RegionID
AND 
    View2.LanguageID = @LanguageID

UNION ALL

SELECT 'Add' AS Action, Type, SUBSTRING(FullPath,2,LEN(FullPath)-1) AS FullPath, FileNameOnServer, FileSize FROM View2 
WHERE EXISTS
(
SELECT 1 FROM View2 fd2 
WHERE 
    View2.FullPath = fd2.FullPath AND fd2.VersionID = (SELECT VersionID FROM SyncRequest WHERE SyncRequestID = @SyncRequestID)
AND 
    View2.FileNameOnServer <> fd2.FileNameOnServer 
AND 
    fd2.RegionID = @RegionID
AND 
    fd2.LanguageID = @LanguageID 
)
AND 
    View2.VersionId = @VersionID
AND 
    View2.RegionID = @RegionID
AND 
    View2.LanguageID = @LanguageID

END

View 1 Definition

SELECT DISTINCT fqp.Path + '/' + ISNULL(f.Name, '') + ISNULL(f.Extension, '') AS FullPath, fl.LanguageID, fr.RegionID, f.FileID, dbo.CIT_APD_Versions.ApID, f.FileNameOnServer, dbo.Versions.VersionID, (CASE WHEN FileNameOnServer IS NULL THEN 'Folder' ELSE 'File' END) AS Type, f.FileSize
FROM dbo.FileRegions AS fr 
RIGHT OUTER JOIN dbo.Files AS f 
    INNER JOIN dbo.FilePaths AS fp ON fp.FileID = f.FileID ON fr.FileID = f.FileID 
    LEFT OUTER JOIN dbo.FileLanguages AS fl ON fl.FileID = f.FileID 
    LEFT OUTER JOIN dbo.RoleFiles AS fro ON fro.FileID = f.FileID 
    RIGHT OUTER JOIN dbo.Versions 
        INNER JOIN dbo.View3 AS fqp ON dbo.VersionID = fqp.VersionID ON fqp.PathID = fp.PathID

View 2 Definition

SELECT     '//' + dbo.CIT_APD_SyncRequestFiles.FullPath AS FullPath, NULL AS LanguageID, NULL AS RegionID, NULL AS FileID, NULL AS ApID, 
                  dbo.SyncRequest.VersionID, '' AS FileNameOnServer, '' AS Type, NULL AS FileSize, dbo.SyncRequestFiles.SyncRequestID
FROM dbo.SyncRequestFiles 
INNER JOIN dbo.CIT_APD_SyncRequest ON dbo.SyncRequestFiles.SyncRequestID = dbo.SyncRequest.SyncRequestID

Просмотр 3 Определение

WITH Parent AS (SELECT PathID, ParentPathID, VersionID, CONVERT(varchar(128), Path) AS Path
FROM dbo.Paths AS ParentPaths
WHERE (ParentPathID = 0)
UNION ALL
SELECT ChildPaths.PathID, ChildPaths.ParentPathID, ChildPaths.VersionID, CONVERT(varchar(128), Parent.Path + '/' + ChildPaths.Path) AS Path
FROM dbo.Paths AS ChildPaths 
INNER JOIN Parent ON Parent.PathID = ChildPaths.ParentPathID)

SELECT PathID, ParentPathID, VersionID, Path
FROM Parent

Спасибо

Ответы [ 3 ]

2 голосов
/ 09 ноября 2010

... это довольно сложные запросы выбора, но в них не участвуют объединения, они фактически выбирают из двух разных представлений.

Но есть ли объединения в представлениях?И есть ли у представлений какие-либо общие таблицы?

Не видя запроса, и запросы, за которыми стоят представления, очень мало кто может предоставить, который будет иметь значение.

1 голос
/ 09 ноября 2010

«Ориентировочная стоимость поддерева» составляет 2.12357, I всегда предполагалось, если это было больше 1, то это довольно медленный запрос

Стоимость поддерева не может использоваться независимо для оценки производительности. Он предназначен для использования для сравнения разных запросов, выполняющих одну и ту же задачу. Таким образом, нельзя полагать, что высокая стоимость указывает на неэффективный запрос.

Вы должны ответить на вопрос «Является ли запрос выдачей результатов в приемлемое количество времени?»

С учетом всего вышесказанного, и, если учесть риторику, более высокая стоимость поддерева может поддержать вашу мысль, что возможно запрос может быть улучшен.

нет сканов таблицы, только Сканирование кластеризованного индекса

Что может быть лучшей возможностью для улучшения запроса, это посмотреть, почему существуют сканирования кластеризованных индексов. Сканирование кластеризованного индекса эквивалентно сканированию таблицы. Весь кластерный индекс, который включает в себя данные таблицы, сканируется. Должны ли быть оценены все строки в таблице, или это указывает на возможность повышения производительности?

0 голосов
/ 09 ноября 2010

Запустите запрос с помощью мастера настройки индекса, и он подскажет, какие индексы могут помочь.

Действительно, было бы лучше проанализировать и определить улучшения SQL, но вы не опубликовали SQL, поэтому мы не можем вам помочь с этим.

...