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

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

1
ฟีเจอร์ Plan Query Store Force ไม่ทำงาน
คุณลักษณะแผนของ Query Store Force ไม่ได้บังคับใช้แผน ฉันรู้ร้านแบบสอบถาม - บังคับไม่ได้หมายความว่าบังคับ ; อย่างไรก็ตามแผนของฉันอาจไม่เปลี่ยนแปลงอย่างมีนัยสำคัญ แต่เครื่องมือเพิ่มประสิทธิภาพการสืบค้นอาจเลือกดัชนีที่ไม่ถูกต้องตัวเลือกการวนซ้ำเป็นต้น โดยพื้นฐาน: มันไม่เป็นไปตามแผนบังคับของฉัน ผมเคยบังคับแผนจำนวนมากและมันก็ไม่ได้ทำงาน มีอยู่ 0 sys.query_store_plan force_failure_countข้อหาล้มเหลวหรือเหตุผลคือเมื่อฉันมองไปที่ เหตุการณ์ที่ขยายquery_store_plan_forcing_failedไม่ได้ให้ผลใด ๆ 0 เหตุการณ์ ตัวอย่างเช่นแผนซึ่งบังคับใช้เมื่อ 20.09 มีเพียงการรวบรวม 1 ครั้งเท่านั้นที่ใช้แผนการบังคับ แผนแตกต่างกันอย่างมากแผนการหนึ่งที่ใช้การจับคู่แฮชเข้าร่วมกับ INDEX 1 และอีกแผนการใช้การเข้าร่วมแบบวนรอบกับ INDEX 2 รุ่น: Microsoft SQL Server 2016 (SP1-GDR) (KB3210089) - 13.0.4202.2 (X64) ฉันหายไปนี่อะไร

