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

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

1
คอลัมน์ที่คำนวณอย่างต่อเนื่องทำให้เกิดการสแกน
การแปลงคอลัมน์ปกติเป็นคอลัมน์ที่คำนวณแล้วยังคงเป็นสาเหตุให้แบบสอบถามนี้ไม่สามารถค้นหาดัชนีได้ ทำไม? ทดสอบกับ SQL Server หลายเวอร์ชันรวมถึง 2016 SP1 CU1 Repros ด้วยคอลัมน์ที่คำนวณ ด้วยคอลัมน์ปกติ ปัญหาคือมี,table1col7 ตารางและแบบสอบถามเป็นต้นฉบับบางส่วน (และง่าย) ของต้นฉบับ ฉันทราบว่าคำถามอาจถูกเขียนใหม่แตกต่างกันและด้วยเหตุผลบางอย่างหลีกเลี่ยงปัญหา แต่เราจำเป็นต้องหลีกเลี่ยงการสัมผัสรหัสและคำถามที่ว่าทำไมtable1ไม่สามารถค้นหายังคงยืนอยู่ ดังที่ Paul White แสดงให้เห็น (ขอบคุณ!) การแสวงหานั้นจะเกิดขึ้นหากถูกบังคับดังนั้นคำถามคือ: ทำไมเครื่องมือเพิ่มประสิทธิภาพจึงไม่ได้ถูกเลือกโดยเครื่องมือเพิ่มประสิทธิภาพและไม่ว่าเราจะสามารถทำสิ่งที่แตกต่างออกไป รหัส? เพื่อชี้แจงส่วนที่มีปัญหานี่คือการสแกนที่เกี่ยวข้องในแผนการดำเนินการที่ไม่ดี:

3
แผนการดำเนินการไม่ได้ใช้ INDEX แต่ใช้การสแกนตาราง
ฉันรู้ว่าเมื่อใช้ดัชนีหรือการสแกนตาราง SQL Server จะใช้สถิติเพื่อดูว่าอันไหนดีกว่า ฉันมีตารางที่มี 20 ล้านแถว ฉันมีดัชนีใน (SnapshotKey, การวัด) และแบบสอบถามนี้: select Measure, SnapshotKey, MeasureBand from t1 where Measure = 'FinanceFICOScore' group by Measure, SnapshotKey, MeasureBand แบบสอบถามส่งคืนแถว 500k ดังนั้นแบบสอบถามจึงเลือกเพียง 2.5% ของแถวของตาราง คำถามคือทำไม SQL Server ไม่ใช้ดัชนี nonclustered ฉันมีและใช้การสแกนตารางแทน? มีการอัพเดทสถิติ ดีที่จะพูดถึงว่าประสิทธิภาพของแบบสอบถามนั้นดี สแกนตาราง ดัชนีบังคับ โครงสร้างตาราง / ดัชนี CREATE TABLE [t1]( [SnapshotKey] [int] NOT …

2
ทำไมการดำเนินการ TOP ในแผนการดำเนินการ SQL
หลังจากค้นหาไปสักพักหนึ่งฉันตัดสินใจที่จะโพสต์คำถามนี้เพื่อหาคำตอบและขออภัยหากมีคำถาม / คำตอบที่คล้ายกัน เมื่อเรียกใช้คิวรีด้านล่างของเซิร์ฟเวอร์ SQL สองตัวที่คล้ายกันเราพบแผนการดำเนินการที่แตกต่างกันซึ่งมีผลต่อประสิทธิภาพและเราต้องการความช่วยเหลือในการหาสาเหตุ แบบสอบถาม: SELECT process_id INTO #temp FROM revrep_revenue_fact WHERE process_id = 284 DROP TABLE #temp แผนการดำเนินการของเซิร์ฟเวอร์ A แผนการดำเนินการของเซิร์ฟเวอร์ B เซิร์ฟเวอร์ B http://s2.postimg.org/z9fjrfv4n/server_B.png คุณจะสังเกตเห็นว่าเซิร์ฟเวอร์ B มีการดำเนินการทางกายภาพสูงสุดในแผนการดำเนินการจริงและเรากำลังพยายามหาสาเหตุ แบบสอบถามทั้งสองใช้ดัชนีเดียวกันในดัชนีค้นหา นี่คือรายละเอียดบางอย่างของเซิร์ฟเวอร์ A และเซิร์ฟเวอร์ B เซิร์ฟเวอร์ A และ B เป็นทั้งคู่ Windows Server 2008 R2 Standard Service Pack 1 RAM 24GB …

1
ทำไม SELECT COUNT () แผนการดำเนินการแบบสอบถามรวมตารางเข้าร่วมด้านซ้าย
ใน SQL Server 2012 ฉันมีตารางที่มีฟังก์ชั่นที่มีค่าเมื่อเข้าร่วมกับตารางอื่นฉันต้องนับจำนวนแถวสำหรับ 'ฟังก์ชั่นที่มีค่าของตาราง' เมื่อฉันตรวจสอบแผนการดำเนินการฉันจะเห็นตารางเข้าร่วมด้านซ้าย ทำไม? การเข้าร่วมตารางด้านซ้ายจะมีผลต่อจำนวนแถวที่คืนกลับอย่างไร ฉันคาดหวังว่าโปรแกรม db ไม่จำเป็นต้องประเมินตารางร่วมด้านซ้ายในแบบสอบถามจำนวน count (.. ) Select count(realtyId) FROM [dbo].[GetFilteredRealtyFulltext]('"praha"') แผนการดำเนินการ: ฟังก์ชั่นมูลค่าตาราง: CREATE FUNCTION [dbo].[GetFilteredRealtyFulltext] (@criteria nvarchar(4000)) RETURNS TABLE AS RETURN (SELECT realty.Id AS realtyId, realty.OwnerId, realty.Caption AS realtyCaption, realty.BusinessCategory, realty.Created, realty.LastChanged, realty.LastChangedType, realty.Price, realty.Pricing, realty.PriceCurrency, realty.PriceNote, realty.PricePlus, realty.OfferState, realty.OrderCode, realty.PublishAddress, …

3
“ FETCH API_CURSOR0000 …” มากมายบน sp_WhoIsActive (SQL Server 2008 R2)
ฉันมีสถานการณ์ที่แปลก ใช้sp_whoisactiveฉันเห็นสิ่งนี้: ตกลงด้วยคำถามนี้ฉันสามารถเห็นสิ่งที่เรียก (คำนี้มีอยู่ในภาษาอังกฤษ?) มัน: SELECT c.session_id, c.properties, c.creation_time, c.is_open, t.text FROM sys.dm_exec_cursors (SPID) c --0 for all cursors running CROSS APPLY sys.dm_exec_sql_text (c.sql_handle) t ผลลัพธ์: selectมันเป็นเรื่องง่าย ทำไมถึงใช้ f etch_cursor? นอกจากนี้ฉันเห็น sql_texts "blank" จำนวนมากด้วย สิ่งนี้มีบางอย่างกับ "เคอร์เซอร์" นี้หรือไม่? DBCC INPUTBUFFER (spid) แสดงให้ฉันเห็นนี้: มีคำถามนี้ที่ นี่ (ทำโดยฉัน) แต่ฉันไม่รู้ว่านี่เป็นสิ่งเดียวกันหรือไม่ EDIT1: เมื่อใช้เคียวรีที่จัดทำโดยญาติฉันเห็นสิ่งนี้ EDIT2: ใช้การตรวจสอบกิจกรรมฉันสามารถเห็นสิ่งนี้: มันเป็นข้อความค้นหาที่แพงที่สุด …

2
Simple DELETE แต่แผนการดำเนินการที่ซับซ้อน
เมื่อฉันเรียกใช้การลบนี้: DELETE FROM ETLHeaders WHERE ETLHeaderID < 32465870 ... ลบแถวที่ 39,157 ควรง่ายเพราะจะลบ ETLHeaderID ซึ่งเป็นดัชนีคลัสเตอร์และคีย์หลัก แต่ (ตามแผนการดำเนินการ) ดูเหมือนว่าจะมีการกดปุ่ม 361,190 แถวและใช้ดัชนีอื่น ตารางมีเขตข้อมูลที่มีชนิดข้อมูล XML (ในกรณีที่มีผลต่อการลบนี้) ความคิดใดที่เป็นสาเหตุและวิธีที่ฉันสามารถเร่งความเร็วการลบนี้ แผนการดำเนินการที่นี่: http://sharetext.org/qwDY สคีมาของตารางที่นี่: http://sharetext.org/Vl9j ขอบคุณ

1
SentryOne Plan Explorer นับการอ่านเป็น UDF หรือไม่
ฉันมีคำถามเช่นนี้ select dbo.fn_complexFunction(t.id) from mytable t ในSQL Sentry Plan Explorerฉันสังเกตเห็นว่าฉันต้องเรียกใช้ Get Estimated Plan เพื่อให้ Query Plan รวมถึง UDF เมื่อเรียกใช้ 'รับแผนจริง' จะไม่ปรากฏว่าการอ่านเชิงตรรกะและตัวชี้วัดอื่น ๆ รวมถึงการดำเนินการที่เกิดขึ้นใน UDF ในกรณีเช่นนี้การแก้ปัญหาเพียงอย่างเดียวในการใช้ Profiler คืออะไร

2
ฉันจะรับแผนปฏิบัติการสำหรับมุมมองได้อย่างไร
ฉันมีสคีมาพร้อมจำนวนการดู ฉันต้องตรวจสอบแผนการดำเนินการเพื่อให้แน่ใจว่ามีการใช้ดัชนีที่เหมาะสมและถูกต้องหรือไม่ ฉันจะทำสิ่งนี้ได้อย่างไร ฉันไม่ต้องการคัดลอกและวางผลลัพธ์จากshow create view <viewname>ลงในexplainโดยเฉพาะอย่างยิ่งเนื่องจากบางมุมมองถูกสร้างขึ้นจากมุมมองอื่นและนี่อาจเป็นความเจ็บปวด

2
รหัสจะสร้างแผนที่แตกต่างเมื่อเรียกใช้ Ad-hoc เทียบกับในขั้นตอนการจัดเก็บ
ฉันมีคำสั่งลบที่ใช้แผนไม่ดีเมื่อเรียกใช้ภายในกระบวนงานที่เก็บไว้ แต่เลือกแผนที่ดีกว่ามากเมื่อเรียกใช้โฆษณา ฉันสร้างดัชนีทั้งหมดใหม่สำหรับตารางที่ใช้โดยแบบสอบถามและทำให้แคชทั้งหมดหายไป เครื่องมือเพิ่มประสิทธิภาพยังคงเลือกแผนผิดสำหรับขั้นตอนการจัดเก็บ ฉันต้องการทราบว่าเพราะเหตุใดเครื่องมือเพิ่มประสิทธิภาพใช้แผนการดำเนินการที่แตกต่างกันสำหรับขั้นตอนการจัดเก็บเทียบกับ ad-hoc SQL UPDATE: ฉันเดาว่ามันต้องเป็นพารามิเตอร์หลังจากทั้งหมด - เมื่อฉันรันโค้ด ad-hoc พร้อมตัวแปร hardcoded ฉันสามารถรับแผน "ไม่ดี" ด้วยค่าที่ถูกต้อง (เป็นวันที่ค่าที่มีอายุหนึ่งปี ดูเหมือนจะสร้างแผน "ดี") ตอนนี้พยายามบังคับแผน "ดี" ใน proc โดยใช้คำใบ้แบบสอบถาม การแก้ไข: ฉันสิ้นสุดการรับแผนที่ฉันต้องการโดยใช้คำแนะนำที่เหมาะสมที่สุดสำหรับคำใบ้ที่ไม่รู้จัก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.