คำถามติดแท็ก query-performance

สำหรับคำถามเกี่ยวกับการปรับปรุงประสิทธิภาพและ / หรือประสิทธิภาพของการสืบค้นฐานข้อมูล

4
คำแนะนำในการวินิจฉัยแบบสอบถามที่ช้า“ บางครั้ง”
ฉันมีกระบวนงานที่เก็บไว้ซึ่งส่งคืนผลลัพธ์จากมุมมองที่จัดทำดัชนีผ่านดัชนีครอบคลุม โดยปกติแล้วจะทำงานเร็ว (~ 10ms) บางครั้งสามารถทำงานได้ถึง 8 วินาที นี่คือตัวอย่างการดำเนินการแบบสุ่ม (หมายเหตุ: นี่ไม่ใช่แบบช้า แต่ข้อความค้นหาจะเหมือนกันนอกเหนือจากค่าที่ส่งผ่าน): declare @p2 dbo.IdentityType insert into @p2 values(5710955) insert into @p2 values(5710896) insert into @p2 values(5710678) insert into @p2 values(5710871) insert into @p2 values(5711103) insert into @p2 values(6215197) insert into @p2 values(5710780) exec ListingSearch_ByLocationAndStatus @statusType=1,@locationIds=@p2 นี่คือ SPROC: ALTER PROCEDURE [dbo].[ListingSearch_ByLocationAndStatus] …

3
ข้อมูลขนาดใหญ่และประสิทธิภาพใน SQL Server
ฉันเขียนแอปพลิเคชันด้วยแบ็กเอนด์ SQL Server ที่รวบรวมและจัดเก็บและบันทึกจำนวนมาก ฉันได้คำนวณว่าที่จุดสูงสุดปริมาณการบันทึกโดยเฉลี่ยอยู่ที่ประมาณ 3-4 พันล้านต่อวัน (การดำเนินการ 20 ชั่วโมง) โซลูชันดั้งเดิมของฉัน (ก่อนที่ฉันจะทำการคำนวณข้อมูลจริง) เพื่อให้แอปพลิเคชันของฉันแทรกระเบียนลงในตารางเดียวกันที่ลูกค้าของฉันสอบถาม นั่นขัดข้องและถูกเผาอย่างรวดเร็วค่อนข้างชัดเจนเพราะเป็นไปไม่ได้ที่จะสืบค้นตารางที่มีการแทรกเรคคอร์ดจำนวนมาก โซลูชันที่สองของฉันคือการใช้ฐานข้อมูล 2 ฐานข้อมูลหนึ่งสำหรับข้อมูลที่ได้รับจากแอปพลิเคชันและอีกหนึ่งฐานข้อมูลสำหรับไคลเอ็นต์ที่พร้อมใช้งาน แอปพลิเคชันของฉันจะรับข้อมูลและแบ่งเป็นชุด ~ 100k เรคคอร์ดและแทรกจำนวนมากในตารางการจัดเตรียม หลังจาก ~ 100k บันทึกแอปพลิเคชันทันทีสร้างตารางการแสดงละครอีกด้วยสคีมาเหมือนก่อนหน้าและเริ่มแทรกลงในตารางนั้น มันจะสร้างเรกคอร์ดในตารางงานที่มีชื่อของตารางที่มีเรกคอร์ด 100k และกระบวนงานที่เก็บไว้ในฝั่ง SQL Server จะย้ายข้อมูลจากตาราง staging ไปยังตารางการผลิตที่ไคลเอ็นต์พร้อมแล้วปล่อย ตารางตารางชั่วคราวที่สร้างโดยแอปพลิเคชันของฉัน ฐานข้อมูลทั้งสองมีชุดตาราง 5 ชุดที่มีสคีมาเดียวกันยกเว้นฐานข้อมูลที่มีตารางงาน ฐานข้อมูลการจัดเตรียมไม่มีข้อ จำกัด ด้านความสมบูรณ์, คีย์, ดัชนี ฯลฯ ... บนตารางที่มีระเบียนจำนวนมากที่จะอยู่ SignalValues_stagingดังต่อไปนี้ชื่อตารางเป็น เป้าหมายคือเพื่อให้แอปพลิเคชันของฉันกระแทกข้อมูลลงใน SQL Server โดยเร็วที่สุด …

