คำถามติดแท็ก optimization

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

2
ค่าคอลัมน์ที่ว่างเปล่าใช้พื้นที่เก็บข้อมูลเดียวกันกับค่าคอลัมน์ที่เต็มไปหรือไม่?
ฉันมีตารางที่มี 2 คอลัมน์ varchar(38)ประเภทของคอลัมน์ทั้งมีการตั้งค่า ถ้าฉันสร้างแถวที่มีค่าว่างสำหรับคอลัมน์ใดคอลัมน์หนึ่งจะใช้พื้นที่เก็บข้อมูลเดียวกันหรือไม่ถ้าค่านั้นไม่ว่างเปล่า? กล่าวอีกนัยหนึ่ง MySQL จะจองพื้นที่เก็บข้อมูลสำหรับคอลัมน์ (ขึ้นอยู่กับประเภท) เมื่อสร้างแถวหรือไม่

2
วิธีเพิ่มความเร็วในการเลือกที่แตกต่างกันอย่างไร
ฉันมีตัวเลือกแบบง่าย ๆ ในข้อมูลอนุกรมเวลา: SELECT DISTINCT user_id FROM events WHERE project_id = 6 AND time > '2015-01-11 8:00:00' AND time < '2015-02-10 8:00:00'; และใช้เวลา 112 วินาที นี่คือแผนแบบสอบถาม: http://explain.depesz.com/s/NTyA แอปพลิเคชันของฉันต้อง preform การดำเนินการที่แตกต่างกันมากมายและนับเช่นนี้ มีวิธีที่เร็วกว่าในการรับข้อมูลประเภทนี้หรือไม่

1
เพรดิเคตของ SARGable จะถูกผลักลงใน CTE หรือตารางที่ได้รับ
กระสอบทราย ขณะที่การทำงานในบล็อกด้านคุณภาพPosts®ฉันมาข้ามบางพฤติกรรมเพิ่มประสิทธิภาพผมพบว่ามันโกรธที่น่าสนใจ ฉันไม่มีคำอธิบายในทันทีอย่างน้อยก็ไม่มีใครมีความสุขดังนั้นฉันวางไว้ที่นี่ในกรณีที่มีคนฉลาดปรากฏขึ้น ถ้าคุณต้องการที่จะทำตามที่คุณสามารถคว้า 2013 รุ่นของการถ่ายโอนข้อมูลกองมากเกินที่นี่ ฉันใช้ตารางความคิดเห็นโดยมีดัชนีเพิ่มเติมหนึ่งรายการ CREATE INDEX [ix_ennui] ON [dbo].[Comments] ( [UserId], [Score] DESC ); คำค้นหาหนึ่ง เมื่อผมสอบถามตารางเช่นดังนั้นฉันได้รับแผนแบบสอบถามแปลก WITH x AS ( SELECT TOP 101 c.UserId, c.Text, c.Score FROM dbo.Comments AS c ORDER BY c.Score DESC ) SELECT * FROM x WHERE x.Score >= 500; เพรดิเคต SARGable บนคะแนนไม่ได้ถูกผลักเข้าไปใน CTE …

2
เข้าร่วมการสืบค้นใช้เวลา 11 นาทีเพื่อเรียกใช้บนตาราง 300,000 แถว
แบบสอบถามด้านล่างใช้เวลาในการดำเนินการมากกว่า 11 นาที SELECT `c`.*, `e`.`name` AS `employee_name`, `e`.`emp_no`, `d`.`code` AS `department_code`, IF(ew.code IS NOT NULL, ew.code, egw.code) AS shift_code, IF(ew.code IS NOT NULL, ew.time_in_from, egw.time_in_from) AS time_in_from, IF(ew.code IS NOT NULL, ew.time_out_to, egw.time_out_to) AS time_out_to, IF(ew.code IS NOT NULL, ew.next_day, egw.next_day) AS next_day FROM `tms_emp_badge_card` AS `c` LEFT JOIN …

3
เหตุใดข้อความค้นหา EXISTS ของฉันจึงทำการสแกนดัชนีแทนที่จะค้นหาดัชนี
ฉันกำลังปรับปรุงการค้นหาให้ดีที่สุด สำหรับแบบสอบถามด้านล่าง SET STATISTICS IO ON; DECLARE @OrderStartDate DATETIME2 = '27 feb 2016'; DECLARE @OrderEndDate DATETIME2 = '28 feb 2016'; SELECT o.strBxOrderNo , o.sintOrderStatusID , o.sintOrderChannelID , o.sintOrderTypeID , o.sdtmOrdCreated , o.sintMarketID , o.strOrderKey , o.strOfferCode , o.strCurrencyCode , o.decBCShipFullPrice , o.decBCShipFinal , o.decBCShipTax , o.decBCTotalAmount , o.decWrittenTotalAmount , o.decBCWrittenTotalAmount …

