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

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

2
กรอกข้อมูลวันที่ที่หายไปด้วยค่าข้อมูลจากวันที่ที่เติมก่อนหน้าสำหรับกลุ่ม
รูปภาพตั๋วโต๊ะช่วยเหลือที่รับถ่ายโอนระหว่างแผนกต่างๆ เราต้องการทราบว่าแผนกคืออะไรในตอนท้ายของวันสำหรับตั๋วแต่ละใบสำหรับแต่ละวันที่เปิดตั๋ว ตารางประกอบด้วยแผนกสุดท้ายสำหรับแต่ละตั๋วสำหรับแต่ละวันที่เปิดซึ่งมีการเปลี่ยนแปลงในแผนก (รวมถึงแถวสำหรับวันที่เปิดตั๋วในตอนแรกและวันที่ปิด) ตารางข้อมูลมีลักษณะดังนี้: CREATE TABLE TicketAssigment ( TicketId INT NOT NULL, AssignedDate DATE NOT NULL, DepartmentId INT NOT NULL); สิ่งที่ฉันต้องการคือการกรอกวันที่ที่ขาดหายไปสำหรับ TicketId แต่ละอันโดยใช้ DepartmentId จากแถว TicketAssigment หน้าที่แล้วเรียงลำดับตามวันที่ หากฉันมี TicketAssigment แถวเช่นนี้: 1, '1/1/2016', 123 -- Opened 1, '1,4,2016', 456 -- Transferred and closed 2, '1/1/2016', 25 -- Opened 2, '1/2/2016', …

5
SentryOne Plan Explorer ทำงานหรือไม่
ไม่SentryOne แผน Explorer ในการทำงานตามที่โฆษณาและมันเป็นเรื่องที่ถูกต้อง? มี gotchas หรืออะไรที่ต้องกังวล? ดูเหมือนว่ามันจะแสดงเส้นทางร้อนในสีซึ่งเทียบกับฝันร้ายของ SSMS สำหรับแผนการดำเนินการโดยประมาณ ความกังวลของฉันคือ - มันแก้ไขข้อมูลใด ๆ ที่เป็นอันตรายหรือไม่? แก้ไข : ฉันเพิ่งได้ยินมันและไม่เคยได้ยิน บริษัท มาก่อน

