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

1
SQL Server 2014: คำอธิบายใด ๆ สำหรับการประเมิน cardinality ที่ไม่สอดคล้องกันของตนเอง?
พิจารณาแผนแบบสอบถามต่อไปนี้ใน SQL Server 2014: ในแผนแบบสอบถามการเข้าร่วมด้วยตนเองar.fId = ar.fIdจะให้ผลประมาณ 1 แถว อย่างไรก็ตามนี่เป็นค่าประมาณที่ไม่สอดคล้องกันเชิงตรรกะ: arมี20,608แถวและมีค่าที่แตกต่างกันเพียงหนึ่งค่าfId(สะท้อนให้เห็นอย่างถูกต้องในสถิติ) ดังนั้นการเข้าร่วมนี้จะสร้างผลิตภัณฑ์ไขว้เต็มของแถว ( ~424MMแถว) ทำให้คิวรีทำงานเป็นเวลาหลายชั่วโมง ฉันมีเวลายากที่จะเข้าใจว่าทำไม SQL Server ถึงได้มีการประมาณการที่สามารถพิสูจน์ได้อย่างง่ายดายว่าไม่สอดคล้องกับสถิติ ความคิดใด ๆ การตรวจสอบเบื้องต้นและรายละเอียดเพิ่มเติม จากคำตอบของ Paul ที่นี่ดูเหมือนว่าทั้งฮิวริสติก SQL 2012 และ SQL 2014 สำหรับการประเมิน cardinality ที่เข้าร่วมควรจัดการสถานการณ์ที่ฮิสโทแกรมที่เหมือนกันทั้งสองต้องเปรียบเทียบได้ง่าย ฉันเริ่มต้นด้วยผลลัพธ์จากการตั้งค่าสถานะการสืบค้นกลับ 2363 แต่ไม่สามารถเข้าใจได้อย่างง่ายดาย ตัวอย่างต่อไปนี้หมายความว่า SQL Server เปรียบเทียบฮิสโตแกรมสำหรับfIdและbIdเพื่อประเมินการเลือกของการเข้าร่วมที่ใช้เท่านั้นfIdหรือไม่ ถ้าเป็นเช่นนั้นแน่นอนว่าจะไม่ถูกต้อง หรือฉันกำลังอ่านเอาต์พุตแฟล็กการติดตามผิด? Plan for computation: CSelCalcExpressionComparedToExpression( QCOL: [ar].fId x_cmpEq QCOL: …

2
เหตุใดฟังก์ชัน LEN () จึงประเมินค่าความสำคัญต่ำใน SQL Server 2014
ฉันมีตารางที่มีคอลัมน์สตริงและเพรดิเคตที่ตรวจสอบแถวที่มีความยาวแน่นอน ใน SQL Server 2014 ฉันเห็นการประมาณ 1 แถวโดยไม่คำนึงถึงความยาวที่ฉันกำลังตรวจสอบ นี่เป็นแผนที่แย่มากเพราะมีหลายพันหรือหลายล้านแถวและ SQL Server เลือกที่จะวางตารางนี้ไว้ที่ด้านนอกของลูปที่ซ้อนกัน มีคำอธิบายสำหรับการประมาณค่า cardinality ที่ 1.0003 สำหรับ SQL Server 2014 หรือไม่ในขณะที่ SQL Server 2012 ประมาณ 31,622 แถว มีวิธีแก้ปัญหาที่ดีหรือไม่? นี่คือการทำซ้ำสั้น ๆ ของปัญหา: -- Create a table with 1MM rows of dummy data CREATE TABLE #customers (cust_nbr VARCHAR(10) NOT NULL) GO INSERT …

2
เหตุใดแบบสอบถามย่อยจึงลดการประมาณแถวเป็น 1
พิจารณาแบบสอบถามที่ประดิษฐ์ แต่เรียบง่ายต่อไปนี้: SELECT ID , CASE WHEN ID <> 0 THEN (SELECT TOP 1 ID FROM X_OTHER_TABLE) ELSE (SELECT TOP 1 ID FROM X_OTHER_TABLE_2) END AS ID2 FROM X_HEAP; ฉันคาดว่าการประมาณการแถวสุดท้ายสำหรับเคียวรีนี้จะเท่ากับจำนวนแถวในX_HEAPตาราง สิ่งที่ฉันทำในแบบสอบถามย่อยไม่ควรสำคัญกับการประมาณแถวเพราะมันไม่สามารถกรองแถวใด ๆ ออกได้ อย่างไรก็ตามใน SQL Server 2016 ฉันเห็นการประมาณแถวลดลงเป็น 1 เนื่องจากแบบสอบถามย่อย: ทำไมสิ่งนี้ถึงเกิดขึ้น ฉันจะทำอะไรได้บ้าง มันง่ายมากที่จะทำซ้ำปัญหานี้ด้วยไวยากรณ์ที่ถูกต้อง นี่คือคำจำกัดความของตารางหนึ่งชุดที่จะทำ: CREATE TABLE dbo.X_HEAP (ID INT NOT …

2
Cardinality Estimate สำหรับผู้ประกอบการ LIKE (ตัวแปรท้องถิ่น)
ฉันรู้สึกว่าเมื่อใช้ตัวLIKEดำเนินการในการปรับให้เหมาะสมสำหรับสถานการณ์ที่ไม่รู้จักทั้งมรดกและ CE ใหม่ใช้ประมาณการ 9% (สมมติว่ามีสถิติที่เกี่ยวข้องพร้อมใช้งานและเครื่องมือเพิ่มประสิทธิภาพการสืบค้นไม่จำเป็นต้องคาดเดาการเลือก) เมื่อดำเนินการค้นหาด้านล่างกับฐานข้อมูลเครดิตฉันได้รับการประมาณการที่แตกต่างกันภายใต้ CE ที่แตกต่างกัน ภายใต้ CE ใหม่ฉันได้รับการประมาณ 900 แถวซึ่งฉันคาดหวังภายใต้ CE ดั้งเดิมฉันได้รับการประมาณ 241.416 และฉันไม่สามารถทราบได้ว่าการประเมินนี้มาจากอะไร มีใครสามารถที่จะหลั่งน้ำตาแสงใด ๆ ? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = …

2
เหตุใดผู้ดำเนินการเชื่อมต่อจึงประมาณค่าแถวน้อยกว่าอินพุต
ในตัวอย่างแบบสอบถามแผนต่อไปนี้ดูเหมือนว่าชัดเจนว่าการประมาณแถวสำหรับConcatenationผู้ประกอบการควรเป็น~4.3 billion rowsหรือผลรวมของแถวประมาณการสำหรับสองอินพุต อย่างไรก็ตามมีการประมาณค่าการ~238 million rowsผลิตซึ่งนำไปสู่การเพิ่มประสิทธิภาพย่อยSort/ Stream Aggregateกลยุทธ์ที่กระจายข้อมูลหลายร้อย GB ไปยัง tempdb การประมาณที่สอดคล้องกันอย่างมีเหตุผลในกรณีนี้จะทำให้เกิด a Hash Aggregateลบการรั่วไหลและเพิ่มประสิทธิภาพของแบบสอบถาม นี่เป็นข้อบกพร่องใน SQL Server 2014 หรือไม่ มีสถานการณ์ที่ถูกต้องหรือไม่ที่การประมาณการต่ำกว่าอินพุทอาจมีเหตุผลหรือไม่? วิธีแก้ไขปัญหาใดบ้างที่อาจมีอยู่ นี่คือแผนแบบสอบถามเต็มรูปแบบ (ไม่ระบุชื่อ) ฉันไม่สามารถดูแลระบบเข้าถึงเซิร์ฟเวอร์นี้เพื่อให้เอาต์พุตจากQUERYTRACEON 2363หรือแฟล็กการติดตามที่คล้ายกัน แต่อาจสามารถรับเอาต์พุตเหล่านี้จากผู้ดูแลระบบหากพวกเขาจะเป็นประโยชน์ ฐานข้อมูลอยู่ในระดับความเข้ากันได้ 120 ดังนั้นจึงใช้เครื่องมือประมาณการ Cardinality ใหม่ของ SQL Server 2014 สถิติจะถูกอัพเดตด้วยตนเองทุกครั้งที่มีการโหลดข้อมูล เมื่อพิจารณาจากปริมาณข้อมูลเรากำลังใช้อัตราการสุ่มตัวอย่างเริ่มต้น เป็นไปได้ว่าอัตราการสุ่มตัวอย่างที่สูงขึ้น (หรือFULLSCAN) อาจมีผลกระทบ

3
ทำไมการเข้าร่วม cardinality นี้จึงมีขนาดใหญ่มาก?
ฉันกำลังประสบกับสิ่งที่ฉันคิดว่ามีค่าระดับความเป็นหัวใจสูงสำหรับการค้นหาต่อไปนี้: SELECT dm.PRIMARY_ID FROM ( SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID FROM X_DRIVING_TABLE dt LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID ) …

1
คำเตือนในแผนแบบสอบถาม“ Cardinality Estimate”
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 แบบสอบถามด้านบนมีคำเตือนในแผนแบบสอบถาม <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> ทำไมถึงมีคำเตือน? นักแสดงในรายการฟิลด์จะมีผลต่อการประมาณค่า cardinality อย่างไร

1
SQL Server 2014 COUNT (DISTINCT x) ละเว้นเวกเตอร์ความหนาแน่นของสถิติสำหรับคอลัมน์ x
สำหรับสิ่งCOUNT(DISTINCT)ที่มีค่าแตกต่างกัน ~ 1 พันล้านครั้งฉันได้รับแผนคิวรีที่มีการรวมแฮชที่คาดว่าจะมีแถวเพียง 3 ล้านแถวเท่านั้น ทำไมสิ่งนี้จึงเกิดขึ้น SQL Server 2012 สร้างการประมาณการที่ดีดังนั้นนี่เป็นข้อบกพร่องใน SQL Server 2014 ที่ฉันควรรายงานเกี่ยวกับการเชื่อมต่อหรือไม่ แบบสอบถามและประมาณการที่ไม่ดี -- Actual rows: 1,011,719,166 -- SQL 2012 estimated rows: 1,079,130,000 (106% of actual) -- SQL 2014 estimated rows: 2,980,240 (0.29% of actual) SELECT COUNT(DISTINCT factCol5) FROM BigFactTable OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this …

1
การประเมินภาวะเชิงหัวใจนอกฮิสโตแกรม
ติดตั้ง ฉันมีปัญหาในการทำความเข้าใจการประเมินความสำคัญเชิงหัวใจ นี่คือการตั้งค่าการทดสอบของฉัน: เวอร์ชัน 2010 ของฐานข้อมูล Stack Overflow SQL Server 2017 CU15 + GDR (KB4505225) - 14.0.3192.2 CE ใหม่ (ระดับความเข้ากันได้ 140) ฉันมี proc นี้: USE StackOverflow2010; GO CREATE OR ALTER PROCEDURE #sp_PostsByCommentCount @CommentCount int AS BEGIN SELECT * FROM dbo.Posts p WHERE p.CommentCount = @CommentCount OPTION (RECOMPILE); END; GO ไม่มีดัชนีหรือสถิติที่ไม่ใช่คลัสเตอร์ในdbo.Postsตาราง …

1
เรียงลำดับการรั่วไหลไปยัง tempdb แต่แถวโดยประมาณจะเท่ากับแถวจริง
บน SQL Server 2016 SP2 ที่มีหน่วยความจำสูงสุดตั้งไว้ที่ 25GB เรามีแบบสอบถามที่ดำเนินการประมาณ 80 ครั้งในหนึ่งนาที แบบสอบถามรั่วไหลประมาณ 4,000 หน้าไปยัง tempdb ซึ่งทำให้ IO จำนวนมากบนดิสก์ของ tempdb เมื่อคุณดูที่แผนแบบสอบถาม (แบบสอบถามแบบง่าย) คุณจะเห็นว่าจำนวนแถวโดยประมาณเท่ากับจำนวนแถวจริง แต่ยังคงเกิดการรั่วไหล ดังนั้นสถิติที่ล้าสมัยไม่สามารถเป็นสาเหตุของปัญหาได้ ฉันทำการทดสอบและแบบสอบถามต่อไปนี้รั่วไหลไปยัง Tempdb: select id --uniqueidentifier from SortProblem where [status] ='A' order by SequenceNumber asc option (maxdop 1) แต่ถ้าฉันเลือกคอลัมน์อื่นจะไม่มีการรั่วไหลเกิดขึ้น: select startdate --datetime from SortProblem where [status] ='A' order …

1
การประมาณค่าСardinalityของภาคที่ครอบคลุมบางส่วน
ในขณะนี้ฉันกำลังพยายามหาวิธีที่ SQL Server จะประเมินความสำคัญของช่วงของเพรดิเคตที่ครอบคลุมขั้นตอนฮิสโตแกรมบางส่วน บนอินเทอร์เน็ตด้วยความคิดเชิงสถิติสำหรับการคำนวณแบบตามลำดับขั้นและสถิติที่มีค่าฉันพบคำถามที่คล้ายกันและ Paul White ให้คำตอบที่น่าสนใจ ตามคำตอบของ Paul สูตรการประมาณค่า cardinality สำหรับ predicates> = และ> (ในกรณีนี้ฉันสนใจเฉพาะรุ่นตัวประมาณ Cardinality อย่างน้อย 120) ดังนี้: สำหรับ>: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1))) สำหรับ> =: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1)) ฉันทดสอบแอปพลิเคชันของสูตรเหล่านี้ในตาราง[การผลิต]. [TransactionHistory]ตารางของฐานข้อมูลAdventureWorks2014ตามกริยาช่วงโดยใช้คอลัมน์TransactionDateและช่วงวันที่และเวลาระหว่าง …

