คำถามติดแท็ก execution-plan

กลยุทธ์ที่เลือกโดยเครื่องมือเพิ่มประสิทธิภาพคิวรีเพื่อประมวลผลแบบสอบถาม

4
ทำไมคำถามของฉันจึงช้ากว่าเมื่อวานเมื่อวาน?
[Memorial ~] (เลือกหนึ่งอัน) [ ] Well trained professional, [ ] Casual reader, [ ] Hapless wanderer, ฉันมี(เลือกทุกข้อที่ใช่) [ ] query [ ] stored procedure [ ] database thing maybe ที่ทำงานได้ดี(ถ้ามี) [ ] yesterday [ ] in recent memory [ ] at some point แต่ตอนนี้ช้าลงทันที ฉันได้ตรวจสอบแล้วเพื่อให้แน่ใจว่าไม่ได้ถูกบล็อกและไม่ใช่เหยื่อของงานการบำรุงรักษารายงานหรือกระบวนการนอกแบนด์ที่ยาวนาน ปัญหาคือสิ่งที่ฉันควรทำอย่างไรและฉันสามารถให้ข้อมูลใดได้บ้างเพื่อรับความช่วยเหลือ [*Insert appropriate closing remarks*]

4
ดัชนีค้นหา vs สแกนดัชนี
ดูที่แผนการดำเนินการของคิวรีที่รันช้าและฉันสังเกตว่าบางโหนดเป็นดรรชนีและบางอันก็สแกนดรรชนี ความแตกต่างระหว่างกับการค้นหาดัชนีและการสแกนดัชนีคืออะไร? แบบไหนดีกว่ากัน? SQL จะเลือกอย่างใดอย่างหนึ่งได้อย่างไร ฉันรู้ว่านี่คือคำถาม 3 ข้อ แต่ฉันคิดว่าการตอบคำถามแรกจะอธิบายคำถามอื่น ๆ

3
การอนุญาตหน่วยความจำเรียงมากเกินไป
เหตุใดแบบสอบถามแบบง่ายนี้จึงได้รับหน่วยความจำมากมาย -- Demo table CREATE TABLE dbo.Test ( TID integer IDENTITY NOT NULL, FilterMe integer NOT NULL, SortMe integer NOT NULL, Unused nvarchar(max) NULL, CONSTRAINT PK_dbo_Test_TID PRIMARY KEY CLUSTERED (TID) ); GO -- 100,000 example rows INSERT dbo.Test WITH (TABLOCKX) (FilterMe, SortMe) SELECT TOP (100 * 1000) CHECKSUM(NEWID()) % 1000, …

3
พารามิเตอร์การดมกลิ่นเทียบกับตัวแปรเทียบกับการคอมไพล์ vs ออปติไมซ์สำหรับ UNKNOWN
ดังนั้นเราจึงใช้เวลานาน proc ทำให้เกิดปัญหาเมื่อเช้านี้ (30 วินาที + เวลาทำงาน) เราตัดสินใจตรวจสอบเพื่อดูว่าการดมพารามิเตอร์เป็นการตำหนิหรือไม่ ดังนั้นเราเขียน proc ใหม่และตั้งค่าพารามิเตอร์ขาเข้าเป็นตัวแปรเพื่อกำจัดพารามิเตอร์การดมกลิ่น วิธีการทดลอง / จริง แบมปรับปรุงเวลาแบบสอบถาม (น้อยกว่า 1 วินาที) เมื่อดูที่แผนแบบสอบถามการปรับปรุงจะพบในดัชนีที่ไม่ได้ใช้ เพียงเพื่อยืนยันว่าเราไม่ได้รับผลบวกผิดพลาดเราได้ dbcc freeproccache ใน proc และรันซ้ำเพื่อดูว่าผลลัพธ์ที่ได้รับการปรับปรุงจะเหมือนเดิมหรือไม่ แต่เพื่อความประหลาดใจของเรา proc ดั้งเดิมยังคงทำงานช้า เราลองอีกครั้งด้วย WITH RECOMPILE ยังคงช้า (เราลองคอมไพล์อีกครั้งในการโทรไปยัง proc และภายใน proc itelf) เรายังรีสตาร์ทเซิร์ฟเวอร์ (เห็นได้ชัดว่ากล่อง dev) ดังนั้นคำถามของฉันคือสิ่งนี้ ... พารามิเตอร์การดมกลิ่นสามารถตำหนิได้อย่างไรเมื่อเราได้รับแบบสอบถามช้าแบบเดียวกันกับแคชแผนว่างเปล่า ... ไม่ควรมีพารามิเตอร์ใด ๆ ในการดมกลิ่น ??? เรากำลังได้รับผลกระทบจากสถิติตารางที่ไม่เกี่ยวข้องกับแคชแผนหรือไม่ และถ้าเป็นเช่นนั้นทำไมการตั้งค่าพารามิเตอร์ขาเข้าเป็นตัวแปรช่วยได้อย่างไร …