6
ประสิทธิภาพของ a = 0 และ b = 0 และ… z = 0 vs a + b + c + d = 0
นี่เป็นคำถามง่าย ๆ ที่ฉันไม่สามารถหาคำตอบได้ ในแง่ของประสิทธิภาพถ้าฉันมีWHEREประโยคเช่นa=0 and b=0 and ... z=0ฉันจะได้รับประสิทธิภาพใด ๆ หรือไม่ถ้าฉันเปลี่ยนเงื่อนไขนั้นด้วยa+b+...+z=0? กล่าวอีกนัยหนึ่งมีการเพิ่มประสิทธิภาพใด ๆ โดยการแทนที่ต่อไปนี้ Select * From MyTable Where A=0 and B=0 and C=0 and D=0... กับ Select * From MyTable Where A+B+C+D=0... ฉันรู้ว่ามันสามารถขึ้นอยู่กับดัชนีได้ แต่สำหรับจุดประสงค์นี้สมมุติว่าไม่มีดัชนีอยู่ ตัวดำเนินการทางคณิตศาสตร์ (+) ทำงานได้ดีกว่าตัวดำเนินการทางตรรกะ "OR" หรือ "AND" หรือไม่? ฉันอยู่ภายใต้การแสดงผลว่าการเพิ่มประสิทธิภาพนั้นดีกว่าหลายเงื่อนไขด้วย ANDs หรือ OR ผลการทดสอบ บนตาราง 4.2 ล้านแถว …

2
แบบสอบถาม T-SQL โดยใช้แผนแตกต่างกันอย่างสมบูรณ์ขึ้นอยู่กับจำนวนแถวที่ฉันกำลังอัปเดต
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ฉันมีคำสั่ง SQL UPDATE พร้อมประโยค "TOP (X)" และแถวที่ฉันอัปเดตค่ามีประมาณ 4 พันล้านแถว เมื่อฉันใช้ "TOP (10)" ฉันจะได้รับแผนการดำเนินการหนึ่งแผนซึ่งจะดำเนินการเกือบจะทันที แต่เมื่อฉันใช้ "TOP (50)" หรือใหญ่กว่าแบบสอบถามจะไม่เสร็จสิ้น (อย่างน้อยไม่ใช่ในขณะที่ฉันรอ) มันใช้แผนการดำเนินการที่แตกต่างอย่างสิ้นเชิง เคียวรีขนาดเล็กใช้แผนอย่างง่ายมากที่มีคู่ของการค้นหาดัชนีและการเข้าร่วมลูปที่ซ้อนกันซึ่งแบบสอบถามเดียวกันที่แน่นอน (มีจำนวนแถวที่แตกต่างกันในส่วนคำสั่งย่อยด้านบนของคำสั่ง UPDATE) ใช้แผนที่เกี่ยวข้องกับการค้นหาดัชนีสองรายการ สปูลของตารางการขนานและความซับซ้อนอื่น ๆ ฉันใช้ "OPTION (ใช้แผน ... )" เพื่อบังคับให้ใช้แผนการดำเนินการที่สร้างโดยเคียวรีขนาดเล็ก - เมื่อฉันทำสิ่งนี้ฉันสามารถอัปเดตได้มากถึง 100,000 แถวในไม่กี่วินาที ฉันรู้ว่าแผนการสืบค้นเป็นสิ่งที่ดี แต่ SQL Server …

5
การใช้ IF ใน T-SQL จะทำให้แผนการดำเนินการแคชอ่อนลงหรือไม่
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา มีการแนะนำให้ฉันว่าการใช้คำสั่ง IF ใน t-SQL batches นั้นเป็นอันตรายต่อประสิทธิภาพ ฉันพยายามค้นหาคำยืนยันหรือตรวจสอบยืนยันนี้ ฉันใช้ SQL Server 2005 และ 2008 การยืนยันคือชุดที่มีดังต่อไปนี้: - IF @parameter = 0 BEGIN SELECT ... something END ELSE BEGIN SELECT ... something else END SQL Server ไม่สามารถใช้แผนการดำเนินการที่สร้างขึ้นใหม่ได้เนื่องจากการดำเนินการครั้งต่อไปอาจต้องใช้สาขาอื่น นี่หมายความว่า SQL Server จะกำจัดหนึ่งสาขาทั้งหมดจากแผนการดำเนินการตามพื้นฐานของการดำเนินการปัจจุบันซึ่งสามารถกำหนดสาขาที่ต้องการได้แล้ว นี่เป็นเรื่องจริงหรือ …

