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

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

6
วิธีตรวจสอบว่าจำเป็นต้องใช้ดัชนีหรือไม่
ฉันใช้เครื่องมือดัชนีอัตโนมัติบนฐานข้อมูล MS SQL ของเรา (ฉันแก้ไขสคริปต์ที่มาจาก Microsoft ซึ่งดูที่ตารางสถิติดัชนี - ดัชนีอัตโนมัติแบบดัชนี ) จากสถิติตอนนี้ฉันมีรายการคำแนะนำสำหรับดัชนีที่ต้องการสร้าง แก้ไข: ดัชนีที่อธิบายข้างต้นนำข้อมูลจาก DMV ที่บอกให้คุณทราบว่าโปรแกรมฐานข้อมูลจะใช้อะไรสำหรับดัชนีหากมีอยู่และสคริปต์ใช้คำแนะนำ Top x (ตามการค้นหาผู้ใช้ส่งผลกระทบ ฯลฯ ) และวางลงในตาราง (แก้ไขด้านบนบางส่วนมาจากคำตอบของ Larry Coleman ด้านล่างเพื่อชี้แจงสิ่งที่สคริปต์กำลังทำอยู่) เนื่องจากฉันยังใหม่กับผู้ดูแลฐานข้อมูลและมีการค้นหาอย่างรวดเร็วทั่วเน็ตฉันลังเลที่จะกระโดดและเพิ่มดัชนีที่แนะนำอย่างสุ่มสี่สุ่มห้า อย่างไรก็ตามไม่มีประสบการณ์ในสาขานี้ฉันกำลังมองหาคำแนะนำเกี่ยวกับวิธีตรวจสอบว่าคำแนะนำนั้นจำเป็นหรือไม่ ฉันจำเป็นต้องเรียกใช้ SQL Profiler หรือไม่ควรตรวจสอบรหัสที่สืบค้นตารางหรือไม่ และคุณมีคำแนะนำอื่น ๆ อีกไหม?