2
ทำไมการประมาณแถวของ SQL Server จึงเปลี่ยนเมื่อฉันเพิ่มคำแนะนำการเข้าร่วม
ฉันมีแบบสอบถามที่รวมตารางไม่กี่ตารางและทำงานได้ไม่ดีนัก - การประมาณแถวเป็นวิธีปิด (1,000 ครั้ง) และมีการเลือกการเข้าร่วมลูปซ้อนกันทำให้เกิดการสแกนหลายตาราง รูปร่างของแบบสอบถามค่อนข้างตรงไปตรงมามีลักษณะดังนี้: SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID เล่นรอบกับแบบสอบถามฉันสังเกตเห็นว่าเมื่อฉันบอกเป็นนัย ๆ ให้ใช้การรวม Merge สำหรับการรวมอย่างใดอย่างหนึ่งมันทำงานเร็วขึ้นหลายครั้ง สิ่งนี้ฉันสามารถเข้าใจได้ - การรวมการผสานเป็นตัวเลือกที่ดีกว่าสำหรับข้อมูลที่เข้าร่วม แต่ SQL Server ไม่คาดการณ์ว่าจะเลือก …

2
ดัชนีในคอลัมน์ที่คำนวณแล้วยังไม่สามารถค้นหาได้
ฉันมีตารางเรียกว่ามีคอลัมน์คำนวณยังคงเรียกว่าAddress Hashkeyคอลัมน์นั้นถูกกำหนดไว้แล้ว แต่ไม่แม่นยำ มันมีดัชนีที่เป็นเอกลักษณ์ของมันที่ไม่สามารถหาได้ ถ้าฉันเรียกใช้แบบสอบถามนี้คืนคีย์หลัก: SELECT @ADDRESSID= ISNULL(AddressId,0) FROM dbo.[Address] WHERE HashKey = @HashKey ฉันได้รับแผนนี้: ถ้าฉันบังคับดัชนีฉันจะได้รับสิ่งนี้ยิ่งแย่ลง: ถ้าฉันพยายามและบังคับทั้งดัชนีและการค้นหาฉันได้รับข้อผิดพลาด: ตัวประมวลผลแบบสอบถามไม่สามารถสร้างแผนแบบสอบถามได้เนื่องจากคำแนะนำที่กำหนดไว้ในแบบสอบถามนี้ ส่งแบบสอบถามอีกครั้งโดยไม่ระบุคำแนะนำใด ๆ และไม่ใช้SET FORCEPLAN นี่เป็นเพียงเพราะมันไม่แม่นยำใช่ไหม ฉันคิดว่าไม่สำคัญว่ามันจะยังคงอยู่หรือไม่? มีวิธีทำให้ดัชนีนี้ค้นหาได้โดยไม่ทำให้คอลัมน์นี้ไม่คำนวณหรือไม่ ใครบ้างมีลิงค์ไปยังข้อมูลเกี่ยวกับเรื่องนี้? ฉันไม่สามารถโพสต์การสร้างตารางจริง แต่นี่เป็นตารางทดสอบที่มีปัญหาเดียวกัน: drop TABLE [dbo].[Test] CREATE TABLE [dbo].[Test] ( [test] [VARCHAR](100) NULL, [TestGeocode] [geography] NULL, [Hashkey] AS CAST( ( hashbytes ('SHA', ( RIGHT(REPLICATE(' ', …

1
เหตุใดผู้ดำเนินการรวมจึงใช้หลังจากการสแกนดัชนีที่ไม่ซ้ำ
ฉันมีตารางที่มีดัชนีที่ไม่ซ้ำซึ่งกรองแล้วสำหรับค่าที่ไม่เป็นโมฆะ ในแผนแบบสอบถามมีการใช้งานที่แตกต่างกัน มีเหตุผลสำหรับสิ่งนี้หรือไม่? USE tempdb CREATE TABLE T1( Id INT NOT NULL IDENTITY PRIMARY KEY ,F1 INT , F2 INT ) go CREATE UNIQUE NONCLUSTERED INDEX UK_T1 ON T1 (F1,F2) WHERE F1 IS NOT NULL AND F2 IS NOT NULL GO INSERT INTO T1(f1,F2) VALUES(1,1),(1,2),(2,1) SELECT DISTINCT F1,F2 FROM T1 …

3
ดัชนีสำหรับเคียวรี SQL ที่มีเงื่อนไข WHERE และ GROUP BY
ฉันพยายามที่จะกำหนดดัชนีที่จะใช้สำหรับแบบสอบถาม SQL ที่มีWHEREเงื่อนไขและGROUP BYที่กำลังทำงานช้ามาก คำค้นหาของฉัน: SELECT group_id FROM counter WHERE ts between timestamp '2014-03-02 00:00:00.0' and timestamp '2014-03-05 12:00:00.0' GROUP BY group_id ปัจจุบันตารางมี 32.000.000 แถว เวลาดำเนินการของแบบสอบถามเพิ่มขึ้นมากเมื่อฉันเพิ่มกรอบเวลา ตารางที่สงสัยจะเป็นดังนี้: CREATE TABLE counter ( id bigserial PRIMARY KEY , ts timestamp NOT NULL , group_id bigint NOT NULL ); ขณะนี้ฉันมีดัชนีต่อไปนี้ แต่ประสิทธิภาพยังคงช้า: CREATE INDEX …

3
การปรับลำดับชั้นของ CTE ให้เหมาะสม
อัปเดตด้านล่าง ฉันมีตารางบัญชีที่มีสถาปัตยกรรมบัญชี acct / parent โดยทั่วไปเพื่อแสดงลำดับชั้นของบัญชี (SQL Server 2012) ฉันสร้างมุมมองโดยใช้ CTE เพื่อตัดลำดับชั้นและโดยรวมแล้วทำงานได้อย่างสวยงามและตามที่ตั้งใจไว้ ฉันสามารถสอบถามลำดับชั้นได้ทุกระดับและดูสาขาได้อย่างง่ายดาย มีฟิลด์ตรรกะทางธุรกิจหนึ่งฟิลด์ที่จำเป็นต้องส่งคืนเป็นฟังก์ชันของลำดับชั้น ฟิลด์ในแต่ละบัญชีบันทึกอธิบายขนาดของธุรกิจ (เราจะเรียกว่า CustomerCount) ตรรกะที่ฉันต้องการในการรายงานความต้องการในการสะสม CustomerCount จากสาขาทั้งหมด กล่าวอีกนัยหนึ่งเมื่อได้รับบัญชีฉันต้องสรุปยอดเงินของลูกค้าสำหรับบัญชีนั้นพร้อมกับเด็กทุกคนในทุกสาขาด้านล่างบัญชีตามลำดับชั้น ฉันคำนวณฟิลด์สำเร็จโดยใช้ฟิลด์ลำดับชั้นที่สร้างขึ้นภายใน CTE ซึ่งดูเหมือน acct4.acct3.acct2.acct1 ปัญหาที่ฉันพบคือทำให้มันทำงานได้เร็ว หากไม่มีฟิลด์คำนวณนี้แบบสอบถามจะทำงานใน ~ 3 วินาที เมื่อฉันเพิ่มในเขตข้อมูลจากการคำนวณมันจะกลายเป็นแบบสอบถาม 4 นาที นี่คือรุ่นที่ดีที่สุดที่ฉันสามารถพบได้เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ฉันกำลังมองหาแนวคิดในการปรับโครงสร้างมุมมองนี้โดยไม่ต้องเสียสละอย่างมากต่อการแสดง ฉันเข้าใจเหตุผลที่สิ่งนี้ช้าลง (ต้องคำนวณภาคแสดงในส่วนคำสั่งที่ไหน) แต่ฉันไม่สามารถคิดวิธีอื่นในการจัดโครงสร้างและยังได้ผลลัพธ์เดียวกัน นี่คือตัวอย่างรหัสบางส่วนเพื่อสร้างตารางและทำ CTE ให้ตรงตามที่ใช้ในสภาพแวดล้อมของฉัน Use Tempdb go CREATE TABLE dbo.Account ( Acctid varchar(1) …

2
วิธีเพิ่มประสิทธิภาพการสืบค้น T-SQL โดยใช้ Execution Plan
ฉันมีแบบสอบถาม SQL ที่ฉันใช้เวลาสองวันที่ผ่านมาพยายามเพิ่มประสิทธิภาพโดยใช้การทดลองและข้อผิดพลาดและแผนการดำเนินการ แต่ไม่มีประโยชน์ โปรดยกโทษให้ฉันที่ทำเช่นนี้ แต่ฉันจะโพสต์แผนการดำเนินการทั้งหมดที่นี่ ฉันได้ใช้ความพยายามในการสร้างชื่อตารางและคอลัมน์ในแบบสอบถามและแผนปฏิบัติการทั่วไปทั้งเพื่อความกระชับและเพื่อปกป้อง IP ของ บริษัท ของฉัน แผนปฏิบัติการสามารถเปิดได้กับSQL ยามแผน Explorer ที่ ฉันทำ T-SQL ในปริมาณที่พอใช้ แต่การใช้แผนการดำเนินการเพื่อเพิ่มประสิทธิภาพการสืบค้นของฉันเป็นพื้นที่ใหม่สำหรับฉันและฉันได้พยายามเข้าใจวิธีการทำ ดังนั้นหากใครสามารถช่วยฉันด้วยและอธิบายว่าแผนปฏิบัติการนี้สามารถถอดรหัสเพื่อค้นหาวิธีในการค้นหาเพื่อเพิ่มประสิทธิภาพได้ฉันจะขอบคุณตลอดไป ฉันมีคำถามเพิ่มเติมเพื่อเพิ่มประสิทธิภาพ - ฉันต้องการกระดานกระโดดน้ำเพื่อช่วยฉันในเรื่องนี้เป็นครั้งแรก นี่คือแบบสอบถาม: DECLARE @Param0 DATETIME = '2013-07-29'; DECLARE @Param1 INT = CONVERT(INT, CONVERT(VARCHAR, @Param0, 112)) DECLARE @Param2 VARCHAR(50) = 'ABC'; DECLARE @Param3 VARCHAR(100) = 'DEF'; DECLARE @Param4 VARCHAR(50) …

3
เหตุใดจึงมีแผนปฏิบัติการแตกต่างกันระหว่าง OFFSET … FETCH และแบบ ROW_NUMBER แบบเก่า
OFFSET ... FETCHรุ่นใหม่แนะนำด้วย SQL Server 2012 เสนอการเพจที่ง่ายและเร็วขึ้น ทำไมจึงมีความแตกต่างใด ๆ เมื่อพิจารณาว่าทั้งสองรูปแบบมีความหมายเหมือนกันและเป็นเรื่องธรรมดามาก? ใครจะสันนิษฐานว่าเครื่องมือเพิ่มประสิทธิภาพรับรู้ทั้งสองและเพิ่มประสิทธิภาพพวกเขา (เล็กน้อย) อย่างเต็มที่ นี่เป็นกรณีที่ง่ายมากซึ่งOFFSET ... FETCHเร็วกว่าประมาณ 2 เท่าตามประมาณการต้นทุน SELECT * INTO #objects FROM sys.objects SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY object_id) r FROM #objects ) x WHERE r >= 30 AND r < (30 + 10) …

1
เหตุใดจำนวนการดำเนินการสแกนดัชนีแบบกลุ่มจึงสูงมาก
ฉันมีสองแบบสอบถามที่คล้ายกันที่สร้างแผนแบบสอบถามเดียวกันยกเว้นว่าแผนแบบสอบถามหนึ่งดำเนินการสแกนดัชนีแบบกลุ่ม 1316 ครั้งในขณะที่คนอื่น ๆ ดำเนินการมัน 1 ครั้ง ข้อแตกต่างระหว่างแบบสอบถามทั้งสองนี้คือเกณฑ์วันที่แตกต่างกัน แบบสอบถามที่ใช้เวลานานจริง ๆ แล้ว จำกัด วันที่ให้แคบลงและดึงข้อมูลน้อยลง ฉันได้ระบุดัชนีบางอย่างที่จะช่วยในการสืบค้นทั้งสองข้อ แต่ฉันต้องการเข้าใจว่าทำไมตัวดำเนินการ Clustered Index Scan จึงเรียกใช้งาน 1,316 ครั้งสำหรับการสืบค้นที่เกือบจะเหมือนกับครั้งที่เรียกใช้งาน 1 ครั้ง ฉันตรวจสอบสถิติเกี่ยวกับเภสัชจลนศาสตร์ที่กำลังถูกสแกนและพวกเขาค่อนข้างทันสมัย ข้อความค้นหาเดิม: select distinct FIR_Incident.IncidentID from FIR_Incident left join ( select incident_id as exported_incident_id from postnfirssummary ) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid where FI_IncidentDate between '2011-06-01 00:00:00.000' …

2
“ การคัดลอกไปยังตาราง tmp” ช้ามาก
นี่คือตัวอย่างการสืบค้นของฉัน: SELECT nickname, CASE class_id WHEN 1 THEN 'Druid' WHEN 2 THEN 'Necromancer' WHEN 3 THEN 'Mage' WHEN 4 THEN 'Priest' WHEN 5 THEN 'Warrior' WHEN 6 THEN 'Stalker' WHEN 7 THEN 'Paladin' WHEN 8 THEN 'Psionic' END class_name, ROUND(AVG(level),2) level, ROUND(AVG(tabard_id),2) tabard, CASE rank_id WHEN 1 THEN 'Leader' WHEN …

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

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