3
การสแกนตามลำดับ PostgreSQL แทนการสแกนดัชนีทำไม
สวัสดีทุกคนฉันมีปัญหากับแบบสอบถามฐานข้อมูล PostgreSQL ของฉันและสงสัยว่าใครสามารถช่วยได้ ในบางสถานการณ์แบบสอบถามของฉันดูเหมือนจะไม่สนใจดัชนีที่ฉันสร้างขึ้นซึ่งจะใช้สำหรับการเข้าร่วมสองตารางและdata data_areaเมื่อสิ่งนี้เกิดขึ้นจะใช้การสแกนตามลำดับและส่งผลให้แบบสอบถามช้าลงมาก การสแกนตามลำดับ (~ 5 นาที) Unique (cost=15368261.82..15369053.96 rows=200 width=1942) (actual time=301266.832..301346.936 rows=153812 loops=1) CTE data -> Bitmap Heap Scan on data (cost=6086.77..610089.54 rows=321976 width=297) (actual time=26.286..197.625 rows=335130 loops=1) Recheck Cond: (datasetid = 1) Filter: ((readingdatetime >= '1920-01-01 00:00:00'::timestamp without time zone) AND (readingdatetime <= '2013-03-11 00:00:00'::timestamp …

1
ความแตกต่างระหว่างการค้นหาคำกริยาและคำกริยา
ฉันพยายามปรับแต่งคำถามที่เรามีใน SQL Server 2014 Enterprise ฉันได้เปิดแผนแบบสอบถามจริงใน SQL Sentry Plan Explorer และฉันสามารถดูบนโหนดเดียวว่ามีSeek PredicateและPredicate ข้อแตกต่างระหว่างSeek PredicateและPredicateคืออะไร หมายเหตุ: ฉันสามารถเห็นได้ว่ามีปัญหามากมายกับโหนดนี้ (เช่นแถวโดยประมาณ vs จริง, IO ที่เหลือ) แต่คำถามไม่เกี่ยวข้องกับสิ่งใด ๆ

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]. …

1
SQL Server Query Plan XML: ความยาว QueryPlanHash
UPDATE:นี่เป็นข้อผิดพลาดอย่างแน่นอน สำหรับรายละเอียดทั้งหมดดูรายการเชื่อมต่อนี้ ในขณะที่ทดสอบการเปลี่ยนแปลงบางอย่างกับsp_BlitzCache (การเปิดเผยอย่างสมบูรณ์ฉันเป็นหนึ่งในผู้แต่ง) ฉันเจอสิ่งที่ฉันคิดว่าเป็นข้อบกพร่องในรหัสของเรา ณ จุดหนึ่งเรากำลังจับคู่แฮชแผนแบบสอบถามเพื่อรับค่าใช้จ่ายแบบสอบถาม เราทำเช่นนั้นเกี่ยวกับเช่น: statement.value('sum(/p:StmtSimple[xs:hexBinary(substring(@QueryHash, 3)) = xs:hexBinary(sql:column("b.QueryHash"))]/@StatementSubTreeCost)', 'float') สิ่งนี้ได้ผลเท่าที่ฉันเคยเห็น อย่างไรก็ตามในกรณีที่แปลกหนึ่งสตริงย่อยใน XML กำลังส่งNULLค่าและแผนแสดงค่า 0 แม้ว่ามันจะค่อนข้างสูง เมื่อขุดเข้าไปในแผนปฏิบัติการ (การเปิดเผยอย่างเต็มรูปแบบฉันทำงานให้กับ บริษัท ที่เป็นเจ้าภาพวางแผน) ฉันสังเกตเห็นว่าแฮชแผนแบบสอบถามสำหรับแฮชปัญหาเดียวมีแฮช 17 ตัวในขณะที่ที่เหลือคือ 18 นี่คือตัวอย่าง: QueryPlanHash = "0x4410B0CA640CDA89" QueryPlanHash = "0x2262FEA4CE645569" QueryPlanHash = "0xED4F225CC0E97E5" - ปัญหา! QueryPlanHash = "0xBF878EEE6DB955EA" QueryPlanHash = "0x263B53BC8C14A452" QueryPlanHash = "0x89F5F146CF4B476F" QueryPlanHash = …

2
พฤติกรรมการรวมของสตรีม
ค้นหา: declare @X xml = ' <item ID = "0"/> <item ID = "1"/> <item/> <item/>'; select I.X.value('@ID', 'int') from @X.nodes('/item') as I(X); ผลลัพธ์: ----------- 0 1 NULL NULL แผนการดำเนินการ: สาขาด้านบน shreds XML IDเพื่อสี่แถวและสาขาด้านล่างเรียกค่าสำหรับแอตทริบิวต์ สิ่งที่ทำให้ฉันแปลกประหลาดคือจำนวนแถวที่คืนจากผู้ดำเนินการรวมสตรีม แถว 2 ที่มาจากตัวกรองคือIDแอตทริบิวต์จากitemโหนดแรกและโหนดที่สองใน XML สตรีมรวมจะส่งคืนสี่แถวหนึ่งแถวสำหรับแต่ละแถวป้อนเปลี่ยนการเข้าร่วมด้านในเป็นการรวมภายนอกได้อย่างมีประสิทธิภาพ นี่คือบางสิ่งที่ Stream Aggregate ทำในสถานการณ์อื่นเช่นกันหรือเป็นเพียงสิ่งแปลก ๆ ที่เกิดขึ้นเมื่อทำการค้นหา XML ฉันไม่สามารถเห็นคำแนะนำใด ๆ ในแผนการสืบค้นเวอร์ชัน …

4
SQL Server ล้มเหลวในการใช้ดัชนีใน bijection ง่าย
นี่เป็นปริศนาเพิ่มประสิทธิภาพการสืบค้นอีกอันหนึ่ง บางทีฉันแค่ประมาณเครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาหรือบางทีฉันอาจพลาดบางสิ่ง - ดังนั้นฉันจึงวางมันไว้ที่นั่น ฉันมีโต๊ะธรรมดา CREATE TABLE [dbo].[MyEntities]( [Id] [uniqueidentifier] NOT NULL, [Number] [int] NOT NULL, CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id]) ) CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number]) ด้วยดัชนีและแถวบางแถวในนั้นมีNumberการกระจายอย่างเท่าเทียมกันในค่า 0, 1 และ 2 ตอนนี้แบบสอบถามนี้: SELECT * FROM (SELECT [Extent1].[Number] AS [Number], CASE WHEN (0 = [Extent1].[Number]) THEN 'one' …

3
วิธีตอบว่าทำไมเราต้องมีดัชนีหรือแบบสอบถามต้องเปลี่ยน
ฉันเป็นจูเนียร์ DBA ที่มีประสบการณ์ 3 ปี งานของเราคือการปรับแต่งแบบสอบถามหรือให้คำแนะนำกับนักพัฒนาว่าควรเขียนโค้ดเฉพาะหรือดัชนีใหม่ คำถามง่ายๆหนึ่งคำถามที่ทีมพัฒนาถามบ่อยคือ: "เมื่อวานมันวิ่งได้ดี และเราจะถูกขอให้ตรวจสอบด้านโครงสร้างพื้นฐาน ปฏิกิริยาแรกที่เกิดขึ้นกับปัญหาใด ๆ มักจะทำให้เกิดความผิดพลาดสูงสุดในโครงสร้างพื้นฐานซึ่งเป็นสิ่งแรกที่ถูกตรวจสอบเสมอ เราควรตอบคำถาม "สิ่งที่เปลี่ยนแปลง" โดยทีมพัฒนาอย่างไร พวกคุณเคยเผชิญกับสถานการณ์เดียวกันหรือไม่? ถ้าเป็นเช่นนั้นโปรดแบ่งปันประสบการณ์ของคุณ

1
มันจะเป็นการดีกว่าถ้าหากแผนแบบสอบถามที่จะถูกแยกโดยคำสั่งเพื่อการใช้งานใหม่?
จากความรู้ที่ จำกัด ของฉันเกี่ยวกับวิธีรวบรวมแผนแบบสอบถามจัดเก็บและดึงข้อมูลโดยแบบสอบถามฉันเข้าใจว่าแบบสอบถามหลายคำสั่งหรือกระบวนงานที่เก็บไว้จะสร้างแผนแบบสอบถามซึ่งจะถูกเก็บไว้ในแคชแผนแบบสอบถามที่จะใช้โดยแบบสอบถามในการดำเนินการในอนาคต ฉันคิดว่าแผนนี้ถูกดึงมาจากแคชแผนแบบสอบถามด้วยแฮชคิวรีซึ่งหมายความว่าหากมีการแก้ไขคิวรีและดำเนินการแฮชจะแตกต่างกันและมีการสร้างแผนใหม่เนื่องจากไม่พบแฮชที่ตรงกันในแคชแผนคิวรี คำถามของฉันคือ: หากผู้ใช้ดำเนินการคำสั่งที่เป็นหนึ่งในงบในแบบสอบถามหลายงบสามารถใช้ส่วนที่เกี่ยวข้องของแผนแบบสอบถามที่มีอยู่แล้วในแคชสำหรับแบบสอบถามหลายงบ? ฉันคาดหวังว่าคำตอบนั้นไม่ใช่เพราะค่าแฮชจะไม่ตรงกัน แต่จะดีกว่าหรือไม่ที่จะแฮชแต่ละคำสั่งในแบบสอบถามแบบหลายคำสั่งเพื่อให้ผู้ใช้สามารถเรียกใช้คำสั่งแต่ละรายการจากแบบสอบถามได้หรือไม่ ฉันคาดหวังว่าจะมีภาวะแทรกซ้อนที่ฉันไม่ได้คำนึงถึง (และนี่คือสิ่งที่ฉันต้องการทราบจริงๆ) แต่ดูเหมือนว่าเราสามารถจัดเก็บ 'แผนคำสั่ง' ที่เหมือนกันในแผนแบบสอบถามจำนวนมากที่ใช้พื้นที่มากขึ้นและใช้มากขึ้น CPU และเวลาในการสร้าง อาจเป็นเพียงการแสดงความไม่รู้ของฉันว่า

2
ทำความเข้าใจเกี่ยวกับสถิติแผนการดำเนินการและ 'ปัญหาสำคัญน้อยไปมาก'
ฉันพยายามที่จะเข้าใจ (แนวคิด) ความสัมพันธ์ระหว่างสถิติแผนการดำเนินการการดำเนินการตามขั้นตอนที่เก็บไว้ ฉันถูกต้องหรือไม่ในการบอกว่าสถิติจะถูกใช้เมื่อสร้างแผนการดำเนินการสำหรับขั้นตอนการจัดเก็บเท่านั้นและไม่ได้ใช้ในบริบทการดำเนินการจริง กล่าวอีกนัยหนึ่งหากเป็นจริงเมื่อมีการสร้างแผน (และสมมติว่ามีการใช้ซ้ำอย่างถูกต้อง) สถิติ "ทันสมัย" มีความสำคัญเพียงใด ฉันได้รับแรงบันดาลใจเป็นพิเศษจากบทความที่ฉันอ่าน ( สถิติการประมาณแถวและคอลัมน์วันขึ้น ) ซึ่งอธิบายสถานการณ์ที่คล้ายกับที่ฉันเผชิญทุกวันกับฐานข้อมูลลูกค้าของเราหลายแห่ง เรามีคอลัมน์วันที่ / เวลาจากน้อยไปหามากในหนึ่งในตารางที่ใหญ่ที่สุดของเราที่เราทำการสืบค้นเป็นประจำโดยใช้ขั้นตอนการจัดเก็บเฉพาะ คุณจะป้องกันแผนการดำเนินการไม่ให้เพิ่มขึ้นได้อย่างไรเมื่อคุณเพิ่มหนึ่งแสนแถวต่อวัน? หากเรากำลังอัปเดตสถิติบ่อยครั้งเพื่อต่อสู้กับปัญหานี้มันจะสมเหตุสมผลหรือไม่ที่จะใช้คำแนะนำ OPTION (RECOMPILE) ในการสืบค้นของโพรซีเดอร์นี้ คำแนะนำหรือคำแนะนำใด ๆ ที่จะได้รับการชื่นชม อัปเดต : ฉันใช้ SQL Server 2012 (SP1)

2
ROW_NUMBER () โดยไม่มี PARTITION BY ยังคงสร้างตัวทำซ้ำของเซกเมนต์
ฉันกำลังเขียนเกี่ยวกับโพสต์บล็อกที่กำลังจะมาถึงของฉันเกี่ยวกับการจัดอันดับและฟังก์ชั่นหน้าต่างรวมโดยเฉพาะการวนซ้ำของโครงการเซกเมนต์และลำดับ วิธีที่ฉันเข้าใจว่าเซ็กเมนต์ระบุแถวในสตรีมที่ประกอบด้วยจุดสิ้นสุด / จุดเริ่มต้นของกลุ่มดังนั้นเคียวรีต่อไปนี้: SELECT ROW_NUMBER() OVER (PARTITION BY someGroup ORDER BY someOrder) จะใช้เซกเมนต์เพื่อบอกว่าแถวอยู่ในกลุ่มที่แตกต่างจากแถวก่อนหน้าหรือไม่ ตัววนซ้ำ Project Sequence จะทำการคำนวณจำนวนแถวตามจริงโดยขึ้นอยู่กับเอาต์พุตของเอาต์พุตของตัววนซ้ำของเซกเมนต์ แต่เคียวรีต่อไปนี้ซึ่งใช้ตรรกะนั้นไม่ควรรวมเซกเมนต์เนื่องจากไม่มีนิพจน์พาร์ติชัน SELECT ROW_NUMBER() OVER (ORDER BY someGroup, someOrder) อย่างไรก็ตามเมื่อฉันลองสมมติฐานนี้แบบสอบถามทั้งสองนี้ใช้ตัวดำเนินการของส่วน ข้อแตกต่างคือแบบสอบถามที่สองไม่จำเป็นต้องมีGroupByในส่วน นั่นไม่ได้ช่วยลดความจำเป็นในการแบ่งกลุ่มในตอนแรกใช่หรือไม่ ตัวอย่าง CREATE TABLE dbo.someTable ( someGroup int NOT NULL, someOrder int NOT NULL, someValue numeric(8, 2) NOT NULL, PRIMARY KEY CLUSTERED …

1
โดยประมาณกับแผนแบบสอบถามจริงกับการเรียกใช้ฟังก์ชัน
ฉันมีแบบสอบถามนี้ในเซิร์ฟเวอร์ SQL แบบสอบถามจำลองแบบผสาน: SELECT DISTINCT b.tablenick, b.rowguid, c.generation, sys.fn_MSgeneration_downloadonly ( c.generation, c.tablenick ) FROM #belong b LEFT OUTER JOIN dbo.MSmerge_contents c ON c.tablenick = b.tablenick AND c.rowguid = b.rowguid; แผนแบบสอบถามโดยประมาณมีข้อมูลเกี่ยวกับ 3 แบบสอบถาม แบบสอบถามข้างต้น การเรียกใช้ฟังก์ชันเพื่อ fn_MSgeneration_download เท่านั้น การเรียกใช้ฟังก์ชันเพื่อ fn_MSArticle_has_downloadonly_property แผนแบบสอบถามจริงรวมเฉพาะข้อมูลนี้: แบบสอบถามข้างต้น ไม่มีอะไรเกี่ยวกับฟังก์ชั่น เหตุใดข้อมูลฟังก์ชันจึงขาดหายไปในแผนจริง ฉันลองตัวเลือกเหล่านี้: SET STATISTICS PROFILE ON SET STATISTICS XML …

1
แผนแบบสอบถามแปลกเมื่อใช้หรือในข้อเข้าร่วม - สแกนอย่างต่อเนื่องสำหรับทุกแถวในตาราง
ฉันกำลังพยายามสร้างแผนการสืบค้นตัวอย่างเพื่อแสดงว่าทำไมชุดผลลัพธ์สองชุดของยูเนี่ยนจึงดีกว่าการใช้ OR ในประโยค JOIN แผนแบบสอบถามที่ฉันเขียนทำให้ฉันนิ่งงัน ฉันใช้ฐานข้อมูล StackOverflow กับดัชนีที่ไม่ได้เป็นคลัสเตอร์ใน Users.Reputation แบบสอบถามคือ CREATE NONCLUSTERED INDEX IX_NC_REPUTATION ON dbo.USERS(Reputation) SELECT DISTINCT Users.Id FROM dbo.Users INNER JOIN dbo.Posts ON Users.Id = Posts.OwnerUserId OR Users.Id = Posts.LastEditorUserId WHERE Users.Reputation = 5 แผนการสืบค้นอยู่ที่https://www.brentozar.com/pastetheplan/?id=BkpZU1MZEระยะเวลาการสืบค้นสำหรับฉันคือ 4:37 นาทีส่งคืนแถว 26612 ฉันไม่เคยเห็นรูปแบบการสแกนคงที่นี้ถูกสร้างขึ้นจากตารางที่มีอยู่ก่อนหน้านี้ - ฉันไม่คุ้นเคยกับสาเหตุที่มีการสแกนค่าคงที่สำหรับทุก ๆ แถวเมื่อการสแกนแบบคงที่มักใช้กับแถวเดียวที่ป้อนโดยผู้ใช้ เช่น SELECT GETDATE () ทำไมถึงใช้ที่นี่? …

1
แฮชรวม bailout
คำถามที่เกิดขึ้นในการสนทนาการแชท: ฉันรู้ว่าแฮชเข้าร่วม bailout สวิตช์ภายในเพื่อเรียงลำดับของลูปซ้อนกัน SQL Server ทำอะไรให้กับแฮชรวม bailout (ถ้ามันสามารถเกิดขึ้นได้ทั้งหมด)?

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