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

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

1
สิ่งที่เป็นประโยชน์ของการตั้งค่า ARITHABORT ON สำหรับการเชื่อมต่อทั้งหมดใน SQL Server?
ดังนั้นผมจึงได้พิจารณาแล้วว่าพฤติกรรมผิดปกติของ SQL Server ของฉันคือเนื่องจากการตั้งค่าเริ่มต้นของผู้ให้บริการสุทธิ SqlClient SET ARITHABORT OFFข้อมูลของ ด้วยที่กล่าวว่าฉันได้อ่านบทความต่าง ๆ ที่ถกเถียงวิธีที่ดีที่สุดในการใช้งาน สำหรับฉันฉันแค่ต้องการวิธีที่ง่ายเพราะ SQL Server กำลังทนทุกข์และการปรับแต่งการสืบค้นของฉันยังไม่ได้มีการข้ามผ่านแอพอย่างสมบูรณ์ (และแน่นอนว่าการเพิ่มSETใน sp ไม่ทำงาน) ในบทความยอดเยี่ยมเกี่ยวกับหัวข้อของ Erland Sommarskog เขาแนะนำให้ใช้วิธีการที่ปลอดภัยโดยการเปลี่ยนแอพให้เป็นปัญหาSET ARITHABORT ONสำหรับการเชื่อมต่อ อย่างไรก็ตามในคำตอบนี้จากคำถาม dba.stackexchange โซโลมอน Rutzky เสนอวิธีการแบบกว้างและแบบฐานข้อมูล ฉันหายไปที่นี่โดยการตั้งค่าทั้งอินสแตนซ์นี้ได้อย่างไร ตามที่ฉันเห็น ... เนื่องจาก SSMS มีการตั้งค่านี้ONตามค่าเริ่มต้นฉันไม่เห็นอันตรายใด ๆ ในการตั้งค่าทั้งONเซิร์ฟเวอร์สำหรับการเชื่อมต่อทั้งหมด ในตอนท้ายของวันฉันแค่ต้องการ SQL Server นี้เพื่อดำเนินการเหนือสิ่งอื่นใด

1
ทำไมการเข้าร่วมการกำจัดไม่ทำงานกับ sys.query_store_plan
ต่อไปนี้เป็นการทำให้เข้าใจง่ายของปัญหาประสิทธิภาพที่พบกับ Query Store: CREATE TABLE #tears ( plan_id bigint NOT NULL ); INSERT #tears (plan_id) VALUES (1); SELECT T.plan_id FROM #tears AS T LEFT JOIN sys.query_store_plan AS QSP ON QSP.plan_id = T.plan_id; plan_idคอลัมน์เป็นเอกสารที่เป็นคีย์หลักของsys.query_store_planแต่แผนปฏิบัติการไม่ได้ใช้เข้าร่วมการกำจัดเป็นที่คาดว่าจะ: ไม่มีการคาดการณ์คุณลักษณะจาก DMV คีย์หลัก DMV plan_idไม่สามารถซ้ำแถวจากตารางชั่วคราวได้ A LEFT JOINถูกใช้ดังนั้นจึงไม่Tสามารถลบแถวออกได้ แผนการดำเนินการ เหตุใดจึงเป็นเช่นนี้และสิ่งใดที่สามารถทำได้เพื่อรับการเข้าร่วมการกำจัดที่นี่


1
ไม่ตรงกันอย่างมากระหว่างขนาดดัชนีและจำนวนบัฟเฟอร์ในแผนการดำเนินการ
ปัญหา เรามีคำถามเช่น SELECT COUNT(1) FROM article JOIN reservation ON a_id = r_article_id WHERE r_last_modified < now() - '8 weeks'::interval AND r_group_id = 1 AND r_status = 'OPEN'; ในขณะที่หมดเวลา (หลังจากผ่านไป 10 นาที) บ่อยกว่านั้นฉันตัดสินใจตรวจสอบปัญหา EXPLAIN (ANALYZE, BUFFERS)เอาท์พุทมีลักษณะเช่นนี้ Aggregate (cost=264775.48..264775.49 rows=1 width=0) (actual time=238960.290..238960.291 rows=1 loops=1) Buffers: shared hit=200483 read=64361 dirtied=666 written=8, temp …

