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

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

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

1
ทำไม PostgreSQL จึงเลือกการเข้าร่วมที่มีราคาแพงกว่า?
PostgreSQL ใช้ค่าเริ่มต้นบวก default_statistics_target=1000 random_page_cost=1.5 รุ่น PostgreSQL 10.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.4.0) 6.4.0, 64-bit ฉันดูดและวิเคราะห์แล้ว แบบสอบถามตรงไปตรงมามาก: SELECT r.price FROM account_payer ap JOIN account_contract ac ON ap.id = ac.account_payer_id JOIN account_schedule "as" ON ac.id = "as".account_contract_id JOIN schedule s ON "as".id = s.account_schedule_id JOIN rate r ON s.id = …

3
เหตุใดการเลือกคอลัมน์ผลลัพธ์ทั้งหมดของแบบสอบถามนี้จึงเร็วกว่าการเลือกคอลัมน์เดียวที่ฉันสนใจ
ฉันมีแบบสอบถามที่ใช้select *ไม่เพียง แต่อ่านน้อยลง แต่ยังใช้เวลา CPU น้อยกว่าการใช้select c.Fooอย่างมาก นี่คือแบบสอบถาม: select top 1000 c.ID from ATable a join BTable b on b.OrderKey = a.OrderKey and b.ClientId = a.ClientId join CTable c on c.OrderId = b.OrderId and c.ShipKey = a.ShipKey where (a.NextAnalysisDate is null or a.NextAnalysisDate < @dateCutOff) and b.IsVoided = 0 and …

1
ทำไม LEFT JOIN นี้ถึงทำงานแย่กว่า LEAT JOIN LATERAL มากนัก?
ฉันมีตารางต่อไปนี้ (นำมาจากฐานข้อมูล Sakila): film: film_id คือ pkey นักแสดง: actor_id คือกุญแจ film_actor: film_id และ actor_id เป็น fkeys สำหรับภาพยนตร์ / นักแสดง ฉันกำลังเลือกภาพยนตร์เฉพาะเรื่อง สำหรับหนังเรื่องนี้ฉันต้องการให้นักแสดงทุกคนเข้าร่วมในภาพยนตร์เรื่องนี้ด้วย ฉันมีสองคำสั่งสำหรับการนี้: หนึ่งที่มีและเป็นหนึ่งเดียวกับLEFT JOINLEFT JOIN LATERAL select film.film_id, film.title, a.actors from film left join ( select film_actor.film_id, array_agg(first_name) as actors from actor inner join film_actor using(actor_id) group by film_actor.film_id ) …

1
การสร้างแผนการดำเนินการใน SQL Server เป็นอย่างไร
รับค่าคงที่ดังต่อไปนี้: ฐานข้อมูลเดียวกันที่มีโครงสร้างเดียวกัน (ตารางดัชนี ฯลฯ ) ข้อมูลเดียวกัน SQL Server และการกำหนดค่าฮาร์ดแวร์เดียวกัน สถิติเดียวกัน ตัวเลือก SET เดียวกันในไคลเอนต์ SQL Server เวอร์ชันเดียวกัน แฟล็กการติดตามเดียวกัน เมื่อกำหนดค่าคงที่เหล่านี้แล้ว SQL Server จะสร้างแผนเดียวกันสำหรับแบบสอบถามที่กำหนดหรือไม่ ถ้าไม่มีข้อควรพิจารณาอื่น ๆ อีกไหม? นอกจากนี้ยังมีองค์ประกอบของ nondeterminism ที่ต้องพิจารณาด้วยหรือไม่?