4
การเพิ่มประสิทธิภาพการสืบค้นในช่วงเวลาที่ประทับ (สองคอลัมน์)
ฉันใช้ PostgreSQL 9.1 บน Ubuntu 12.04 ฉันต้องเลือกระเบียนภายในช่วงเวลาหนึ่ง: ตารางของฉันtime_limitsมีสองtimestampฟิลด์และหนึ่งintegerคุณสมบัติ มีคอลัมน์เพิ่มเติมในตารางจริงของฉันที่ไม่เกี่ยวข้องกับแบบสอบถามนี้ create table ( start_date_time timestamp, end_date_time timestamp, id_phi integer, primary key(start_date_time, end_date_time,id_phi); ตารางนี้มีเร็กคอร์ด 2M โดยประมาณ ข้อความค้นหาต่อไปนี้ใช้เวลามหาศาล select * from time_limits as t where t.id_phi=0 and t.start_date_time <= timestamp'2010-08-08 00:00:00' and t.end_date_time >= timestamp'2010-08-08 00:05:00'; ดังนั้นฉันจึงพยายามเพิ่มดัชนีอื่น - ค่าผกผันของ PK: create index idx_inversed …

3
จะใช้มุมมองใน MySQL เมื่อใด
เมื่อสร้างตารางจากหลายการรวมเพื่อใช้ในการวิเคราะห์เมื่อใดที่จะใช้มุมมองกับการสร้างตารางใหม่ เหตุผลหนึ่งที่ฉันต้องการใช้มุมมองก็คือสคีมาฐานข้อมูลได้รับการพัฒนาโดยผู้ดูแลระบบของเราจากภายใน Ruby และฉันไม่คุ้นเคยกับ Ruby ฉันสามารถขอให้สร้างตาราง แต่ต้องการขั้นตอนเพิ่มเติมและฉันต้องการความยืดหยุ่นมากขึ้นเมื่อทำการพัฒนา / ทดสอบการรวมใหม่ ฉันเริ่มใช้มุมมองตามคำตอบของคำถามที่เกี่ยวข้องใน SO ( เมื่อใดที่จะใช้ R, เมื่อใดควรใช้ SQL ) คำตอบที่ได้รับการโหวตสูงสุดจะเริ่มต้น "ทำการเปลี่ยนแปลงข้อมูลใน SQL จนกว่าข้อมูลจะอยู่ในตารางเดียวแล้วทำส่วนที่เหลือใน R" ฉันเริ่มใช้มุมมอง แต่ฉันมีปัญหาเล็กน้อยเกี่ยวกับมุมมอง: ข้อความค้นหาช้าลงมาก มุมมองไม่ได้รับการเททิ้งจากการผลิตไปยังฐานข้อมูลสำรองที่ฉันใช้สำหรับการวิเคราะห์ มุมมองที่เหมาะสมสำหรับการใช้งานนี้? ถ้าเป็นเช่นนั้นฉันควรคาดหวังว่าจะได้รับการลงโทษหรือไม่ มีวิธีเพิ่มความเร็วคิวรีในการดูหรือไม่?

4
มุมมองเป็นอันตรายต่อประสิทธิภาพใน PostgreSQL หรือไม่
ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากหนังสือเกี่ยวกับการออกแบบ db (การออกแบบฐานข้อมูลเริ่มต้น ISBN: 0-7645-7490-6): อันตรายจากการใช้มุมมองคือการกรองคิวรีกับมุมมองโดยคาดว่าจะอ่านส่วนเล็ก ๆ ของตารางที่มีขนาดใหญ่มาก การกรองใด ๆ ที่ควรทำในมุมมองเพราะการกรองใด ๆ กับตัวเองถูกนำไปใช้หลังจากแบบสอบถามในมุมมองได้ดำเนินการเสร็จสมบูรณ์ โดยทั่วไปมุมมองมีประโยชน์สำหรับการเร่งกระบวนการพัฒนา แต่ในระยะยาวสามารถฆ่าประสิทธิภาพของฐานข้อมูลได้อย่างสมบูรณ์ ต่อไปนี้เป็นข้อความที่ตัดตอนมาจากเอกสารประกอบ PostgreSQL 9.5: การใช้มุมมองแบบเสรีเป็นสิ่งสำคัญในการออกแบบฐานข้อมูล SQL ที่ดี มุมมองช่วยให้คุณสามารถแค็ปซูลรายละเอียดของโครงสร้างของตารางของคุณซึ่งอาจเปลี่ยนแปลงได้เมื่อแอปพลิเคชันของคุณพัฒนาขึ้นหลังอินเทอร์เฟซที่สอดคล้องกัน แหล่งที่มาทั้งสองดูเหมือนจะขัดแย้งกัน ("ไม่ออกแบบด้วยมุมมอง" กับ "ทำออกแบบด้วยมุมมอง") อย่างไรก็ตามในมุมมอง PG จะดำเนินการโดยใช้ระบบกฎ ดังนั้นอาจเป็นไปได้ (และนี่คือคำถามของฉัน) การกรองใด ๆ กับมุมมองจะถูกเขียนใหม่เป็นตัวกรองภายในมุมมองทำให้เกิดการเรียกใช้แบบสอบถามแบบครั้งเดียวเทียบกับตารางต้นแบบ การตีความของฉันถูกต้องหรือไม่และ PG ได้รวมเอาส่วนคำสั่งเข้าและออกจากที่ไหน? หรือมันแยกกันทีละอัน? ตัวอย่างสั้น ๆ ที่มีอยู่ในตัวถูกต้อง (คอมไพล์ได้)?

3
การสแกนที่ไม่คาดหมายระหว่างการลบโดยใช้ WHERE IN
ฉันมีคำถามดังนี้ DELETE FROM tblFEStatsBrowsers WHERE BrowserID NOT IN ( SELECT DISTINCT BrowserID FROM tblFEStatsPaperHits WITH (NOLOCK) WHERE BrowserID IS NOT NULL ) tblFEStatsBrowsers มี 553 แถว tblFEStatsPaperHits มีแถว 47.974.301 tblFEStatsBrowsers: CREATE TABLE [dbo].[tblFEStatsBrowsers]( [BrowserID] [smallint] IDENTITY(1,1) NOT NULL, [Browser] [varchar](50) NOT NULL, [Name] [varchar](40) NOT NULL, [Version] [varchar](10) NOT NULL, …

2
TOP (และทำไม) ส่งผลกระทบต่อแผนการดำเนินการอย่างไร
สำหรับข้อความค้นหาที่ซับซ้อนปานกลางที่ฉันพยายามปรับให้เหมาะสมฉันสังเกตว่าการลบTOP nคำสั่งเปลี่ยนแผนการดำเนินการ ฉันจะเดาว่าเมื่อเคียวรีมีเอ็นจินTOP nฐานข้อมูลจะรันเคียวรีโดยไม่สนใจTOPคำสั่งและจากนั้นในตอนท้ายก็ลดขนาดของผลลัพธ์ที่กำหนดไว้เป็นจำนวนแถวnที่ถูกร้องขอ แผนการดำเนินการกราฟิกดูเหมือนว่าจะระบุว่าเป็นกรณีนี้ - TOPเป็นขั้นตอน "สุดท้าย" แต่ดูเหมือนว่าจะเกิดขึ้นมากขึ้น คำถามของฉันคือประโยค TOP และ N มีผลอย่างไรต่อแผนการดำเนินการของแบบสอบถาม นี่เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งที่เกิดขึ้นในกรณีของฉัน: แบบสอบถามกำลังจับคู่แถวจากสองตาราง A และ B โดยไม่ต้องTOPเป็นไปตามข้อเพิ่มประสิทธิภาพประเมินจะมี 19k แถวจากตารางและ 46K แถวจากตาราง B. จำนวนที่เกิดขึ้นจริงของแถวกลับเป็น 16k สำหรับ A และ 13k สำหรับการแข่งขันบีกัญชาจะใช้ในการเข้าร่วมทั้งสองชุดผลลัพธ์ รวม 69 แถว (จากนั้นจะใช้การเรียงลำดับ) แบบสอบถามนี้เกิดขึ้นอย่างรวดเร็วมาก เมื่อฉันเพิ่มTOP 1001เครื่องมือเพิ่มประสิทธิภาพไม่ได้ใช้แฮชจับคู่; แต่ก่อนจะเรียงลำดับผลลัพธ์จากตาราง A (ประมาณเดียวกัน / เป็นจริงของ 19k / 16k) และทำการวนซ้ำซ้อนกับตาราง B จำนวนแถวของตาราง …

1
การใช้คำสั่ง build ใน JOIN สามารถแนะนำอุปสรรคการเพิ่มประสิทธิภาพได้ในบางกรณี?
ฉันได้รับความสนใจว่าการUSINGสร้าง (แทนON) ในส่วนFROMคำSELECTสั่งอาจทำให้เกิดปัญหาและอุปสรรคในการเพิ่มประสิทธิภาพในบางกรณี ฉันหมายถึงคำสำคัญนี้: เลือก * จาก เข้าร่วมขโดยใช้ (a_id) ในกรณีที่ซับซ้อนมากขึ้น บริบท: ความคิดเห็นสำหรับคำถามนี้ ฉันใช้สิ่งนี้มากและไม่เคยสังเกตเห็นอะไรเลย ฉันสนใจกรณีทดสอบที่แสดงให้เห็นถึงผลกระทบหรือลิงก์ใด ๆไปยังข้อมูลเพิ่มเติม ความพยายามในการค้นหาของฉันว่างเปล่า คำตอบที่สมบูรณ์แบบจะเป็นกรณีทดสอบเพื่อแสดงUSING (a_id)ด้วยประสิทธิภาพที่ต่ำกว่าเมื่อเปรียบเทียบกับข้อเข้าร่วมทางเลือกON a.a_id = b.a_id- ถ้านั่นสามารถเกิดขึ้นได้จริง

5
ผู้ประกอบการเชิงตรรกะหรือและในสภาพและคำสั่งของเงื่อนไขในที่
ตรวจสอบข้อความทั้งสองนี้: IF (CONDITION 1) OR (CONDITION 2) ... IF (CONDITION 3) AND (CONDITION 4) ... ถ้าCONDITION 1เป็นTRUEจะCONDITION 2ถูกตรวจสอบ? ถ้าCONDITION 3เป็นFALSEจะCONDITION 4ถูกตรวจสอบ? สิ่งที่เกี่ยวกับเงื่อนไขWHERE: เครื่องยนต์ SQL Server ปรับเงื่อนไขทั้งหมดในWHEREข้อ? โปรแกรมเมอร์ควรวางเงื่อนไขในลำดับที่ถูกต้องเพื่อให้แน่ใจว่าเครื่องมือเพิ่มประสิทธิภาพ SQL Server แก้ไขได้อย่างถูกต้องหรือไม่? เพิ่ม: ขอบคุณแจ็คสำหรับลิงก์แปลกใจจากรหัส t-sql: IF 1/0 = 1 OR 1 = 1 SELECT 'True' AS result ELSE SELECT 'False' AS result …

2
ปรับแต่งแบบสอบถาม Postgres ด้วย IN ขนาดใหญ่
ข้อความค้นหานี้รับรายการโพสต์ที่สร้างโดยคนที่คุณติดตาม คุณสามารถติดตามคนได้ไม่ จำกัด จำนวน แต่คนส่วนใหญ่ติดตามน้อยกว่า 1,000 คน ด้วยการสืบค้นแบบนี้การเพิ่มประสิทธิภาพที่เห็นได้ชัดคือการแคช"Post"รหัส แต่น่าเสียดายที่ฉันไม่มีเวลาสำหรับตอนนี้ EXPLAIN ANALYZE SELECT "Post"."id", "Post"."actionId", "Post"."commentCount", ... FROM "Posts" AS "Post" INNER JOIN "Users" AS "user" ON "Post"."userId" = "user"."id" LEFT OUTER JOIN "ActivityLogs" AS "activityLog" ON "Post"."activityLogId" = "activityLog"."id" LEFT OUTER JOIN "WeightLogs" AS "weightLog" ON "Post"."weightLogId" = "weightLog"."id" LEFT …

4
ทำไมค่าใช้จ่ายโดยประมาณของ (เหมือนกัน) 1,000 ค้นหาในดัชนีที่ไม่ซ้ำกันแตกต่างกันในแผนเหล่านี้
ในแบบสอบถามด้านล่างแผนการดำเนินการทั้งคู่คาดว่าจะทำการค้นหา 1,000 ครั้งในดัชนีที่ไม่ซ้ำกัน การค้นหาถูกขับเคลื่อนโดยการสแกนที่สั่งในตารางแหล่งเดียวกันดังนั้นดูเหมือนว่าควรจะจบลงด้วยการค้นหาค่าเดียวกันในลำดับเดียวกัน ทั้งลูปซ้อนกันมี <NestedLoops Optimized="false" WithOrderedPrefetch="true"> ใครรู้ว่าทำไมงานนี้มีราคาอยู่ที่ 0.172434 ในแผนแรก แต่ 3.01702 ต่อวินาที (เหตุผลของคำถามคือคำถามแรกที่เสนอให้ฉันเป็นการเพิ่มประสิทธิภาพเนื่องจากราคาแผนต่ำกว่ามากจริง ๆ แล้วดูเหมือนว่าฉันจะทำงานได้มากกว่า แต่ฉันพยายามอธิบายความแตกต่าง .. .) ติดตั้ง CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); INSERT INTO dbo.Target SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER …

6
ทำไมแบบสอบถาม SELECT DISTINCT TOP N ของฉันจึงสแกนทั้งตาราง
ฉันใช้SELECT DISTINCT TOP Nแบบสอบถามน้อยซึ่งดูเหมือนว่าจะเพิ่มประสิทธิภาพไม่ดีโดยเพิ่มประสิทธิภาพแบบสอบถาม SQL Server เริ่มจากการพิจารณาตัวอย่างเล็ก ๆ น้อย ๆ : ตารางหนึ่งล้านแถวที่มีสองค่าสลับกัน ฉันจะใช้ฟังก์ชันGetNumsเพื่อสร้างข้อมูล: DROP TABLE IF EXISTS X_2_DISTINCT_VALUES; CREATE TABLE X_2_DISTINCT_VALUES (PK INT IDENTITY (1, 1), VAL INT NOT NULL); INSERT INTO X_2_DISTINCT_VALUES WITH (TABLOCK) (VAL) SELECT N % 2 FROM dbo.GetNums(1000000); UPDATE STATISTICS X_2_DISTINCT_VALUES WITH FULLSCAN; สำหรับแบบสอบถามต่อไปนี้: SELECT DISTINCT …

3
SQL Server แบ่ง A <> B เป็น A <B หรือ A> B โดยให้ผลลัพธ์ที่แปลกประหลาดหาก B ไม่ได้กำหนดไว้ล่วงหน้า
เราพบปัญหาที่น่าสนใจกับ SQL Server พิจารณาตัวอย่างการทำซ้ำต่อไปนี้: CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY); INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618'); SELECT s_guid FROM #test WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618' AND s_guid &lt;&gt; NEWID(); DROP TABLE #test; ซอ โปรดลืมสักครู่ว่าs_guid &lt;&gt; NEWID()สภาพดูเหมือนจะไร้ประโยชน์โดยสิ้นเชิง - นี่เป็นเพียงตัวอย่างที่ไม่สำคัญ เนื่องจากความน่าจะเป็นของการNEWID()จับคู่ค่าคงที่ที่กำหนดมีค่าน้อยมากจึงควรประเมินเป็น TRUE ทุกครั้ง แต่มันก็ไม่ได้ การเรียกใช้คิวรีนี้มักจะส่งคืน 1 แถว แต่บางครั้ง (ค่อนข้างบ่อยมากกว่า 1 ครั้งจาก 10) …