2
ปัญหาการประมาณค่าเชิง Cardinality ของการเข้าร่วมวงใน
ฉันพยายามเข้าใจว่าทำไมการประมาณแถวจึงผิดอย่างยิ่งนี่คือกรณีของฉัน: เข้าร่วมง่าย - โดยใช้ SQL Server 2016 sp2 (ปัญหาเดียวกันใน sp1), dbcompatiblity = 130 select Amount_TransactionCurrency_id, CurrencyShareds.id from CurrencyShareds INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id option (QUERYTRACEON 3604, QUERYTRACEON 2363); SQL ประมาณ 1 แถวโดยที่ 107131 และเลือกวนซ้ำซ้อนกัน ( ลิงก์ไปยังแผน ) หลังจากอัปเดตสถิติใน CurrencyShared แล้วการประมาณการก็ใช้ได้และการเลือกผสานเข้าร่วม ( ลิงก์ไปยังแผนใหม่ ) ทันทีที่มีการเพิ่มเพียงหนึ่งระเบียนใน CurrencyShareds สถิติก็จะกลายเป็น "เก่า" และ …

1
การเปลี่ยนแปลงค่าประมาณของเพรดิเคตที่มี SUBSTRING () ใน SQL Server 2016 หรือไม่
มีเอกสารหรืองานวิจัยใดเกี่ยวกับการเปลี่ยนแปลงใน SQL Server 2016 ถึงความคาดการณ์ของ cardinality สำหรับเพรดิเคตที่มี SUBSTRING () หรือฟังก์ชันสตริงอื่น ๆ หรือไม่? เหตุผลที่ฉันถามคือฉันกำลังดูคิวรีที่ประสิทธิภาพลดลงในโหมดความเข้ากันได้ 130 และสาเหตุที่เกี่ยวข้องกับการเปลี่ยนแปลงในการประมาณจำนวนแถวที่ตรงกับส่วนคำสั่ง WHERE ที่มีการเรียกไปยัง SUBSTRING () ฉันแก้ไขปัญหาด้วยการเขียนแบบสอบถามใหม่ แต่สงสัยว่าถ้าใครรู้เรื่องเอกสารเกี่ยวกับการเปลี่ยนแปลงในพื้นที่นี้ใน SQL Server 2016 รหัสการสาธิตอยู่ด้านล่าง ค่าประมาณใกล้เคียงกันมากในกรณีทดสอบนี้ แต่ความแม่นยำนั้นขึ้นอยู่กับข้อมูล ในกรณีทดสอบในระดับที่เข้ากันได้ 120, SQL Server ดูเหมือนจะใช้ฮิสโตแกรมสำหรับการประมาณการในขณะที่ในระดับที่เข้ากันได้ 130 SQL Server ดูเหมือนจะสมมติว่า 10% คงที่ของตารางที่ตรงกัน CREATE DATABASE MyStringTestDB; GO USE MyStringTestDB; GO DROP TABLE IF EXISTS dbo.StringTest; …