3
พื้นฐานการดำเนินการตามแผน - ความสับสนของการจับคู่แฮช
ฉันเริ่มเรียนรู้แผนการดำเนินการและสับสนเกี่ยวกับวิธีการทำงานของแฮชที่ตรงกันและทำไมจึงต้องใช้ในการเข้าร่วมง่ายๆ select Posts.Title, Users.DisplayName From Posts JOIN Users on Posts.OwnerUserId = Users.Id OPTION (MAXDOP 1) ตามที่ฉันเข้าใจแล้วผลลัพธ์ของการสแกนดัชนีสูงสุดจะกลายเป็นแฮชและแต่ละแถวในดัชนีสแกนคลัสเตอร์ด้านล่างจะค้นหา ฉันเข้าใจว่าตารางแฮชทำงานอย่างน้อยในระดับหนึ่ง แต่ฉันสับสนเกี่ยวกับค่าที่ได้รับการแฮชในตัวอย่างเช่นนี้ สิ่งที่จะทำให้ฉันรู้สึกว่าเป็นเขตข้อมูลทั่วไประหว่างพวกเขารหัสถูกแฮช - แต่ถ้าเป็นกรณีนี้ทำไมจำนวนแฮช?

2
TOP (และทำไม) ส่งผลกระทบต่อแผนการดำเนินการอย่างไร
สำหรับข้อความค้นหาที่ซับซ้อนปานกลางที่ฉันพยายามปรับให้เหมาะสมฉันสังเกตว่าการลบTOP nคำสั่งเปลี่ยนแผนการดำเนินการ ฉันจะเดาว่าเมื่อเคียวรีมีเอ็นจินTOP nฐานข้อมูลจะรันเคียวรีโดยไม่สนใจTOPคำสั่งและจากนั้นในตอนท้ายก็ลดขนาดของผลลัพธ์ที่กำหนดไว้เป็นจำนวนแถวnที่ถูกร้องขอ แผนการดำเนินการกราฟิกดูเหมือนว่าจะระบุว่าเป็นกรณีนี้ - TOPเป็นขั้นตอน "สุดท้าย" แต่ดูเหมือนว่าจะเกิดขึ้นมากขึ้น คำถามของฉันคือประโยค TOP และ N มีผลอย่างไรต่อแผนการดำเนินการของแบบสอบถาม นี่เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งที่เกิดขึ้นในกรณีของฉัน: แบบสอบถามกำลังจับคู่แถวจากสองตาราง A และ B โดยไม่ต้องTOPเป็นไปตามข้อเพิ่มประสิทธิภาพประเมินจะมี 19k แถวจากตารางและ 46K แถวจากตาราง B. จำนวนที่เกิดขึ้นจริงของแถวกลับเป็น 16k สำหรับ A และ 13k สำหรับการแข่งขันบีกัญชาจะใช้ในการเข้าร่วมทั้งสองชุดผลลัพธ์ รวม 69 แถว (จากนั้นจะใช้การเรียงลำดับ) แบบสอบถามนี้เกิดขึ้นอย่างรวดเร็วมาก เมื่อฉันเพิ่มTOP 1001เครื่องมือเพิ่มประสิทธิภาพไม่ได้ใช้แฮชจับคู่; แต่ก่อนจะเรียงลำดับผลลัพธ์จากตาราง A (ประมาณเดียวกัน / เป็นจริงของ 19k / 16k) และทำการวนซ้ำซ้อนกับตาราง B จำนวนแถวของตาราง …