3
บังคับให้ Flow Distinct
ฉันมีโต๊ะแบบนี้: CREATE TABLE Updates ( UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, ObjectId INT NOT NULL ) การติดตามการอัปเดตพื้นฐานไปยังวัตถุที่มี ID เพิ่มขึ้น ผู้ใช้บริการของตารางนี้จะเลือกรหัสวัตถุที่แตกต่างกัน 100 รายการเรียงลำดับตาม UpdateIdUpdateIdและเริ่มจากที่เฉพาะเจาะจง โดยพื้นฐานแล้วการติดตามจุดที่มันค้างไว้แล้วทำการสอบถามเพื่อรับการปรับปรุงใด ๆ ฉันพบสิ่งนี้เป็นปัญหาการปรับให้เหมาะสมที่น่าสนใจเพราะฉันสามารถสร้างแผนคิวรีที่เหมาะสมที่สุดโดยการเขียนคิวรีที่เกิดขึ้นกับสิ่งที่ฉันต้องการเนื่องจากดัชนี แต่ไม่รับประกันสิ่งที่ฉันต้องการ: SELECT DISTINCT TOP 100 ObjectId FROM Updates WHERE UpdateId > @fromUpdateId ที่ไหน @fromUpdateIdพารามิเตอร์กระบวนงานที่เก็บไว้ ด้วยแผนของ: SELECT <- TOP <- Hash match (flow distinct, …

2
ข้อ จำกัด ค่าเริ่มต้นคุ้มค่าหรือไม่
ฉันมักจะออกแบบฐานข้อมูลตามกฎต่อไปนี้: ไม่มีใครอื่นนอกจาก db_owner และดูแลระบบสามารถเข้าถึงตารางฐานข้อมูล บทบาทของผู้ใช้จะถูกควบคุมที่ชั้นแอปพลิเคชัน ฉันมักจะใช้บทบาท db หนึ่งรายการเพื่อให้สิทธิ์เข้าถึงมุมมองโพรซีเดอร์และฟังก์ชันที่เก็บไว้ แต่ในบางกรณีฉันเพิ่มกฎที่สองเพื่อปกป้องโพรซีเดอร์ที่เก็บไว้บางส่วน ฉันใช้ TRIGGERS เพื่อตรวจสอบข้อมูลที่สำคัญในขั้นต้น CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DML ดำเนินการโดยใช้กระบวนงานที่เก็บไว้: …

1
INSERT แบบแถวเดียว…เลือกช้ากว่าการเลือกแบบแยก
รับตารางฮีปต่อไปนี้ด้วย 400 แถวหมายเลขตั้งแต่ 1 ถึง 400: DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; และการตั้งค่าต่อไปนี้: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; ต่อไปนี้SELECTเสร็จสมบูรณ์คำสั่งในรอบ6 …

2
คำถามเกี่ยวกับประสิทธิภาพของ "SELECT TOP"
ฉันมีข้อความค้นหาที่ทำงานเร็วขึ้นมากเมื่อเลือกtop 100และช้ากว่าโดยไม่top 100เลือก จำนวนระเบียนที่ส่งคืนคือ 0 คุณสามารถอธิบายความแตกต่างในแผนคิวรีหรือแชร์ลิงก์ที่อธิบายความแตกต่างดังกล่าวได้หรือไม่ แบบสอบถามที่ไม่มีtopข้อความ: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; แผนแบบสอบถามสำหรับข้างต้น (ไม่รวมtop): https://pastebin.com/cbtJpxFf สถิติ IO และ TIME (ไม่รวมtop): SQL Server …

2
ทำไมดัชนีที่ถูกกรองในค่า IS NULL ไม่ถูกใช้
สมมติว่าเรามีคำจำกัดความของตารางดังนี้: CREATE TABLE MyTab ( ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY ,GroupByColumn NVARCHAR(10) NOT NULL ,WhereColumn DATETIME NULL ) และดัชนีที่ไม่ได้ทำคลัสเตอร์ที่กรองแล้วเช่นนี้: CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab (GroupByColumn) WHERE (WhereColumn IS NULL) เหตุใดดัชนีนี้จึงไม่ "ครอบคลุม" สำหรับคำค้นหานี้: SELECT GroupByColumn ,COUNT(*) FROM MyTab WHERE WhereColumn IS NULL GROUP BY GroupByColumn ฉันได้รับแผนปฏิบัติการนี้แล้ว: KeyLookup ใช้สำหรับกริยาที่ …

1
SELECT TOP 1 จากตารางที่มีขนาดใหญ่มากในคอลัมน์ดัชนีนั้นช้ามาก แต่ไม่ใช่ด้วยลำดับย้อนกลับ (“ desc”)
เรามีฐานข้อมูลขนาดใหญ่ประมาณ 1TB ใช้ SQL Server 2014 บนเซิร์ฟเวอร์ที่ทรงพลัง ทุกอย่างทำงานได้ดีไม่กี่ปี ประมาณ 2 สัปดาห์ที่ผ่านมาเราทำการบำรุงรักษาอย่างสมบูรณ์ซึ่งรวมถึง: ติดตั้งอัปเดตซอฟต์แวร์ทั้งหมด สร้างดัชนีและไฟล์ฐานข้อมูลขนาดกะทัดรัดทั้งหมด อย่างไรก็ตามเราไม่ได้คาดหวังว่าในบางช่วงการใช้งาน CPU ของ DB จะเพิ่มขึ้นมากกว่า 100% เป็น 150% เมื่อการโหลดจริงเหมือนกัน หลังจากการแก้ไขปัญหาจำนวนมากเราได้ จำกัด ให้แคบลงเป็นคำถามที่ง่ายมาก แต่เราไม่พบวิธีแก้ปัญหา การสืบค้นนั้นง่ายมาก: select top 1 EventID from EventLog with (nolock) order by EventID ใช้เวลาประมาณ 1.5 วินาทีเสมอ! อย่างไรก็ตามเคียวรีที่คล้ายกันที่มี "desc" จะใช้เวลาประมาณ 0 ms: select top 1 EventID …

1
ผู้ประกอบการใช้ tempdb ในการรั่วไหลของข้อมูลระหว่างการดำเนินการกับระดับที่หก
ฉันกำลังดิ้นรนเพื่อลดต้นทุนของการดำเนินการเรียงลำดับในแผนแบบสอบถามด้วยOperator usedtempdb คำเตือนto spill data during execution with spill level 2 ฉันพบโพสต์หลายรายการที่เกี่ยวข้องกับข้อมูลการรั่วไหลในระหว่างการดำเนินการกับการรั่วไหลระดับ 1แต่ไม่ใช่ระดับ 2 ดูเหมือนว่าระดับ 1 จะทำให้สถิติล้าสมัยแล้วระดับ 2 เป็นอย่างไร level 2ฉันไม่สามารถหาอะไรที่เกี่ยวข้องกับ ฉันพบบทความนี้น่าสนใจมากที่เกี่ยวข้องกับคำเตือนการเรียง: อย่าเพิกเฉยต่อคำเตือนการเรียงลำดับใน SQL Server เซิร์ฟเวอร์ SQL ของฉัน Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 17 มิถุนายน 2016 19:14:09 ลิขสิทธิ์ (c) Microsoft Corporation รุ่นองค์กรองค์กร (64 บิต) บน Windows …

3
การตัดคำค้นหาใน IF EXISTS ทำให้ช้ามาก
ฉันมีแบบสอบถามด้านล่าง: select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) แบบสอบถามด้านบนเสร็จสมบูรณ์ในสามวินาที หากเคียวรีด้านบนคืนค่าใด ๆ เราต้องการให้โพรซีเดอร์ที่เก็บไว้เป็น EXIT ดังนั้นฉันจึงเขียนมันใหม่ด้านล่าง: If Exists( select databasename from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt' and not exists(select 1 from dbo.smalltable c where c.source=l.source) ) …

3
ผลกระทบของดัชนีในคำสั่งการอัพเดทที่คอลัมน์อัพเดตไม่ได้อยู่ในดัชนี
ฉันตลอดเวลาเห็นคนบอกว่าดัชนีชะลอตัวลงupdate, และdelete insertสิ่งนี้ถูกใช้เป็นคำสั่งแบบครอบคลุมราวกับว่ามันเป็นค่าสัมบูรณ์ ในขณะที่ปรับฐานข้อมูลของฉันเพื่อปรับปรุงประสิทธิภาพฉันยังคงเจอกับสถานการณ์นี้ที่ขัดแย้งกับกฎอย่างมีเหตุผลสำหรับฉันและไม่มีที่ไหนที่ฉันสามารถหาใครพูดหรืออธิบายในทางใดทางหนึ่ง ใน SQL Server และฉันเชื่อ / เข้าใจ DBMS อื่น ๆ ส่วนใหญ่ดัชนีของคุณจะถูกสร้างขึ้นตามคอลัมน์เฉพาะที่คุณระบุ ส่วนแทรกและการลบจะมีผลกับทั้งแถวเสมอดังนั้นจึงไม่มีวิธีที่จะไม่ส่งผลกระทบต่อดัชนี แต่การปรับปรุงดูเหมือนจะมีความเป็นเอกลักษณ์มากกว่านี้เล็กน้อย หากฉันมีคอลัมน์ที่ไม่รวมอยู่ในดัชนีใด ๆ และฉันอัปเดตพวกเขาจะชะลอตัวลงเพียงเพราะฉันมีดัชนีในคอลัมน์อื่น ๆ ในตารางนั้นหรือไม่ ตัวอย่างเช่นพูดในUserตารางของฉันฉันมีหนึ่งหรือสองดัชนีคีย์หลักซึ่งเป็นคอลัมน์ Identity / Auto เพิ่มคอลัมน์และอาจอื่นในคอลัมน์บางคีย์ต่างประเทศ หากฉันอัปเดตคอลัมน์ที่ไม่มีดัชนีโดยตรงเช่นพูดว่าหมายเลขโทรศัพท์หรือที่อยู่การอัปเดตนี้จะช้าลงเพราะฉันมีดัชนีในตารางนี้ในคอลัมน์อื่น ๆ ในสถานการณ์ใดสถานการณ์หนึ่งหรือไม่ คอลัมน์ที่ฉันกำลังอัปเดตไม่ได้อยู่ในดัชนีดังนั้นเหตุผลที่ควรอัปเดตดัชนีไม่ควรใช่ไหม ถ้ามีอะไรฉันคิดว่ามันจะถูกเร่งถ้าฉันใช้ดัชนีในส่วนคำสั่ง WHERE

1
ความแตกต่างของอนุสาวรีย์ในเวลาดำเนินการระหว่างแบบสอบถามเมื่อใช้คำใบ้แบบสอบถาม RECOMPILE
ฉันมีแบบสอบถามที่เหมือนกันเกือบสองรายการที่ทำงานบนอินสแตนซ์ SQL Server 2005 เดียวกัน: อันแรกคือSELECTเคียวรีดั้งเดิมตามที่สร้างโดย LINQ (ฉันรู้ว่าฉันรู้ ... ฉันไม่ใช่นักพัฒนาแอปพลิเคชันเพียง DBA :) คนที่สองเหมือนกันกับคนแรกที่เพิ่มOPTION (RECOMPILE)ในตอนท้าย ไม่มีอะไรเปลี่ยนแปลง คนแรกใช้เวลา 55 วินาทีทุกครั้งที่วิ่ง คนที่สองใช้เวลา 2 วินาที ชุดผลลัพธ์ทั้งคู่เหมือนกัน ทำไมคำใบ้นี้ทำให้เกิดประสิทธิภาพที่เพิ่มขึ้นอย่างมาก? รายการหนังสือออนไลน์บนRECOMPILEไม่มีคำอธิบายโดยละเอียดมาก: สั่งให้โปรแกรมฐานข้อมูลเซิร์ฟเวอร์ SQL เพื่อยกเลิกแผนที่สร้างขึ้นสำหรับแบบสอบถามหลังจากที่ดำเนินการบังคับให้เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเพื่อรวบรวมแผนแบบสอบถามอีกครั้งในครั้งถัดไปที่ดำเนินการแบบสอบถามเดียวกัน โดยไม่ต้องระบุ RECOMPILE เครื่องมือฐานข้อมูลจะเก็บแผนแบบสอบถามและนำมาใช้ใหม่ เมื่อรวบรวมแผนแบบสอบถามคำแนะนำแบบสอบถาม RECOMPILE ใช้ค่าปัจจุบันของตัวแปรท้องถิ่นใด ๆ ในแบบสอบถามและหากแบบสอบถามอยู่ภายในกระบวนงานที่เก็บไว้ค่าปัจจุบันจะถูกส่งไปยังพารามิเตอร์ใด ๆ RECOMPILE เป็นทางเลือกที่มีประโยชน์ในการสร้างโพรซีเดอร์ที่เก็บไว้ซึ่งใช้ส่วนคำสั่ง WITH RECOMPILE เมื่อมีคิวรีย่อยของเคียวรีภายในโพรซีเดอร์ที่เก็บไว้เท่านั้นแทนที่จะต้องคอมไพล์ที่เก็บไว้ทั้งหมด สำหรับข้อมูลเพิ่มเติมโปรดดูการคอมไพล์ใหม่ของกระบวนงานที่เก็บไว้ RECOMPILE ยังมีประโยชน์เมื่อคุณสร้างแผนที่นำทาง สำหรับข้อมูลเพิ่มเติมดูการปรับการค้นหาในแอปพลิเคชันที่ปรับใช้โดยใช้คำแนะนำแผน เนื่องจากแบบสอบถามของฉันมีตัวแปรในเครื่องจำนวนมากฉันเดาว่า SQL Server สามารถปรับให้เหมาะสม (อย่างจริงจัง) …

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