1
เครื่องมือเพิ่มประสิทธิภาพของ SQL Server ประมาณจำนวนแถวในตารางที่เข้าร่วมอย่างไร
ฉันใช้คำค้นหานี้ในฐานข้อมูลAdventureWorks2012 : SELECT s.SalesOrderID, d.CarrierTrackingNumber, d.ProductID, d.OrderQty FROM Sales.SalesOrderHeader s JOIN Sales.SalesOrderDetail d ON s.SalesOrderID = d.SalesOrderID WHERE s.CustomerID = 11077 ถ้าฉันดูแผนการดำเนินการโดยประมาณฉันจะเห็นสิ่งต่อไปนี้: การค้นหาดัชนีเริ่มต้น (ด้านบนขวา) ใช้ดัชนี IX_SalesOrderHeader_CustomerID และค้นหาตามตัวอักษร 11077 โดยมีค่าประมาณ 2.6192 แถว ถ้าฉันใช้DBCC SHOW_STATISTICS ('Sales.SalesOrderHeader', 'IX_SalesOrderHeader_CustomerID') WITH HISTOGRAMมันแสดงว่าค่า 11077 อยู่ระหว่างสองคีย์ตัวอย่าง 11019 และ 11091 จำนวนเฉลี่ยของแถวที่แตกต่างระหว่าง 11019 และ 11091 คือ 2.619718 หรือปัดเศษเป็น 2.61972 …