1
เหตุใดจึงไม่ใช้คีย์หลัก (คลัสเตอร์) ในการสืบค้นนี้
ฉันมีตาราง SQL Server 2008 R2 ซึ่งโครงสร้างสกีมามีลักษณะดังนี้: CREATE TABLE [dbo].[CDSIM_BE] ( [ID] [bigint] NOT NULL, [EquipmentID] [varchar](50) NOT NULL, [SerialNumber] [varchar](50) NULL, [PyrID] [varchar](50) NULL, [MeasMode] [varchar](50) NULL, [ReadTime] [datetime] NOT NULL, [SubID] [varchar](15) NULL, [ProbePosition] [float] NULL, [DataPoint] [int] NULL, CONSTRAINT [PK_CDSIM_BE] PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] …

1
แผนแบบสอบถามเปลี่ยนประสิทธิภาพที่แย่ลงใน SQL Server 2014
เราเพิ่งอัพเกรดเซิร์ฟเวอร์ของเราจาก SQL Server 2008R2 เป็น SQL Server 2014 เรามีข้อความค้นหาที่ทำงานได้ดีในปี 2008R2 แต่ตอนนี้ในปี 2014 ทำงานช้าลงอย่างไม่น่าเชื่อมากและมีแผนปฏิบัติการที่ไม่ดี ฉันได้ทำการทดสอบหลายครั้ง ... สลับ 2014 DB กลับไปเป็นโหมดเข้ากันได้ 2008/2012 ทดสอบแบบสอบถามโดยใช้การแบ่งหน้า ทั้งสองอย่างนั้นส่งผลให้คิวรีทำงานเหมือนกันกับที่ทำและรวดเร็วเหมือน SQL Server 2008R2 เหตุใดแผนไม่ดีและแบบสอบถามทำงานนานใน SQL Server 2014 ภาพนี้แสดงข้อความค้นหา 2 คำโดยหนึ่งแถวใช้หมายเลขตามที่เรียกใช้ในปี 2008R2 จากนั้นรูปที่สองคือการแก้ไขด้วยการแบ่งหน้า ทั้งสองวิ่งในปี 2014 ทั้งสองแตกต่างกันมาก แต่ในปี 2008 เราเห็นประสิทธิภาพการทำงานเหมือนว่าเราใช้เลขหน้าในปี 2014

2
ค้นหา fulltext ช้าเนื่องจากการประมาณการแถวไม่ถูกต้องอย่างดุร้าย
ข้อความค้นหาแบบเต็มกับฐานข้อมูลนี้ (การเก็บตั๋วRT ( Request Tracker )) ดูเหมือนจะใช้เวลานานมากในการดำเนินการ ตารางสิ่งที่แนบ (มีข้อมูลแบบเต็ม) ประมาณ 15GB สคีมาฐานข้อมูลมีดังนี้ประมาณ 2 ล้านแถว: rt4 = # \ d + ไฟล์แนบ ตาราง "public.attachments" คอลัมน์ | ประเภท | ตัวดัดแปลง | จัดเก็บข้อมูล | ลักษณะ ----------------- + ----------------------------- + - -------------------------------------------------- ------ ---------- + + ------------- id | จำนวนเต็ม ไม่ใช่ null ค่าเริ่มต้น nextval …

2
มีวิธีใดบ้างในการประเมินค่าใช้จ่ายในการดำเนินการสืบค้นใน MySQL หรือไม่?
ใน PostgreSQL นั้น EXPLAIN หรือ EXPLAIN ANALYZE จะแสดงค่าใช้จ่ายโดยประมาณในการดำเนินการสืบค้น แต่อธิบายใน MySQL ไม่ได้ให้ข้อมูลนี้ ฉันจะได้รับค่าประมาณโดยไม่ต้องติดตั้งเครื่องมืออื่น ๆ ได้อย่างไร ฉันใช้ MySQL-5.6.16

3
สถิติของ SQL Server ถูกเก็บไว้ในฐานข้อมูลหรือบัฟเฟอร์พูลหรือไม่?
แค่สงสัยว่าสถิติเก็บอยู่ในฐานข้อมูล แต่ไม่ได้อยู่ในหน่วยความจำ? ถ้าฉันสำรอง / กู้คืนฐานข้อมูลจากเซิร์ฟเวอร์ prod ไปยังเซิร์ฟเวอร์การพัฒนามันจะเก็บสถิติเดียวกันเพื่อให้แผนการดำเนินการจะไม่แตกต่างกันมากหากฉันทำบนเซิร์ฟเวอร์การพัฒนาหรือไม่