1
ข้อความค้นหาช้าไม่ได้บันทึก
ฉันพยายามเปิดใช้งานการบันทึกแบบสอบถามช้าบนเซิร์ฟเวอร์ของเราเพื่อระบุแบบสอบถามใด ๆ ที่สามารถใช้การเพิ่มประสิทธิภาพ ฟังดูง่ายพอ แต่ไฟล์ของฉันไม่ได้ถูกเขียนลงไป ฉันไม่ได้รับข้อผิดพลาดหรืออะไรทำนองนั้นมันก็ดูเหมือนจะไม่ได้เข้าสู่การสืบค้นช้า ฉันจำได้ว่าต้องรีสตาร์ท mysql หลังจากเปลี่ยนแปลงการกำหนดค่าของฉัน ฉันใช้ MySQL Ver 5.1.61 นี่คือสิ่งที่ฉันมีใน my.cnf: slow-query-log=1 slow-query-log-file=/var/logs/my.slow.log long_query_time=1 ไฟล์ /var/logs/my.slow.log มี mysql ในฐานะเจ้าของ, นอกจากนี้เพื่อประโยชน์ในการดีบั๊กฉันให้อ่าน / เขียนทั้งหมดบนล็อกไฟล์ ฉันมี long_query_time ตั้งค่าเป็น 1 ในด้านบนเพราะฉันแค่ต้องการดูว่ามันทำงาน ฉันลองตั้งค่าให้ต่ำลง (เช่น 0.3) แต่ฉันยังไม่ได้บันทึกอะไรเลย ฉันรู้ว่าข้อความค้นหาที่แอปของฉันทำงานนั้นใช้เวลานานกว่า 1 วินาทีและฉันได้เรียกใช้ข้อความค้นหาโดยเจตนา ( SELECT sleep(10);) ในเทอร์มินัลเพื่อทำการทดสอบและบันทึกยังว่างเปล่า ฉันได้ดูเอกสารจากสิ่งที่ฉันเห็นว่ามันควรจะทำงานได้ ใครมีข้อเสนอแนะเกี่ยวกับสิ่งที่ฉันทำผิด? คำแนะนำใด ๆ ที่จะได้รับการชื่นชมขอบคุณมาก! แก้ไข: ตามที่ถามในความคิดเห็นที่ฉันวิ่งแบบสอบถาม: `SELECT …

1
เหตุใดข้อความค้นหาที่คล้ายกันเหล่านี้จึงใช้ขั้นตอนการเพิ่มประสิทธิภาพที่แตกต่างกัน (การประมวลผลธุรกรรมกับแผนด่วน)
รหัสตัวอย่างในรายการเชื่อมต่อนี้ แสดงข้อบกพร่องที่ SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item ส่งคืนผลลัพธ์ที่ถูกต้อง แต่ผลลัพธ์ต่อไปนี้จะส่งกลับผลลัพธ์ที่ไม่ถูกต้อง (เมื่อปี 2014 โดยใช้เครื่องมือประมาณการ Cardinality ใหม่) SELECT (SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item) เนื่องจากมันโหลดผลลัพธ์อย่างไม่ถูกต้องสำหรับ L2 ลงในสปูลนิพจน์ย่อยทั่วไปจากนั้นรีเพลย์ผลลัพธ์ของผลลัพธ์นั้นสำหรับผลลัพธ์ L1 ฉันอยากรู้ว่าทำไมความแตกต่างของพฤติกรรมระหว่างสองข้อความค้นหา Trace ธง 8675 แสดงให้เห็นว่าคนที่ทำงานเข้ามาและเป็นคนที่ไม่เข้าsearch(0) - transaction processingsearch(1) - quick …

2
แบบสอบถามที่ใดที่จะตรวจสอบการเปรียบเทียบที่ง่ายกว่า (เช่นบิต) ก่อนที่จะทำการเปรียบเทียบที่ยากขึ้น (เช่น varchar)
ถ้าฉันเขียนแบบสอบถามที่มีWHEREคำสั่งผสมเช่น: SELECT * FROM MyTable WHERE BitField = 1 AND VarcharField = 'asdf' และการรวมbitการเปรียบเทียบนั้นเพียงแค่แยกฟิลด์เดียวกันที่การvarcharเปรียบเทียบจะแยกออกการมีอยู่ของbitการเปรียบเทียบฟิลด์นั้นจะทำให้ฉันปรับปรุงประสิทธิภาพได้หรือไม่

2
เหตุใดแบบสอบถามนี้จึงไม่ใช้ดัชนีที่ไม่ได้เป็นคลัสเตอร์ของฉันและฉันจะสร้างมันได้อย่างไร
ตามมาถึงคำถามนี้เกี่ยวกับการเพิ่มประสิทธิภาพการค้นหาฉันต้องการทราบว่ามีวิธีในการทำให้ดัชนีของฉันถูกใช้เป็นค่าเริ่มต้นหรือไม่ แบบสอบถามนี้ทำงานในประมาณ 2.5 วินาที: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; อันนี้ทำงานในประมาณ 33ms: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' ORDER BY [DateEntered], [DeviceID]; มีดัชนีคลัสเตอร์ในฟิลด์ [ID] (pk) และมีดัชนีที่ไม่ใช่คลัสเตอร์ใน [DateEntered], [DeviceID] แบบสอบถามแรกใช้ดัชนีคลัสเตอร์แบบสอบถามที่สองใช้ดัชนีที่ไม่ใช่คลัสเตอร์ของฉัน คำถามของฉันคือสองส่วน: ทำไมเนื่องจากแบบสอบถามทั้งสองมีส่วนคำสั่ง WHERE ในฟิลด์ [DateEntered] เซิร์ฟเวอร์จึงใช้ดัชนีคลัสเตอร์ในครั้งแรก แต่ไม่ใช่อันดับที่สองหรือไม่ ฉันจะทำให้ดัชนีที่ไม่ใช่แบบคลัสเตอร์นั้นถูกใช้เป็นค่าเริ่มต้นในแบบสอบถามนี้ได้โดยไม่ต้องสั่งซื้อ (หรือเพราะเหตุใดฉันจึงไม่ต้องการพฤติกรรมนั้น)

2
พารามิเตอร์โพรซีเดอร์ที่เก็บมีจำนวนมากเกินไป?
ฉันเพิ่งเริ่มเขียนกระบวนงานที่เก็บไว้ใน SQL Server 2008 และมีพารามิเตอร์มากกว่า 30 รายการ ฉันไม่เคยเขียนหนึ่งที่มีมากกว่า 10 พารามิเตอร์และนั่นทำให้ฉันคิดว่า ... ณ จุดใดมีพารามิเตอร์มากเกินไป? สำหรับบริบท ... ขั้นตอนนี้จะต้องแทรกแถวเดียวลงในตารางเดียว ก็จะมีความคล้ายคลึงกันมาก แม้ว่าจะค่อนข้างเล็ก เวอร์ชันที่ดำเนินการUPDATEบนตารางเดียวกัน คอลัมน์ส่วนใหญ่มีขนาดค่อนข้างเล็กโดยมีการผสมผสานของ int และ strings ( varchar(200)) ปัญหาคืออะไร; ดีหรือไม่ดี การมีโพรซีเดอร์ที่มีพารามิเตอร์จำนวนมากและเกณฑ์ที่ฉันควรเริ่มพิจารณารูปแบบอื่นคืออะไร

2
การใช้ตรรกะไม่เกี่ยวกับดัชนี
ตามหนังสือของ Microsoft เกี่ยวกับการพัฒนาฐานข้อมูลข้อสอบ 70-433:การพัฒนาฐานข้อมูลMicrosoft SQL Server 2008 : อักขระตัวแทนที่ไม่ใช่ตัวอักษรไม่ใช่ตรรกะอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพคิวรีใช้ดัชนีเพื่อเพิ่มประสิทธิภาพการค้นหา เพื่อประสิทธิภาพสูงสุดคุณควรหลีกเลี่ยงการใช้ไม่คำหลักและนำสัญลักษณ์สัญลักษณ์แทน ดังนั้นฉันจึงเป็นแบบNOT INนั้นNOT EXISTSเป็นต้น ขณะนี้เกี่ยวกับคำถามSOนี้ฉันคิดว่าโซลูชันที่เลือกโดย @GBN จะละเมิดคำแถลงที่ระบุไว้ด้านบน เห็นได้ชัดว่ามันไม่ได้ ดังนั้นคำถามของฉันคือ: ทำไม


2
สแกนดัชนีช้าในตารางขนาดใหญ่
ใช้ PostgreSQL 9.2 ฉันมีปัญหากับการสืบค้นที่ช้าในตารางที่ค่อนข้างใหญ่ (200+ ล้านแถว) ฉันไม่ได้พยายามอะไรที่บ้าคลั่งเพียงแค่เพิ่มคุณค่าทางประวัติศาสตร์ ด้านล่างคือแบบสอบถามและผลลัพธ์แผนแบบสอบถาม เค้าโครงตารางของฉัน: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY …

2
MAXDOP = 1, คำแนะนำการสืบค้นและเกณฑ์ค่าใช้จ่ายสำหรับความเท่าเทียม
หากมีการMAXDOPตั้งค่าอินสแตนซ์ที่ 1 และคำแนะนำแบบสอบถามถูกใช้เพื่ออนุญาตให้แบบสอบถามเฉพาะขนานกันเป็นเกณฑ์ต้นทุนสำหรับค่า Parallelism ที่ SQL ยังคงใช้เพื่อตัดสินใจว่าจริงหรือไม่ขนานกันหรือไม่ ฉันไม่สามารถขุดข้อมูลเฉพาะนี้ได้แม้ว่าลิงก์นี้แสดงให้เห็นว่า CTFP จะถูกเพิกเฉยถ้าMAXDOPเป็น 1 สิ่งนี้สมเหตุสมผลโดยไม่มีคำแนะนำแบบสอบถามเนื่องจากไม่มีการร้องขอโดยไม่คำนึงถึงต้นทุนจะขนานกันเมื่อMAXDOPเป็น 1 ใครช่วยให้ฉันรู้ว่าพฤติกรรมที่คาดหวังของคำขอทั้งสองนี้จะเป็นอย่างไร ตัวอย่างที่ 1: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 30 ตัวอย่างที่ 2: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 70

2
จะปรับปรุงการประมาณแถวได้อย่างไรเพื่อลดโอกาสของการหกถึง tempdb
ฉันสังเกตเห็นว่าเมื่อมีการรั่วไหลของเหตุการณ์ tempdb (ทำให้เกิดการสืบค้นที่ช้า) ซึ่งบ่อยครั้งที่การประมาณแถวนั้นเป็นวิธีการปิดการเข้าร่วมแบบเฉพาะ ฉันเคยเห็นเหตุการณ์การรั่วไหลเกิดขึ้นจากการรวมและแฮชรวมและพวกเขามักจะเพิ่มรันไทม์ 3x เป็น 10x คำถามนี้เกี่ยวข้องกับวิธีปรับปรุงการประมาณการแถวภายใต้สมมติฐานว่าจะลดโอกาสการเกิดเหตุการณ์หก จำนวนแถวจริง 40k สำหรับแบบสอบถามนี้แผนจะแสดงค่าประมาณแถวที่ไม่ดี (11.3 แถว): select Value from Oav.ValueArray where ObjectId = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and ObjectId = 3540233 and Sequence = 2) and PropertyId = 2840 option (recompile); สำหรับแบบสอบถามนี้แผนแสดงการประมาณแถวที่ดี (56k แถว): declare @a …

1
Postgres: count (*) vs count (id)
ผมเห็นในเอกสารความแตกต่างระหว่างและcount(*) count(pk)ผมเคยใช้count(pk)(ที่pkเป็นSERIAL PRIMARY KEY) count(*)ไม่ทราบว่าเกี่ยวกับการดำรงอยู่ของ คำถามของฉันเกี่ยวกับการเพิ่มประสิทธิภาพภายในของ Postgres มันฉลาดพอที่จะรับได้หรือไม่ว่าSERIAL PRIMARY KEYจะมีอยู่ในทุกแถวและไม่ผิดและนับจำนวนแถวหรือจะตรวจสอบคำกริยาซ้ำซ้อนสำหรับแต่ละแถวหรือไม่ ฉันยอมรับว่านี่อาจเป็นการเพิ่มประสิทธิภาพที่ไม่มีจุดหมายมากเกินไป แต่ฉันแค่อยากรู้ ผมเอามาดูที่การส่งออกของได้EXPLAINและEXPLAIN VERBOSEสำหรับcount(*), count(id)และcount(id > 50)เพื่อดูว่าEXPLAINกล่าวถึงการตรวจสอบภาคในการส่งออกของตน มันไม่ได้

1
เหตุใด CTE จึงเลวร้ายยิ่งกว่าข้อความค้นหาย่อยแบบอินไลน์
ฉันพยายามเข้าใจวิธีการทำงานของตัววางแผนคิวรีใน postgresql ฉันมีคำถามนี้: select id from users where id <> 2 and gender = (select gender from users where id = 2) order by latest_location::geometry <-> (select latest_location from users where id = 2) ASC limit 50 มันทำงานในเวลาน้อยกว่า 10ms ในฐานข้อมูลของฉันด้วยรายการประมาณ 500k ในตารางผู้ใช้ จากนั้นฉันคิดว่าเพื่อหลีกเลี่ยงการเลือกย่อยที่ซ้ำกันฉันสามารถเขียนแบบสอบถามเป็น CTE อีกครั้งเช่นนี้ with me as ( select …

2
ปัญหาการปรับให้เหมาะสม: คีย์ผสมคลัสเตอร์เงื่อนไขแฟล็กและการรวมดัชนี
สามตาราง: product: กับคอลัมน์: ( a, g, ...a_lot_more... ) a: PK, clustered g: bit-column main: กับคอลัมน์: ( c, f, a, b, ...a_lot_more... ) c: PK, clustered f: bit-column (a, b): UQ lookup กับคอลัมน์: ( a, b, c, i ) (a, b): PK, clustered a: FK to product(a) c: UQ, FK to …

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