2
Cardinality Estimate สำหรับผู้ประกอบการ LIKE (ตัวแปรท้องถิ่น)
ฉันรู้สึกว่าเมื่อใช้ตัวLIKEดำเนินการในการปรับให้เหมาะสมสำหรับสถานการณ์ที่ไม่รู้จักทั้งมรดกและ CE ใหม่ใช้ประมาณการ 9% (สมมติว่ามีสถิติที่เกี่ยวข้องพร้อมใช้งานและเครื่องมือเพิ่มประสิทธิภาพการสืบค้นไม่จำเป็นต้องคาดเดาการเลือก) เมื่อดำเนินการค้นหาด้านล่างกับฐานข้อมูลเครดิตฉันได้รับการประมาณการที่แตกต่างกันภายใต้ CE ที่แตกต่างกัน ภายใต้ CE ใหม่ฉันได้รับการประมาณ 900 แถวซึ่งฉันคาดหวังภายใต้ CE ดั้งเดิมฉันได้รับการประมาณ 241.416 และฉันไม่สามารถทราบได้ว่าการประเมินนี้มาจากอะไร มีใครสามารถที่จะหลั่งน้ำตาแสงใด ๆ ? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = …

1
เหตุใดแบบสอบถามนี้จึงไม่ใช้สปูลดัชนี
ฉันกำลังถามคำถามนี้เพื่อให้เข้าใจถึงพฤติกรรมของเครื่องมือเพิ่มประสิทธิภาพและเข้าใจขีด จำกัด รอบ ๆ ดัชนีสิ่งของ สมมติว่าฉันใส่จำนวนเต็มจาก 1 ถึง 10,000 ลงในกอง: CREATE TABLE X_10000 (ID INT NOT NULL); truncate table X_10000; INSERT INTO X_10000 WITH (TABLOCK) SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM master..spt_values t1 CROSS JOIN master..spt_values t2; และบังคับให้วงวนซ้อนกันเข้าร่วมกับMAXDOP 1: SELECT * FROM X_10000 a INNER JOIN …

