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

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

4
มันจะเป็นการดีกว่าหรือที่จะแยกเคียวรีใหญ่ออกเป็นเคียวรีเล็ก ๆ หลายรายการ?
มีสถานการณ์ที่ต้องมีแบบสอบถามที่ใหญ่มากเข้าร่วมหลายตารางพร้อมกับคำสั่งย่อยเลือกในพวกเขาเพื่อสร้างผลลัพธ์ที่ต้องการ คำถามของฉันคือเราควรพิจารณาใช้การสืบค้นที่เล็กกว่าหลายข้อและนำการดำเนินการทางตรรกะไปสู่ชั้นแอปพลิเคชันโดยการสอบถาม DB ในการโทรมากกว่าหนึ่งครั้ง ตัวอย่างเช่นพิจารณาแบบสอบถามต่อไปนี้: SELECT * FROM `users` WHERE `user_id` IN (SELECT f2.`friend_user_id` FROM `friends` AS f1 INNER JOIN `friends` AS f2 ON f1.`friend_user_id` = f2.`user_id` WHERE f2.`is_page` = 0 AND f1.`user_id` = "%1$d" AND f2.`friend_user_id` != "%1$d" AND f2.`friend_user_id` NOT IN (SELECT `friend_user_id` FROM `friends` WHERE `user_id` = …

1
Nest Loop vs. Hash ที่ไม่พึงประสงค์เข้าร่วมใน PostgreSQL 9.6
ฉันมีปัญหากับการวางแผนการสืบค้น PostgreSQL 9.6 ข้อความค้นหาของฉันมีลักษณะเช่นนี้: SET role plain_user; SELECT properties.* FROM properties JOIN entries_properties ON properties.id = entries_properties.property_id JOIN structures ON structures.id = entries_properties.entry_id WHERE structures."STRUKTURBERICHT" != '' AND properties."COMPOSITION" LIKE 'Mo%' AND ( properties."NAME" LIKE '%VASP-ase-preopt%' OR properties."CALCULATOR_ID" IN (7,22,25) ) AND properties."TYPE_ID" IN (6) ฉันเปิดใช้งานการรักษาความปลอดภัยระดับแถวสำหรับตารางที่ใช้งานอยู่ด้านบน ด้วยset enable_nestloop = Trueตัววางแผนคิวรีรัน …

3
ค้นหา 100x ช้าลงใน SQL Server 2014 แถว Row Spool ประมาณผู้ร้ายหรือไม่
ฉันมีแบบสอบถามที่วิ่งใน800 มิลลิวินาทีใน SQL Server 2012และใช้เวลาประมาณ170 วินาทีใน SQL Server 2014 ฉันคิดว่าฉันได้ จำกัด เรื่องนี้ให้แคบลงเพื่อประเมินความน่าจะเป็นของRow Count Spoolผู้ให้บริการ ฉันได้อ่านเกี่ยวกับตัวดำเนินการสปูลแล้ว (เช่นที่นี่และที่นี่ ) แต่ฉันยังคงมีปัญหาในการทำความเข้าใจบางสิ่ง: เหตุใดแบบสอบถามนี้จึงต้องการRow Count Spoolผู้ดำเนินการ ฉันไม่คิดว่ามันจำเป็นสำหรับความถูกต้องดังนั้นสิ่งที่พยายามเพิ่มประสิทธิภาพโดยเฉพาะคืออะไร? เหตุใด SQL Server จึงประมาณว่าการเข้าร่วมกับRow Count Spoolผู้ดำเนินการลบแถวทั้งหมดออก นี่เป็นข้อบกพร่องใน SQL Server 2014 หรือไม่ ถ้าเป็นเช่นนั้นฉันจะยื่นในการเชื่อมต่อ แต่ฉันต้องการความเข้าใจที่ลึกซึ้งยิ่งขึ้นก่อน หมายเหตุ: ฉันสามารถเขียนแบบสอบถามอีกครั้งเป็นLEFT JOINหรือเพิ่มดัชนีลงในตารางเพื่อให้ได้ประสิทธิภาพที่ยอมรับได้ทั้งใน SQL Server 2012 และ SQL Server 2014 ดังนั้นคำถามนี้เกี่ยวกับการทำความเข้าใจแบบสอบถามเฉพาะและแผนในเชิงลึกมากขึ้น วิธีวลีที่ค้นหาแตกต่างกัน แบบสอบถามช้า ดูPastebin นี้สำหรับสคริปต์ทดสอบฉบับเต็ม …

2
วิธีทำให้ DISTINCT ON เร็วขึ้นใน PostgreSQL
ฉันมีตารางstation_logsในฐานข้อมูล PostgreSQL 9.6: Column | Type | ---------------+-----------------------------+ id | bigint | bigserial station_id | integer | not null submitted_at | timestamp without time zone | level_sensor | double precision | Indexes: "station_logs_pkey" PRIMARY KEY, btree (id) "uniq_sid_sat" UNIQUE CONSTRAINT, btree (station_id, submitted_at) ฉันพยายามที่จะได้รับที่ผ่านมาlevel_sensorค่าขึ้นอยู่กับแต่ละsubmitted_at station_idมีประมาณ 400 ที่ไม่ซ้ำกันมีstation_idค่านิยมและรอบ 20k station_idแถวต่อวันต่อ ก่อนสร้างดัชนี: …

1
สั่งช้าโดย SQL Server
ในแอปพลิเคชันของฉันฉันมีคิวรีซึ่งทำการค้นหาในตาราง "ไฟล์" ตาราง "files" ถูกแบ่งพาร์ติชันโดย "f". "created" (ดูคำจำกัดความของตารางและมีแถว ~ 26 ล้านแถวสำหรับไคลเอ็นต์ 19 ("f". "cid = 19) จุดนี่คือถ้าฉันทำแบบสอบถามนี้: SELECT "f"."id" AS "FileId" , "f"."name" AS "FileName" , "f"."year" AS "Fileyear" , "f"."cid" AS "clientId" , "f"."created" AS "FileDate" , CASE WHEN ("vnVE0"."value" is not null AND "vnVE0"."value" != '') THEN CAST("vnVE0"."value" …

3
จำลองฟังก์ชันสเกลาร์ที่ผู้ใช้กำหนดในลักษณะที่ไม่ได้ป้องกันการขนาน
ฉันพยายามดูว่ามีวิธีการหลอกลวง SQL Server ให้ใช้แผนบางอย่างสำหรับแบบสอบถามหรือไม่ 1. สภาพแวดล้อม ลองนึกภาพคุณมีข้อมูลบางอย่างที่ใช้ร่วมกันระหว่างกระบวนการที่แตกต่างกัน สมมติว่าเรามีผลการทดสอบบางอย่างซึ่งใช้พื้นที่มาก จากนั้นสำหรับแต่ละขั้นตอนเรารู้ว่าต้องการใช้ปี / เดือนใด if object_id('dbo.SharedData') is not null drop table SharedData create table dbo.SharedData ( experiment_year int, experiment_month int, rn int, calculated_number int, primary key (experiment_year, experiment_month, rn) ) go ตอนนี้สำหรับทุกกระบวนการเรามีพารามิเตอร์ที่บันทึกไว้ในตาราง if object_id('dbo.Params') is not null drop table dbo.Params create table dbo.Params …

3
แบบสอบถาม JOIN ที่เรียบง่ายช้ามาก
โครงสร้าง DB แบบง่าย (สำหรับฟอรัมออนไลน์): CREATE TABLE users ( id integer NOT NULL PRIMARY KEY, username text ); CREATE INDEX ON users (username); CREATE TABLE posts ( id integer NOT NULL PRIMARY KEY, thread_id integer NOT NULL REFERENCES threads (id), user_id integer NOT NULL REFERENCES users (id), date timestamp without time …

2
ฉันสามารถ refactor แบบสอบถามนี้เพื่อให้ทำงานในแบบคู่ขนานได้หรือไม่
ฉันมีแบบสอบถามที่ใช้เวลาประมาณ 3 ชั่วโมงในการทำงานบนเซิร์ฟเวอร์ของเรา - และมันไม่ได้ใช้ประโยชน์จากการประมวลผลแบบขนาน (ประมาณ 1.15 ล้านระเบียนในdbo.Deidentified300 ระเบียนในdbo.NamesMultiWord) เซิร์ฟเวอร์มีการเข้าถึง 8 คอร์ UPDATE dbo.Deidentified WITH (TABLOCK) SET IndexedXml = dbo.ReplaceMultiWord(IndexedXml), DE461 = dbo.ReplaceMultiWord(DE461), DE87 = dbo.ReplaceMultiWord(DE87), DE15 = dbo.ReplaceMultiWord(DE15) WHERE InProcess = 1; และReplaceMultiwordเป็นกระบวนการที่กำหนดเป็น: SELECT @body = REPLACE(@body,Names,Replacement) FROM dbo.NamesMultiWord ORDER BY [WordLength] DESC RETURN @body --NVARCHAR(MAX) การเรียกร้องให้ReplaceMultiwordป้องกันการก่อตัวเป็นแผนขนานหรือไม่ มีวิธีที่จะเขียนสิ่งนี้เพื่อให้มีความเท่าเทียมกันหรือไม่? ReplaceMultiword …

1
ฉันจะบังคับให้ประเมินค่าสเกลาร์ UDF เพียงครั้งเดียวในแบบสอบถามได้อย่างไร
ฉันมีข้อความค้นหาที่ต้องการกรองผลลัพธ์ของสเกลาร์ UDF ต้องส่งเคียวรีเป็นคำสั่งเดียว (ดังนั้นฉันไม่สามารถกำหนดผลลัพธ์ UDF ให้กับตัวแปรโลคอล) และฉันไม่สามารถใช้ TVF ได้ ฉันรับรู้ถึงปัญหาประสิทธิภาพที่เกิดจาก UDF แบบเกลาซึ่งรวมถึงการบังคับให้แผนทั้งหมดทำงานอย่างต่อเนื่องหน่วยความจำที่มากเกินไปปัญหาการประมาณค่าทาง cardinality และการขาด inlining สำหรับคำถามนี้โปรดสมมติว่าฉันต้องใช้สเกลาร์ UDF UDF นั้นค่อนข้างแพงในการโทร แต่ในทางทฤษฎีแล้วแบบสอบถามสามารถนำไปใช้อย่างมีเหตุผลโดยเครื่องมือเพิ่มประสิทธิภาพในลักษณะที่ฟังก์ชันจะต้องคำนวณเพียงครั้งเดียว ฉันล้อเลียนตัวอย่างที่ง่ายมากสำหรับคำถามนี้ แบบสอบถามต่อไปนี้ใช้เวลา 6152 ms ในการดำเนินการบนเครื่องของฉัน: SELECT x1.ID FROM dbo.X_100_INTEGERS x1 WHERE x1.ID >= dbo.EXPENSIVE_UDF(); ตัวดำเนินการตัวกรองในแผนแบบสอบถามชี้ให้เห็นว่าฟังก์ชันนั้นถูกประเมินหนึ่งครั้งสำหรับแต่ละแถว: DDL และการเตรียมข้อมูล: CREATE OR ALTER FUNCTION dbo.EXPENSIVE_UDF () RETURNS INT AS BEGIN DECLARE @tbl TABLE …

1
ประสิทธิภาพของ postgres_fdw ช้า
แบบสอบถามต่อไปนี้ในต่างประเทศใช้เวลาประมาณ 5 วินาทีในการดำเนินการกับ 3.2 ล้านแถว: SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode") FROM "IntterraNearRealTimeUnitReflexes300sForeign" x WHERE x."IncidentDateTime" >= '05/01/2016' GROUP BY x."IncidentTypeCode" ORDER BY 1; เมื่อฉันเรียกใช้คิวรีเดียวกันในตารางปกติมันจะส่งคืนภายใน 0.6 วินาที แผนการดำเนินการแตกต่างกันมาก: ตารางปกติ Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1) Sort Key: "IncidentTypeCode" Sort Method: quicksort Memory: 25kB -> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 …

1
วิธีเพิ่มประสิทธิภาพของแบบสอบถามเพื่อให้ค้นหาในดัชนีหนึ่งก่อนจากนั้นจึงสร้างดัชนีอื่นหลังจากนั้น
ฉันมีการวัดโลกสองชุดจากข้อมูลดาวเทียมแต่ละชุดมีเขตเวลา (mjd สำหรับค่าจูเลียนเฉลี่ย) และตำแหน่งทางภูมิศาสตร์ (GeoPoint, spacial) และฉันกำลังมองหาความบังเอิญระหว่างสองชุดดังกล่าวซึ่งเวลาของพวกเขาตรงกับเกณฑ์ของ 3 ชั่วโมง (หรือ .125 วัน) และระยะทางของพวกเขาภายใน 200 กม. ของกันและกัน ฉันสร้างดัชนีสำหรับทั้งฟิลด์ mjd บนทั้งตารางและตารางเชิงพื้นที่ เมื่อฉันเพิ่งเข้าร่วมในข้อ จำกัด เวลาฐานข้อมูลจะคำนวณการแข่งขัน 100,000 ครั้งใน 8 วินาทีและคำนวณระยะทางสำหรับการแข่งขันทั้งหมด 100,000 ครั้งในเวลานั้น แบบสอบถามมีลักษณะดังนี้: select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint …

2
วิธีที่มีประสิทธิภาพในการเปรียบเทียบชุดข้อมูลขนาดใหญ่สองชุดใน SQL
ขณะนี้ฉันกำลังเปรียบเทียบชุดข้อมูลสองชุดที่มีStoreKey/ProductKeyชุดค่าผสมที่ไม่ซ้ำกัน ชุดข้อมูลชุดที่ 1 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายระหว่างเริ่มมกราคม 2012 และสิ้นสุดพฤษภาคม 2014 (ผลลัพธ์ = 450K บรรทัด) ชุดข้อมูลที่ 2 มีชุดค่าStoreKey/ProductKeyผสมที่ไม่ซ้ำกันสำหรับการขายเริ่มต้นมิถุนายน 2014 จนถึงวันนี้ (ผลลัพธ์ = 190K บรรทัด) ฉันกำลังมองหาStoreKey/ProductKeyชุดค่าผสมที่อยู่ในชุดที่ 2 แต่ไม่ใช่ในชุดที่ 1 - คือผลิตภัณฑ์ใหม่ที่ขายตั้งแต่ต้นเดือนมิถุนายน จนถึงตอนนี้ฉันได้ทิ้งชุดข้อมูลสองชุดลงในตารางชั่วคราวสร้างดัชนีสำหรับทั้งสองตารางบนทั้งสองปุ่มแล้วใช้EXCEPTคำสั่งเพื่อค้นหารายการที่ไม่ซ้ำกัน วิธีที่มีประสิทธิภาพที่สุดในการเปรียบเทียบชุดข้อมูลขนาดใหญ่ดังกล่าวคืออะไร มีวิธีที่มีประสิทธิภาพมากกว่าในการทำการเปรียบเทียบขนาดใหญ่ประเภทนี้หรือไม่

4
การจัดการกับ CXPACKET รอ - ตั้งค่าขีด จำกัด ต้นทุนสำหรับการขนาน
จากการติดตามคำถามก่อนหน้านี้เกี่ยวกับการแก้ไขปัญหาเว็บไซต์ SharePointอย่างสมบูรณ์ฉันสงสัยว่าฉันสามารถทำบางสิ่งเกี่ยวกับ CXPACKET ได้หรือไม่ ฉันรู้ว่าวิธีแก้ปัญหาข้อเข่ากระตุกคือการปิดความขนานทั้งหมดโดยการตั้งค่า MAXDOP เป็น 1 - ฟังดูเหมือนเป็นความคิดที่ไม่ดี แต่แนวคิดอื่นคือการเพิ่มเกณฑ์ต้นทุนก่อนที่จะเริ่มขนานกันเริ่มต้นที่ 5 สำหรับต้นทุนของแผนการดำเนินการค่อนข้างต่ำ ดังนั้นฉันจึงสงสัยว่ามีคำถามที่เขียนไว้แล้วว่าจะพบคำค้นหาที่มีค่าใช้จ่ายแผนปฏิบัติการสูงที่สุด (ฉันรู้ว่าคุณสามารถค้นหาสิ่งที่มีระยะเวลาดำเนินการสูงสุดและอื่น ๆ ได้) แต่เป็นต้นทุนแผนปฏิบัติการที่เรียกคืนได้ ด้วยหรือไม่) และนั่นก็จะบอกฉันด้วยว่ามีการดำเนินการค้นหาแบบขนานหรือไม่ ใครบ้างมีสคริปต์ดังกล่าวในมือหรือสามารถชี้ให้ฉันไปในทิศทางของมุมมอง DMV, DMF หรือแคตตาล็อกระบบอื่น ๆ ที่เกี่ยวข้องเพื่อค้นหาสิ่งนี้?

3
เหตุใดแบบสอบถามรวมจึงเร็วขึ้นอย่างมากเมื่อใช้ GROUP BY clause มากกว่าไม่มี
ฉันแค่อยากรู้ว่าเหตุใดแบบสอบถามโดยรวมจึงทำงานเร็วขึ้นมากโดยมีGROUP BYประโยคมากกว่าไม่มี ตัวอย่างเช่นแบบสอบถามนี้ใช้เวลาเกือบ 10 วินาทีในการเรียกใช้ SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 ในขณะนี้อันนี้ใช้เวลาน้อยกว่าหนึ่งวินาที SELECT MIN(CreatedDate) FROM MyTable WHERE SomeIndexedValue = 1 GROUP BY CreatedDate มีเพียงหนึ่งเดียวCreatedDateในกรณีนี้ดังนั้นคิวรีที่จัดกลุ่มจะส่งคืนผลลัพธ์เดียวกับกลุ่มที่ไม่ได้จัดกลุ่ม ฉันสังเกตเห็นแผนการดำเนินการสำหรับแบบสอบถามที่สองจะแตกต่างกัน - แบบสอบถามที่สองใช้ Parallelism ในขณะที่แบบสอบถามแรกไม่ เป็นเรื่องปกติหรือไม่ที่เซิร์ฟเวอร์ SQL จะประเมินคิวรีแบบรวมแตกต่างกันถ้ามันไม่มี GROUP BY clause? และมีสิ่งที่ฉันสามารถทำได้เพื่อปรับปรุงประสิทธิภาพของแบบสอบถามที่ 1 โดยไม่ต้องใช้GROUP BYคำสั่งหรือไม่ แก้ไข ฉันเพิ่งเรียนรู้ว่าฉันสามารถใช้OPTION(querytraceon 8649)ในการตั้งค่าใช้จ่ายค่าใช้จ่ายของความเท่าเทียมเป็น 0 ซึ่งทำให้แบบสอบถามใช้ความเท่าเทียมและลดรันไทม์เป็น 2 วินาทีแม้ว่าฉันจะไม่รู้ว่ามีข้อเสียในการใช้คำใบ้แบบสอบถามนี้หรือไม่ SELECT MIN(CreatedDate) …

5
ปรับปรุงความเร็วในการลบสำหรับ SQL Server
เรามีฐานข้อมูลการผลิตขนาดใหญ่มีขนาดประมาณ 300GB มีวิธีการใดในการปรับปรุงประสิทธิภาพของคิวรีการลบหรือไม่ ตอนนี้ความเร็วในการลบอยู่ระหว่าง 1-10k ต่อนาทีมันช้ามากสำหรับเรา

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