2
การปรับแผนให้เหมาะสมด้วยตัวอ่าน XML
ดำเนินการค้นหาจากที่นี่เพื่อดึงเหตุการณ์ deadlock ออกจากเซสชันเพิ่มเติมของเหตุการณ์ที่ขยายเริ่มต้น SELECT CAST ( REPLACE ( REPLACE ( XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph FROM (SELECT CAST (target_data AS XML) AS TargetData FROM sys.dm_xe_session_targets st JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address WHERE [name] = 'system_health') AS Data CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS …

2
การใช้ข้อยกเว้นในนิพจน์ตารางแบบเรียกซ้ำ
เหตุใดแบบสอบถามต่อไปนี้จึงส่งกลับแถวที่ไม่มีที่สิ้นสุด ฉันคาดว่าจะมีEXCEPTประโยคที่จะยุติการสอบถามซ้ำ .. with cte as ( select * from ( values(1),(2),(3),(4),(5) ) v (a) ) ,r as ( select a from cte where a in (1,2,3) union all select a from ( select a from cte except select a from r ) x ) select a from r ฉันเจอสิ่งนี้ในขณะที่พยายามตอบคำถามเกี่ยวกับ …


3
ทำไม SQL Server ใช้แผนการดำเนินการที่ดีขึ้นเมื่อฉันอินไลน์ตัวแปร
ฉันมีแบบสอบถาม SQL ที่ฉันพยายามปรับให้เหมาะสม: DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962' SELECT Id, MIN(SomeTimestamp), MAX(SomeInt) FROM dbo.MyTable WHERE Id = @Id AND SomeBit = 1 GROUP BY Id MyTable มีสองดัชนี: CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes ON dbo.MyTable (SomeTimestamp ASC) INCLUDE(Id, SomeInt) CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes ON dbo.MyTable (Id, SomeBit) INCLUDE (TotallyUnrelatedTimestamp) เมื่อฉันดำเนินการแบบสอบถามตรงตามที่เขียนไว้ข้างต้น SQL Server …

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: …

3
ดัชนีบนคอลัมน์ที่คำนวณแล้วต้องการค้นหาคีย์เพื่อรับคอลัมน์ในนิพจน์ที่คำนวณ
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 6 ปีที่แล้ว ฉันมีคอลัมน์ที่คำนวณแล้วยังคงอยู่บนโต๊ะซึ่งเป็นเพียงคอลัมน์ที่ต่อกันเช่น CREATE TABLE dbo.T ( ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY, A VARCHAR(20) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, D DATE NULL, E VARCHAR(20) NULL, Comp AS A + '-' + …

1
มีความเสี่ยงใด ๆ หรือไม่ในการให้สิทธิ์ผู้ใช้ SQL Server SHOWPLAN
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ฉันกำลังปรับแต่งประสิทธิภาพบางอย่างบนฐานข้อมูล SQL Server 2008 ขนาดใหญ่และกลุ่มไอทีไม่ต้องการให้สิทธิ์ SHOWPLAN ในอดีต "แสดงแผนการดำเนินการ" เป็นวิธีที่มีประสิทธิภาพที่สุดในการทำความเข้าใจประสิทธิภาพของคำสั่งและขั้นตอนต่างๆ มีความเสี่ยงอะไรบ้างในการให้สิทธิ์นี้ มีเหตุผลที่ถูกต้องสำหรับข้อ จำกัด นี้ในสำเนาการพัฒนาของฐานข้อมูลหรือไม่? หมายเหตุ: กลุ่ม SQL IT นี้มีฐานข้อมูลมากกว่า 200 รายการภายใต้อินสแตนซ์ SQL Server เดียว ขอบคุณ คำตอบ : ฉันกำลังขาดการตอบสนองหมายความว่าไม่มีความเสี่ยงด้านความปลอดภัยที่สำคัญนอกเหนือจากที่ระบุไว้ด้านล่าง โดยทั่วไปการ จำกัด สิ่งนี้ไว้ในฐานข้อมูลการพัฒนานั้นเป็นการต่อต้าน ฉันจะอัปเดตสิ่งนี้หากมีคำตอบที่ดีกว่า ขอบคุณสำหรับความคิดเห็นของคุณ!

1
SQL Server แคชผลลัพธ์ของฟังก์ชันหลายค่าในตารางหรือไม่?
ฟังก์ชั่นมูลค่าตารางหลายงบส่งกลับผลลัพธ์ในตัวแปรตาราง ผลลัพธ์เหล่านี้เคยถูกนำมาใช้ซ้ำหรือฟังก์ชั่นจะถูกประเมินอย่างเต็มที่ทุกครั้งที่มีการเรียกใช้หรือไม่

1
การสแกนค่าคงที่และการเข้าร่วม Outer Left มาจากที่ใดในแผนคิวรี SELECT ที่สำคัญ
ฉันมีตารางนี้: CREATE TABLE [dbo].[Accounts] ( [AccountId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID(), -- WHATEVER other columns ); GO CREATE UNIQUE CLUSTERED INDEX [AccountsIndex] ON [dbo].[Accounts]([AccountId] ASC); GO แบบสอบถามนี้: DECLARE @result UNIQUEIDENTIFIER SELECT @result = AccountId FROM Accounts WHERE AccountId='guid-here' ดำเนินการกับแผนแบบสอบถามประกอบด้วยดัชนีแสวงหาเดียว - ตามที่คาดไว้: SELECT <---- Clustered Index Seek แบบสอบถามนี้ไม่เหมือนกัน: DECLARE @result …

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