Zbudowanie, co prawda dość prostego stanowiska testowego na SQL Server 2012 (11.0.6020) pozwala mi odtworzyć plan z dwoma połączonymi zapytaniami dopasowanymi, które są łączone za pośrednictwem UNION ALL
. Moje stanowisko testowe nie wyświetla nieprawidłowego oszacowania, które widzisz. Być może jest to problem z SQL Server 2014 CE.
Dostaję szacunkową wartość 133,785 wierszy dla zapytania, które faktycznie zwraca 280 wierszy, ale należy się tego spodziewać, jak zobaczymy poniżej:
IF OBJECT_ID('dbo.Union1') IS NOT NULL
DROP TABLE dbo.Union1;
CREATE TABLE dbo.Union1
(
Union1_ID INT NOT NULL
CONSTRAINT PK_Union1
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, Union1_Text VARCHAR(255) NOT NULL
, Union1_ObjectID INT NOT NULL
);
IF OBJECT_ID('dbo.Union2') IS NOT NULL
DROP TABLE dbo.Union2;
CREATE TABLE dbo.Union2
(
Union2_ID INT NOT NULL
CONSTRAINT PK_Union2
PRIMARY KEY CLUSTERED
IDENTITY(2,2)
, Union2_Text VARCHAR(255) NOT NULL
, Union2_ObjectID INT NOT NULL
);
INSERT INTO dbo.Union1 (Union1_Text, Union1_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
INSERT INTO dbo.Union2 (Union2_Text, Union2_ObjectID)
SELECT o.name, o.object_id
FROM sys.objects o;
GO
SELECT *
FROM dbo.Union1 u1
INNER HASH JOIN sys.objects o ON u1.Union1_ObjectID = o.object_id
UNION ALL
SELECT *
FROM dbo.Union2 u2
INNER HASH JOIN sys.objects o ON u2.Union2_ObjectID = o.object_id;
Myślę, że powodem jest brak statystyk dla dwóch powstałych złączeń, które są UNIONed. W większości przypadków SQL Server musi zgadywać, co do selektywności kolumn w obliczu braku statystyk.
Joe Sack ma ciekawą poczytać na ten temat tutaj .
Dla UNION ALL
bezpieczeństwa można powiedzieć, że zobaczymy dokładnie całkowitą liczbę wierszy zwróconych przez każdy składnik unii, jednak ponieważ SQL Server używa oszacowań wierszy dla dwóch składników UNION ALL
, widzimy, że dodaje całkowitą szacunkową liczbę wierszy z obu zapytania mające na celu oszacowanie dla operatora konkatenacji.
W moim przykładzie powyżej szacunkowa liczba wierszy dla każdej części UNION ALL
wynosi 66,8927, co po zsumowaniu wynosi 133,785, co widzimy dla szacunkowej liczby wierszy dla operatora konkatenacji.
Rzeczywisty plan wykonania powyższego zapytania dotyczącego unii wygląda następująco:
Możesz zobaczyć „szacunkową” a „faktyczną” liczbę wierszy. W moim przypadku dodanie „szacunkowej” liczby wierszy zwróconych przez dwóch operatorów dopasowania mieszającego dokładnie równa się liczbie pokazanej przez operator konkatenacji.
Spróbowałbym uzyskać dane wyjściowe ze śledzenia 2363 itp., Jak zalecono w poście Paula White'a, który pokazałeś w swoim pytaniu. Alternatywnie możesz spróbować użyć OPTION (QUERYTRACEON 9481)
zapytania, aby przywrócić wersję 70 CE, aby sprawdzić, czy to „rozwiązuje” problem.