2
sp_executesql รีเฟรชแผนแบบสอบถามเมื่อใด
คุณจะต้องให้อภัยความไร้เดียงสาของฉันเพราะฉันไม่ใช่ DBA แต่ความเข้าใจของฉันคือเมื่อเวลาผ่านไปสถิติของการเปลี่ยนแปลงฐานข้อมูลและกระบวนการจัดเก็บจะต้องถูกคอมไพล์ใหม่เพื่อให้แผนแบบสอบถามเป็นปัจจุบันด้วยสถิติล่าสุด สมมติว่าฉันมีโพรซีเดอร์ที่เก็บไว้ในฐานข้อมูลของฉันซึ่งถูกคอมไพล์กับสถิติล่าสุดในบางช่วงเวลาปกติความหมายของอินไลน์ซับโพรซีเดอร์ที่เก็บในโค้ดและล้อมรอบในsp_executesqlคำสั่งคืออะไร? ฉันจะสูญเสียการรีเฟรชแผนแบบสอบถามที่เคยเกิดขึ้นเป็นส่วนหนึ่งของการคอมไพล์ใหม่ของขั้นตอนหรือไม่ หากมีสิ่งอื่นใด (นอกเหนือจากสิทธิ์) ที่ฉันต้องพิจารณาก่อนที่จะทำการเปลี่ยนแปลงนี้แล้วฉันขอขอบคุณข้อมูลเชิงลึกของคุณ ฉันอ่านสิ่งนี้ใน MSDN: ความสามารถของเครื่องมือเพิ่มประสิทธิภาพการสืบค้น SQL Server เพื่อจับคู่สตริง Transact-SQL ใหม่กับแผนการดำเนินการที่มีอยู่ถูกขัดขวางโดยค่าพารามิเตอร์ที่เปลี่ยนแปลงตลอดเวลาในข้อความของสตริงโดยเฉพาะอย่างยิ่งในงบ Transact-SQL ที่ซับซ้อน ดังนั้นสมมติว่ากระบวนการที่เก็บไว้ฉันพยายาม in-line และ wrap ในsp_executesqlนั้นมีพารามิเตอร์บางอย่างแน่นอนนี่คือการบอกว่าแม้ว่าแผนการดำเนินการของฉันจะถูกแคชฉันทำให้ SQL Server สามารถค้นหาและนำกลับมาใช้ใหม่ได้ยากขึ้นหรือไม่

1
SQL Server 2008 เก็บวันที่สร้างแผนการดำเนินการหรือไม่
เราเพิ่งอัปเกรดแอปพลิเคชันที่เราใช้ซึ่งเกี่ยวข้องกับการแก้ไขสคีมาสำหรับฐานข้อมูล การเปลี่ยนแปลงเหล่านี้อาจบังคับให้แผนการดำเนินการแคชถูกยกเลิก หาก SQL Server ถูกบังคับให้สร้างแผนใหม่จำนวนมากสิ่งนี้อาจทำให้ประสบการณ์ผู้ใช้ช้าลง ฉันต้องการตรวจสอบว่าเป็นกรณีนี้หรือไม่ ดังนั้นคำถามของฉันคือ SQL Server 2008 เก็บวันที่สร้างแผนการดำเนินการที่แคชหรือไม่ มุมมองการจัดการsys.dm_exec_cached_plansไม่มีฟิลด์วันที่ใด ๆ ดังนั้นฉันจึงไม่สงสัย

5
SentryOne Plan Explorer ทำงานหรือไม่
ไม่SentryOne แผน Explorer ในการทำงานตามที่โฆษณาและมันเป็นเรื่องที่ถูกต้อง? มี gotchas หรืออะไรที่ต้องกังวล? ดูเหมือนว่ามันจะแสดงเส้นทางร้อนในสีซึ่งเทียบกับฝันร้ายของ SSMS สำหรับแผนการดำเนินการโดยประมาณ ความกังวลของฉันคือ - มันแก้ไขข้อมูลใด ๆ ที่เป็นอันตรายหรือไม่? แก้ไข : ฉันเพิ่งได้ยินมันและไม่เคยได้ยิน บริษัท มาก่อน

