คำถามติดแท็ก cardinality-estimates

3
ทำไมตัวดำเนินการแบบขนาน (Repartition Streams) จะลดการประมาณแถวเป็น 1
ฉันใช้ SQL Server 2012 Enterprise ฉันเจอแผน SQL ที่แสดงพฤติกรรมบางอย่างที่ฉันไม่พบว่าใช้งานง่าย หลังจากการดำเนินการสแกนดัชนีแบบขนานขนาดใหญ่การดำเนินการแบบขนาน (Repartition Streams) เกิดขึ้น แต่กำลังฆ่าการประมาณแถวที่ถูกส่งคืนโดยดัชนีการสแกน (Object10.Index2) ลดการประมาณการเป็น 1 ฉันได้ทำการค้นหาบางอย่างแล้ว แต่ ยังไม่เจออะไรที่อธิบายพฤติกรรมนี้ แบบสอบถามค่อนข้างง่ายแม้ว่าแต่ละตารางจะมีระเบียนเป็นล้าน ๆ นี่เป็นส่วนหนึ่งของกระบวนการโหลด DWH และชุดข้อมูลระดับกลางนี้มีการแตะสองสามครั้งตลอด แต่คำถามที่ฉันมีเกี่ยวข้องกับการประมาณแถวโดยเฉพาะ บางคนสามารถอธิบายได้หรือไม่ว่าเหตุใดการประมาณแถวที่ถูกต้องจึงไปที่ 1 ในตัวดำเนินการขนาน (Repartition Strems) นอกจากนี้ ฉันได้ส่งแผนเต็มรูปแบบเพื่อวางแผน นี่คือการดำเนินการที่เป็นปัญหา: รวมแผนผังต้นไม้ในกรณีที่เพิ่มบริบทเพิ่มเติม: ฉันสามารถใช้รูปแบบบางอย่างของรายการเชื่อมต่อที่ยื่นโดย Paul White ได้หรือไม่ (อธิบายเพิ่มเติมในเชิงลึกบนบล็อกของเขาที่นี่ ) อย่างน้อยมันก็เป็นสิ่งเดียวที่ฉันพบว่าดูเหมือนจะอยู่ใกล้กับสิ่งที่ฉันกำลังวิ่งเข้าไปในระยะไกลถึงแม้ว่าจะไม่มีโอเปอร์เรเตอร์ที่เล่น

2
เหตุใดแบบสอบถาม DELETE จึงทำงานในรูปแบบหนึ่งนานกว่าอีกรูปแบบหนึ่ง
ฉันมีรหัสการล้างข้อมูลเฉพาะที่พยายามลบรายการที่ซ้ำบางรายการ สิ่งนี้ทำงานได้อย่างสมบูรณ์บนเว็บไซต์ของลูกค้าจำนวนมาก บันทึกบอกฉันว่าแบบสอบถามนี้ใช้อย่างน้อย 1 วินาทีสูงสุด 45 วินาที: DELETE FROM [tbl] WHERE [Id] NOT IN ( SELECT MIN([Id]) FROM [tbl] GROUP BY [IdProject], [IdRepresentative], [TimeStart] ) แต่ฉันมีลูกค้าที่แบบสอบถามนี้ทำงานนานกว่า 4 ชั่วโมง (ถึงตอนนี้และไม่สิ้นสุด)! ฉันตรวจสอบ DB ( DBCC CHECKDB) ฉันอัปเดตสถิติ ( sp_updatestats) แล้วและยังUPDATE STATISTICS [tbl] WITH FULLSCANไม่แสดงการเปลี่ยนแปลงอีกด้วย ฉันมีการสำรองข้อมูลดั้งเดิมของฐานข้อมูลจากลูกค้า ฉันเรียกใช้บน SQL Server 14.0.2002.14 ฉันมี Standard Edition …

