SQL Server 2012 (11.0.6020) üzerinde oldukça basit bir test yatağı oluşturmak, bir plan ile birleştirilen iki karma eşleştirilmiş sorgu ile bir plan oluşturmamı sağlar UNION ALL
. Test yatağımda gördüğünüz yanlış tahmin görüntülenmiyor. Belki de bu olduğunu bir SQL Server 2014 CE sorunu.
Ben aslında 280 satır döndüren bir sorgu için 133.785 satır bir tahmin olsun, ancak biz daha aşağıda göreceğiz gibi bekleniyor:
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;
Bence bunun sebebi BİRLİKTE ortaya çıkan iki birleşme için istatistik eksikliğidir. SQL Server, istatistik eksikliği ile karşılaşıldığında çoğu zaman sütunların seçiciliği konusunda eğitimli tahminler yapmalıdır.
Joe Sack burada ilginç bir okumaya sahip .
Bir için UNION ALL
, biz ancak SQL Server beri satır kullanıyor, birliğin her bileşen tarafından döndürülen satır tam olarak toplam sayısını görürsünüz söylemek güvenli tahminleri iki bileşenleri için UNION ALL
, gördüğümüz toplam ekler tahmini hem satırları birleştirme işleci için tahmin bulmak için sorgular.
Yukarıdaki UNION ALL
örneğimde, her bir bölümü için tahmini satır sayısı 66.8927'dir; bu, toplandığında, birleştirme operatörü için tahmini satır sayısı için gördüğümüz 133.785'e eşittir.
Yukarıdaki birleşim sorgusunun gerçek yürütme planı şuna benzer:
"Tahmini" ve "gerçek" satır sayısını görebilirsiniz. Benim durumumda, iki karma eşleme işleci tarafından döndürülen "tahmini" satır sayısını eklemek, tam olarak birleştirme işleci tarafından gösterilen miktara eşittir.
Sorunuzda gösterdiğiniz Paul White'ın gönderisinde önerildiği gibi izleme 2363 vb.'den çıktı almaya çalışacağım. Alternatif olarak, soruna "sorunu giderip düzeltmediğini" görmek için 70 CE sürümüne geri dönmekOPTION (QUERYTRACEON 9481)
için sorguyu kullanmayı deneyebilirsiniz .