1
ทำไมดัชนีการเลือกรองไม่ได้ใช้เมื่อตัวกรองส่วนคำสั่ง where บน value () `?
ติดตั้ง: create table dbo.T ( ID int identity primary key, XMLDoc xml not null ); insert into dbo.T(XMLDoc) select ( select N.Number for xml path(''), type ) from ( select top(10000) row_number() over(order by (select null)) as Number from sys.columns as c1, sys.columns as c2 ) as N; ตัวอย่าง XML …

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

2
ทำไมส่วนคำสั่ง WHERE ของฉันจึงได้รับประโยชน์จากคอลัมน์ "รวม"
ตามคำตอบนี้เว้นแต่ว่าดัชนีจะถูกสร้างขึ้นเหนือคอลัมน์ที่ใช้ในการ จำกัด การสืบค้นจะไม่ได้รับประโยชน์จากดัชนี ฉันมีคำจำกัดความนี้: CREATE TABLE [dbo].[JobItems] ( [ItemId] UNIQUEIDENTIFIER NOT NULL, [ItemState] INT NOT NULL, [ItemPriority] INT NOT NULL, [CreationTime] DATETIME NULL DEFAULT GETUTCDATE(), [LastAccessTime] DATETIME NULL DEFAULT GETUTCDATE(), -- other columns ); CREATE UNIQUE CLUSTERED INDEX [JobItemsIndex] ON [dbo].[JobItems]([ItemId] ASC); GO CREATE INDEX [GetItemToProcessIndex] ON [dbo].[JobItems]([ItemState], [ItemPriority], [CreationTime]) …

5
ดูการล็อกที่ได้รับระหว่างการดำเนินการสืบค้น (SQL Server)
แผนการดำเนินการแบบสอบถามจะไม่แสดงรายละเอียดการล็อกตามค่าเริ่มต้นเป็นไปได้หรือไม่ที่จะดูการล็อกพร้อมกับชนิดที่ได้มาระหว่างการดำเนินการค้นหา

5
ฉันจะลบแผนการดำเนินการที่ไม่ดีออกจากฐานข้อมูล Azure SQL ได้อย่างไร
DBCC FREEPROCCACHEไม่ทำงานใน Azure SQL DB ฉันจะบังคับให้มีแผนอื่นเพื่อปลดปล่อยตัวเองออกจากแคชในลักษณะที่จะไม่ทำให้ระบบการผลิตเสียหาย (เช่นฉันไม่สามารถไปเปลี่ยนตารางที่จำใจได้) นี่เป็นเฉพาะสำหรับ SQL ที่สร้างโดย Entity Framework ดังนั้นจึงไม่ใช่ procs ที่จัดเก็บด้วยตนเองซึ่งมันคือไดนามิก SQL ที่มีประสิทธิภาพ (แหล่งที่มาคือดัชนีที่ไม่ดี -> สถิติที่ไม่ดี ฯลฯ นั่นคือทั้งหมดที่ได้รับการแก้ไข แต่แผนไม่ดีจะไม่หายไป) อัปเดต: ฉันเลือกโซลูชันของ @ mrdenny เมื่อเขาไปถึงที่นั่นก่อน อย่างไรก็ตามฉันใช้สคริปต์ของ @Aaron Bertrand สำเร็จในการทำงาน ขอบคุณทุกคนสำหรับความช่วยเหลือ !!

3
การต่อข้อมูลทางกายภาพ: รับประกันการดำเนินการตามคำสั่งหรือไม่?
ใน SQL มาตรฐานผลลัพธ์ของ a union allไม่ได้รับประกันว่าจะอยู่ในลำดับใด ๆ ดังนั้นสิ่งที่ชอบ: select 'A' as c union all select 'B' สามารถส่งคืนสองแถวในลำดับใดก็ได้ (แม้ว่าในทางปฏิบัติในฐานข้อมูลใด ๆ ที่ฉันรู้ว่า 'A' จะมาก่อน 'B') ใน SQL Server สิ่งนี้จะเปลี่ยนเป็นแผนการดำเนินการโดยใช้การดำเนินการทางกายภาพ "การต่อข้อมูล" ฉันนึกภาพออกได้ง่ายว่าการดำเนินการเรียงต่อกันจะสแกนอินพุตของมันคืนสิ่งที่อินพุตมีบันทึกไว้ อย่างไรก็ตามฉันพบข้อความต่อไปนี้บนเว็บ ( ที่นี่ ): ตัวประมวลผลข้อความค้นหาจะดำเนินการตามแผนนี้ตามลำดับที่ผู้ให้บริการปรากฏในแผนข้อแรกคืออันดับแรกและรายการสุดท้ายคือรายการสุดท้าย คำถาม: จริงหรือไม่ในทางปฏิบัติ สิ่งนี้รับประกันได้ว่าเป็นจริงหรือไม่? ฉันไม่พบการอ้างอิงใด ๆ ในเอกสารประกอบของ Microsoft ที่อินพุตถูกสแกนตามลำดับตั้งแต่ครั้งแรกถึงครั้งสุดท้าย ในทางกลับกันเมื่อใดก็ตามที่ฉันพยายามเรียกใช้ผลลัพธ์แนะนำว่าอินพุตนั้นถูกประมวลผลตามลำดับ มีวิธีที่จะทำให้กระบวนการของเครื่องยนต์มากกว่าหนึ่งอินพุตในแต่ละครั้งหรือไม่? การทดสอบของฉัน (โดยใช้นิพจน์ที่ซับซ้อนกว่าค่าคงที่) อยู่ในเครื่อง 8-core ที่เปิดใช้งานแบบขนานและการสืบค้นส่วนใหญ่จะใช้ประโยชน์จากความขนาน

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