1
ลักษณะการทำงานของรั้วการปรับให้เหมาะสมของ CTE (ด้วยแบบสอบถาม) ระบุไว้ในมาตรฐาน SQL: 2008 หรือไม่ ถ้าเป็นเช่นนั้นอยู่ที่ไหน
ฉันเห็นการอ้างอิงบ่อย ๆ กับWITHแบบสอบถาม (นิพจน์ตารางทั่วไปหรือ CTE) ซึ่งทำหน้าที่เป็นรั้วการเพิ่มประสิทธิภาพซึ่งเซิร์ฟเวอร์ไม่ได้รับอนุญาตให้ส่งตัวกรองลงในการสืบค้น CTE ดึงการแสดงออกทั่วไปออกมาจาก CTE เป็นต้นมันมักอ้างว่า เพื่อให้เป็นพฤติกรรมที่กำหนดโดยมาตรฐาน SQL CTEs มีแน่นอนรั้วการเพิ่มประสิทธิภาพใน PostgreSQL ... แต่นี้ต้องตามมาตรฐานหรือรายละเอียดการดำเนินงานจริงเพียง? ตัวอย่างเช่นการโพสต์รายชื่อผู้รับจดหมายเหล่านี้อ้างสิทธิ์หรือแนะนำว่าเป็นมาตรฐาน: http://www.digipedia.pl/usenet/thread/11566/101385/ หลังจากพูดถึงมันในความคิดเห็นฉันถูกถามว่ามีการระบุไว้ที่ไหนและหลังจากดูที่ร่างฉบับเดียวของ SQL: 2008 ฉันสามารถเข้าถึงฉันไม่ได้โชคดีมากที่ได้พบมัน ฉันยังไม่ได้ศึกษามาตรฐานอย่างเข้มข้นดังนั้นฉันหวังว่าจะได้รับคำแนะนำจากใครบางคนที่: การฟันดาบการเพิ่มประสิทธิภาพของ CTEs ใน PostgreSQL นั้นเป็นสิ่งจำเป็นตามมาตรฐานหรือไม่ และถ้าเป็นเช่นนั้นมันอยู่ที่ไหนระบุ? หรือข้อความที่อยู่ในรายชื่อผู้รับจดหมายของ Pg มีข้อผิดพลาดหรือไม่? ดูเพิ่มเติมที่รั้วการปรับให้เหมาะสมเธรดCTE ในรายการสิ่งที่ต้องทำ? .

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