สร้างเตียงทดสอบที่ยอมรับค่อนข้างง่ายใน SQL Server 2012 (11.0.6020) UNION ALL
ช่วยให้ฉันเพื่อสร้างแผนสองคำสั่งกัญชาจับคู่ถูกตัดแบ่งผ่าน เตียงทดสอบของฉันไม่แสดงการประมาณที่ไม่ถูกต้องที่คุณเห็น บางทีนี่อาจเป็นปัญหาของ SQL Server 2014 CE
ฉันได้รับการประมาณ 133.785 แถวสำหรับแบบสอบถามที่จริงแล้วส่งคืน 280 แถวอย่างไรก็ตามจะต้องมีการคาดหวังเนื่องจากเราจะเห็นข้อมูลเพิ่มเติมเกี่ยวกับ:
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;
ฉันคิดว่าเหตุผลอยู่ที่การขาดสถิติสำหรับการรวมสองรายการที่เกิดขึ้นกับ UNION SQL Server จำเป็นต้องคาดเดาอย่างมีเหตุผลในกรณีส่วนใหญ่เกี่ยวกับการเลือกคอลัมน์เมื่อต้องเผชิญกับการขาดสถิติ
โจกระสอบมีการอ่านที่น่าสนใจเกี่ยวกับที่นี่
สำหรับ a UNION ALL
ปลอดภัยที่จะบอกว่าเราจะเห็นจำนวนแถวทั้งหมดที่คืนมาจากแต่ละส่วนประกอบของสหภาพอย่างแน่นอนอย่างไรก็ตามเนื่องจาก SQL Server ใช้การประมาณแถวสำหรับองค์ประกอบทั้งสองของUNION ALL
เราจึงเห็นว่ามันเพิ่มจำนวนแถวโดยประมาณทั้งหมดจากทั้งสอง แบบสอบถามที่จะเกิดขึ้นกับการประมาณการสำหรับผู้ประกอบการเรียงต่อกัน
ในตัวอย่างของฉันข้างต้นจำนวนแถวโดยประมาณสำหรับแต่ละส่วนของUNION ALL
66.8927 ซึ่งเมื่อรวมเท่ากับ 133.785 ซึ่งเราเห็นจำนวนแถวโดยประมาณสำหรับผู้ดำเนินการเชื่อมต่อ
แผนการดำเนินการจริงสำหรับคิวรีแบบร่วมด้านบนมีลักษณะดังนี้:
คุณสามารถดูจำนวนแถว "โดยประมาณ" เทียบกับ "จริง" ในกรณีของฉันการเพิ่มจำนวนแถว "โดยประมาณ" ที่ส่งคืนโดยผู้ดำเนินการจับคู่แฮชเท่ากับจำนวนเงินที่แสดงโดยผู้ดำเนินการเชื่อมต่อ
ฉันจะพยายามรับผลลัพธ์จากการติดตาม 2363 ฯลฯ ตามที่แนะนำในโพสต์ของ Paul White ที่คุณแสดงในคำถามของคุณ อีกวิธีหนึ่งคุณอาจลองใช้OPTION (QUERYTRACEON 9481)
ในแบบสอบถามเพื่อเปลี่ยนกลับเป็น CE 70 รุ่นเพื่อดูว่า "แก้ไข" ปัญหา