2
ฉันจะกำจัดสาขาคู่ขนานที่ไม่มีประโยชน์ได้อย่างไรเมื่อยกเลิกการตรึงแถวเดียว
ลองพิจารณาคำถามต่อไปนี้ที่ไม่ได้รวมจำนวนสเกลาร์จำนวนไม่กี่ตัว: SELECT A, B FROM ( SELECT MAX(CASE WHEN ID = 1 THEN 1 ELSE 0 END) VAL1 , MAX(CASE WHEN ID = 2 THEN 1 ELSE 0 END) VAL2 , MAX(CASE WHEN ID = 3 THEN 1 ELSE 0 END) VAL3 , MAX(CASE WHEN ID = 4 THEN 1 …

1
ไม่มีดัชนีที่ไม่ได้ทำคลัสเตอร์เป็นส่วนหนึ่งของดัชนีที่ทำคลัสเตอร์แล้ว
ฉันกำลังดีบักเคียวรีที่รันช้าและในแผนการดำเนินการขอแนะนำให้ใช้ดัชนีที่ไม่ใช่คลัสเตอร์โดยมีผลกระทบ 51.6648 อย่างไรก็ตามดัชนีที่ไม่ทำคลัสเตอร์จะมีเฉพาะคอลัมน์ที่อยู่ในดัชนีคอมโพสิตคีย์หลัก (PK) แล้วเท่านั้น อาจเป็นเพราะลำดับของคอลัมน์ในดัชนีหรือไม่ เช่นถ้าคอลัมน์ในดัชนีคลัสเตอร์ไม่เรียงลำดับจากส่วนใหญ่ถึงน้อยที่สุดแล้วมีความเป็นไปได้ที่จะมีดัชนีที่ไม่รวมกลุ่มเพื่อปรับปรุงประสิทธิภาพหรือไม่ นอกจากนี้ดัชนีที่ไม่ทำคลัสเตอร์จะมีคอลัมน์ PK สองในสามเท่านั้นโดยที่คอลัมน์ที่สามนั้นถูกเพิ่มเป็นคอลัมน์ที่รวมไว้ เป็นincludeอีกสาเหตุหนึ่งที่ทำไมการใช้ดัชนีที่ไม่ทำคลัสเตอร์อาจจะดีที่สุด? ด้านล่างเป็นตัวอย่างของโครงสร้างตารางที่ฉันทำงานด้วย: Tables- Retailers ( RetailerID int PK, name ...) Retailer_Relation_Types ( RelationType smallint PK, Description nvarchar(50) ...) Retailer_Relations ( RetailerID int PK FK, RelatedRetailerID int PK FK, RelationType smallint PK FK, CreatedOn datetime ...) ตารางRetailer_Relationsมีดัชนีคอมโพสิต PK ต่อไปนี้และดัชนีแนะนำ CONSTRAINT PK_Retailer_Relations …

1
ดัชนีค้นหาต้นทุนผู้ประกอบการ
สำหรับแบบสอบถามฐานข้อมูลตัวอย่างAdventureWorksด้านล่าง: SELECT P.ProductID, CA.TransactionID FROM Production.Product AS P CROSS APPLY ( SELECT TOP (1) TH.TransactionID FROM Production.TransactionHistory AS TH WHERE TH.ProductID = P.ProductID ORDER BY TH.TransactionID DESC ) AS CA; แผนการดำเนินการแสดงค่าใช้จ่ายของผู้ให้บริการโดยประมาณ0.0850383 (93%) สำหรับดัชนีค้นหา : ค่าใช้จ่ายนั้นไม่ขึ้นอยู่กับรูปแบบการประมาณเชิงการใช้งาน ไม่ได้เป็นการเพิ่มต้นทุน CPU โดยประมาณและค่าใช้จ่ายI / O โดยประมาณอย่างง่าย ทั้งที่มันเป็นค่าใช้จ่ายสำหรับหนึ่งในการดำเนินการของดัชนีแสวงหาคูณด้วยจำนวนโดยประมาณของการประหารชีวิต หมายเลขค่าใช้จ่ายนี้มาถึงอย่างไร

1
การเข้าร่วมแฮชระหว่างตารางต้นแบบ / ตารางรายละเอียดจะสร้างการประมาณค่าเชิงหัวใจต่ำเกินไป
เมื่อเข้าร่วมตารางต้นแบบเข้ากับตารางรายละเอียดฉันจะสนับสนุน SQL Server 2014 ให้ใช้การประมาณค่าเชิงการนับของตารางขนาดใหญ่ (รายละเอียด) เป็นการประมาณค่าความสำคัญของการรวมเอาต์พุตได้อย่างไร ตัวอย่างเช่นเมื่อเข้าร่วมแถวหลัก 10K ถึงแถวรายละเอียด 100K ฉันต้องการให้ SQL Server ประมาณค่าการเข้าร่วมที่แถว 100K - เหมือนกับจำนวนแถวรายละเอียดโดยประมาณ ฉันควรจัดโครงสร้างคิวรีและ / หรือตารางและ / หรือดัชนีของฉันอย่างไรเพื่อช่วยให้ตัวประมาณของ SQL Server ใช้ประโยชน์จากข้อเท็จจริงที่ว่าทุกแถวรายละเอียดมีแถวหลักที่สอดคล้องกันเสมอ (หมายความว่าการเข้าร่วมระหว่างพวกเขาไม่ควรลดค่าประมาณของ cardinality) นี่คือรายละเอียดเพิ่มเติม ฐานข้อมูลของเรามีคู่ของตารางต้นแบบ / รายละเอียด: VisitTargetมีหนึ่งแถวสำหรับแต่ละธุรกรรมการขายและVisitSaleมีหนึ่งแถวสำหรับแต่ละผลิตภัณฑ์ในแต่ละธุรกรรม มันเป็นความสัมพันธ์แบบหนึ่งต่อหลายคน: หนึ่งแถว VisitTarget สำหรับแถว VisitSale เฉลี่ย 10 แถว ตารางมีลักษณะดังนี้: (ฉันลดความซับซ้อนของคอลัมน์ที่เกี่ยวข้องสำหรับคำถามนี้เท่านั้น) -- "master" table CREATE TABLE VisitTarget ( …

1
เหตุใดการลบในมุมมองที่พาร์ติชันของฉันจึงทำให้การแทรกดัชนีแบบกลุ่ม?
ฉันมีมุมมองที่แบ่งพาร์ติชันซึ่งมีทริกเกอร์แทรกด้านล่าง (พาร์ติชัน Mans ไม่ดี) เมื่อฉันทำการลบฉันได้รับแผนแบบสอบถามด้านล่าง: delete from factproductprice where pricedate = '20170725' ทริกเกอร์ในมุมมอง: ALTER TRIGGER [dbo].[factProductPriceDelete] ON [dbo].[FactProductPrice] INSTEAD OF DELETE AS BEGIN IF @@ROWCOUNT = 0 RETURN; DECLARE @PriceDate DATE SELECT @PriceDate = CAST(PriceDate AS DATE) FROM DELETED IF @PriceDate BETWEEN '20140101' AND '20141231' BEGIN DELETE FROM dbo.FactProductPrice2014 WHERE …

1
สถิติของดัชนีในพาร์ติชั่นที่ไม่ได้ใช้ในการสืบค้นบนตารางทั้งหมด
การเข้าร่วมต่อไปนี้มีการประมาณการแถวแตกต่างกันมากเมื่อทำการเข้าร่วมในพาร์ทิชันเทียบกับเมื่อเข้าร่วมในตารางทั้งหมด: CREATE TABLE m_data.ga_session ( session_id BIGINT NOT NULL, visitor_id BIGINT NOT NULL, transaction_id TEXT, timestamp TIMESTAMP WITH TIME ZONE NOT NULL, day_id INTEGER NOT NULL, [...] device_category TEXT NOT NULL, [...] operating_system TEXT ); สำหรับพาร์ติชันทั้งหมด: CREATE TABLE IF NOT EXISTS m_data.ga_session_20170127 ( CHECK (day_id = 20170127) ) INHERITS (m_data.ga_session); …

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