2
ทำไมฉันถึงได้รับการแปลงโดยนัยของ Int / Smallint เป็น Varchar และมันส่งผลกระทบต่อการประเมิน Cardinality จริง ๆ หรือไม่
ฉันกำลังพยายามแก้ไขปัญหาแบบสอบถามที่ทำงานช้าโดยใช้ Show Plan Analysis (SSMS) บนแผนปฏิบัติการจริง เครื่องมือวิเคราะห์ชี้ให้เห็นว่าการประมาณการจำนวนแถวนั้นไม่ได้ผลการค้นหาที่ส่งคืนในบางสถานที่ในแผนและให้คำเตือนการแปลงโดยนัยเพิ่มเติม ฉันไม่เข้าใจการแปลงโดยนัยเหล่านี้ของ int ไปเป็น Varchar- เขตข้อมูลที่อ้างถึงไม่ได้เป็นส่วนหนึ่งของพารามิเตอร์ / ตัวกรองใด ๆ ในแบบสอบถามและในตารางทั้งหมดที่เกี่ยวข้องกับชนิดข้อมูลคอลัมน์จะเหมือนกัน: ฉันได้รับคำเตือนจาก Cardinality ด้านล่าง: การแปลงประเภทในนิพจน์ (CONVERT_IMPLICIT (varchar (12), [ccd]. [profileid], 0)) อาจส่งผลต่อ "CardinalityEstimate" ในตัวเลือกแผนแบบสอบถาม - ฟิลด์นี้เป็นจำนวนเต็มทุกที่ในฐานข้อมูลของฉัน การแปลงประเภทในนิพจน์ (CONVERT_IMPLICIT (varchar (6), [ccd]. [nodeid], 0)) อาจส่งผลต่อ "CardinalityEstimate" ในตัวเลือกแผนแบบสอบถาม - ฟิลด์นี้มีขนาดเล็กทุกที่ใน DB ของฉัน การแปลงประเภทในการแสดงออก (CONVERT_IMPLICIT (varchar (6), [ccd]. …

3
เรียงลำดับการรั่วไหลไปยัง tempdb เนื่องจาก varchar (สูงสุด)
บนเซิร์ฟเวอร์ที่มี 32GB เราใช้ SQL Server 2014 SP2 ที่มีหน่วยความจำสูงสุด 25GB เรามีสองตารางที่นี่คุณจะพบโครงสร้างที่เรียบง่ายของทั้งสองตาราง: CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT …

1
การแปลงประเภทในการแสดงออกอาจส่งผลกระทบต่อ "CardinalityEstimate" ในตัวเลือกแผนแบบสอบถาม?
ฉันรักษาฐานข้อมูลเก็บถาวรที่เก็บข้อมูลประวัติในมุมมองที่แบ่งพาร์ติชัน คอลัมน์แบ่งเป็นวันที่และเวลา แต่ละตารางใต้มุมมองจะเก็บข้อมูลหนึ่งเดือน เรา จำกัด กิจกรรมในแต่ละตารางด้วยข้อ จำกัด การตรวจสอบในคอลัมน์วันที่และเวลา สิ่งนี้อนุญาตให้เครื่องมือเพิ่มประสิทธิภาพ จำกัด ตารางที่ค้นหาการสืบค้นที่กรองในคอลัมน์วันที่และเวลาของเหตุการณ์ ชื่อของข้อ จำกัด การตรวจสอบถูกสร้างขึ้นโดย SQL Server ดังนั้นจึงยากที่จะรู้ว่าสิ่งที่พวกเขาทำโดยดูที่ชื่อของพวกเขา ฉันต้องการชื่อข้อ จำกัด ที่จะมีรูปแบบ 'CK_TableName_Partition' ฉันสามารถสร้างสคริปต์การเปลี่ยนชื่อโดยใช้แบบสอบถามนี้และคัดลอกข้อมูลจากคอลัมน์ sql_text WHERE clause ตรงกับการตรวจสอบข้อ จำกัด ที่ชื่อดูเหมือนว่าถูกสร้างขึ้นโดย SQL Server: SELECT checks.name AS check_name, tabs.name AS table_name, skemas.name AS schema_name, cols.name AS column_name, N' EXECUTE sys.sp_rename @objname = N''' + …

1
การเข้าร่วมแฮชระหว่างตารางต้นแบบ / ตารางรายละเอียดจะสร้างการประมาณค่าเชิงหัวใจต่ำเกินไป
เมื่อเข้าร่วมตารางต้นแบบเข้ากับตารางรายละเอียดฉันจะสนับสนุน SQL Server 2014 ให้ใช้การประมาณค่าเชิงการนับของตารางขนาดใหญ่ (รายละเอียด) เป็นการประมาณค่าความสำคัญของการรวมเอาต์พุตได้อย่างไร ตัวอย่างเช่นเมื่อเข้าร่วมแถวหลัก 10K ถึงแถวรายละเอียด 100K ฉันต้องการให้ SQL Server ประมาณค่าการเข้าร่วมที่แถว 100K - เหมือนกับจำนวนแถวรายละเอียดโดยประมาณ ฉันควรจัดโครงสร้างคิวรีและ / หรือตารางและ / หรือดัชนีของฉันอย่างไรเพื่อช่วยให้ตัวประมาณของ SQL Server ใช้ประโยชน์จากข้อเท็จจริงที่ว่าทุกแถวรายละเอียดมีแถวหลักที่สอดคล้องกันเสมอ (หมายความว่าการเข้าร่วมระหว่างพวกเขาไม่ควรลดค่าประมาณของ cardinality) นี่คือรายละเอียดเพิ่มเติม ฐานข้อมูลของเรามีคู่ของตารางต้นแบบ / รายละเอียด: VisitTargetมีหนึ่งแถวสำหรับแต่ละธุรกรรมการขายและVisitSaleมีหนึ่งแถวสำหรับแต่ละผลิตภัณฑ์ในแต่ละธุรกรรม มันเป็นความสัมพันธ์แบบหนึ่งต่อหลายคน: หนึ่งแถว VisitTarget สำหรับแถว VisitSale เฉลี่ย 10 แถว ตารางมีลักษณะดังนี้: (ฉันลดความซับซ้อนของคอลัมน์ที่เกี่ยวข้องสำหรับคำถามนี้เท่านั้น) -- "master" table CREATE TABLE VisitTarget ( …

3
วิธีการใบ้การเข้าร่วมหลายคนใน SQL Server
ฉันมี 3 "ใหญ่" ตารางที่เข้าร่วมในคอลัมน์ (ทั้งสองint) ตารางที่ 1 มีประมาณ 200 ล้านแถว ตารางที่ 2 มีประมาณ 1.5 ล้านแถว ตารางที่ 3 มีประมาณ 6 ล้านแถว แต่ละตารางมีดัชนีคลัสเตอร์บนKey1, Key2และจากนั้นหนึ่งคอลัมน์อื่น ๆ Key1มี cardinality ต่ำและเบ้มาก มันถูกอ้างอิงอยู่เสมอในWHEREข้อ Key2ไม่เคยถูกกล่าวถึงในWHEREข้อ การเข้าร่วมแต่ละครั้งมีหลายต่อหลายคน ปัญหาเกิดขึ้นจากการประมาณเชิงปริมาณ การประมาณผลลัพธ์ของการรวมแต่ละครั้งจะเล็กลงแทนที่จะใหญ่ขึ้น ซึ่งจะส่งผลในการประมาณการขั้นสุดท้ายของหลายร้อยต่ำเมื่อผลลัพธ์ที่แท้จริงเป็นล้าน มีวิธีใดบ้างที่ฉันจะรู้ว่า CE เป็นตัวประมาณการที่ดีกว่า? SELECT 1 FROM Table1 t1 JOIN Table2 t2 ON t1.Key1 = t2.Key1 AND t1.Key2 = …

2
Cardinality Estimation สำหรับ> = และ> สำหรับค่าสถิติขั้นตอนภายใน
ฉันพยายามที่จะเข้าใจว่า SQL Server พยายามประเมิน 'มากกว่า' และ 'มากกว่าเท่ากับ' โดยที่ clauses ใน SQL Server 2014 ฉันคิดว่าฉันเข้าใจการประเมินความสำคัญเชิงหัวใจเมื่อมันกระทบกับขั้นตอนเช่นถ้าฉันทำ select * from charge where charge_dt >= '1999-10-13 10:47:38.550' การประเมินความสำคัญเชิงหัวใจคือ 6672 ซึ่งสามารถคำนวณได้ง่ายเป็น 32 (EQ_ROWS) + 6624 (RANGE_ROWS) + 16 (EQ_ROWS) = 6672 (ฮิสโตแกรมในภาพด้านล่าง) แต่เมื่อฉันทำ select * from charge where charge_dt >= '1999-10-13 10:48:38.550' (เพิ่มเวลาเป็น 10:48 ดังนั้นจึงไม่ใช่ขั้นตอน) …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.