3
ค้นหา 100x ช้าลงใน SQL Server 2014 แถว Row Spool ประมาณผู้ร้ายหรือไม่
ฉันมีแบบสอบถามที่วิ่งใน800 มิลลิวินาทีใน SQL Server 2012และใช้เวลาประมาณ170 วินาทีใน SQL Server 2014 ฉันคิดว่าฉันได้ จำกัด เรื่องนี้ให้แคบลงเพื่อประเมินความน่าจะเป็นของRow Count Spoolผู้ให้บริการ ฉันได้อ่านเกี่ยวกับตัวดำเนินการสปูลแล้ว (เช่นที่นี่และที่นี่ ) แต่ฉันยังคงมีปัญหาในการทำความเข้าใจบางสิ่ง: เหตุใดแบบสอบถามนี้จึงต้องการRow Count Spoolผู้ดำเนินการ ฉันไม่คิดว่ามันจำเป็นสำหรับความถูกต้องดังนั้นสิ่งที่พยายามเพิ่มประสิทธิภาพโดยเฉพาะคืออะไร? เหตุใด SQL Server จึงประมาณว่าการเข้าร่วมกับRow Count Spoolผู้ดำเนินการลบแถวทั้งหมดออก นี่เป็นข้อบกพร่องใน SQL Server 2014 หรือไม่ ถ้าเป็นเช่นนั้นฉันจะยื่นในการเชื่อมต่อ แต่ฉันต้องการความเข้าใจที่ลึกซึ้งยิ่งขึ้นก่อน หมายเหตุ: ฉันสามารถเขียนแบบสอบถามอีกครั้งเป็นLEFT JOINหรือเพิ่มดัชนีลงในตารางเพื่อให้ได้ประสิทธิภาพที่ยอมรับได้ทั้งใน SQL Server 2012 และ SQL Server 2014 ดังนั้นคำถามนี้เกี่ยวกับการทำความเข้าใจแบบสอบถามเฉพาะและแผนในเชิงลึกมากขึ้น วิธีวลีที่ค้นหาแตกต่างกัน แบบสอบถามช้า ดูPastebin นี้สำหรับสคริปต์ทดสอบฉบับเต็ม …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.