การปรับแต่งข้อความค้นหาควรเป็นแบบเชิงรุกหรือแบบตอบโต้?


23

ในฐานะนักพัฒนาซอฟต์แวร์และ DBA ที่ต้องการฉันพยายามผสมผสานแนวปฏิบัติที่ดีที่สุดเมื่อฉันออกแบบฐานข้อมูล SQL Server ของฉัน (99% ของเวลาที่ซอฟต์แวร์ตั้งอยู่บน SQL Server) ฉันทำการออกแบบที่ดีที่สุดก่อนและระหว่างการพัฒนา

แต่ก็เหมือนกับนักพัฒนาซอฟต์แวร์อื่น ๆ ที่มีการเพิ่มฟังก์ชันการทำงานข้อบกพร่องและเพียงแค่การเปลี่ยนแปลงข้อกำหนดที่ต้องการเปลี่ยนแปลง / สร้างวัตถุฐานข้อมูล

คำถามของฉันคือควรปรับแต่งการค้นหาเชิงรุกหรือปฏิกิริยา? กล่าวอีกนัยหนึ่งไม่กี่สัปดาห์หลังจากมีการแก้ไขโค้ด / ฐานข้อมูลจำนวนมากฉันควรตั้งวันเพื่อตรวจสอบประสิทธิภาพการค้นหาและปรับแต่งตามนั้น ถึงแม้ว่ามันจะดูเหมือนว่าจะทำงานโอเค ?

หรือฉันควรทราบว่าประสิทธิภาพต่ำกว่าค่าเฉลี่ยควรเป็นการตรวจสอบฐานข้อมูลและกลับไปที่กระดานดำที่เป็นสุภาษิต

การปรับแต่งข้อความค้นหาอาจใช้เวลานานและขึ้นอยู่กับการออกแบบฐานข้อมูลเริ่มต้นซึ่งอาจมีประโยชน์น้อยที่สุด ฉันอยากรู้อยากเห็นเกี่ยวกับวิธีการทำงานที่ได้รับการยอมรับ


7
การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด - DonaldKnuth
Drasill

@rasill คุณช่วยขยายที่ได้ไหม? ความชั่วร้ายในเวลา dev ที่สูญเปล่า?
Thomas Stringer

จริงๆแล้วคำถามของคุณทำให้ฉันคิดถึงคำพูดที่โด่งดังนี้ ( ดู google ) แต่มันมีจุดมุ่งหมายในการพัฒนาซอฟต์แวร์มากกว่าฉันคิดว่ามันไม่เหมาะกับ DBA จริงๆ สุดท้ายฉันจะบอกตัวเองว่า " การเพิ่มประสิทธิภาพขนาดเล็กก่อนกำหนดเป็นความชั่วร้าย"
Drasill

ยังเห็นเก่าโพสต์สยองขวัญการเข้ารหัสในเรื่องนี้ :)
Drasill

คำตอบ:


17

ทั้งสอง แต่ส่วนใหญ่เป็นเชิงรุก

สิ่งสำคัญคือการทดสอบระหว่างการพัฒนากับปริมาณที่เหมือนจริงและคุณภาพของข้อมูล เป็นเรื่องปกติที่จะมีการเรียกใช้คิวรีบนนักพัฒนา 100 หรือ 1,000 แถวโดยทั่วไปแล้วไม่น่าเชื่อว่าจะมี 10 ล้านแถว

ช่วยให้คุณสร้างบันทึกเกี่ยวกับ "ดัชนีอาจช่วยได้ที่นี่" หรือ "มาหาฉันอีกครั้ง" หรือ "จะแก้ไขด้วยคุณลักษณะใหม่ xxx ในเวอร์ชันฐานข้อมูลถัดไป"

อย่างไรก็ตามการค้นหาไม่กี่ครั้งจะไม่สามารถทดสอบเวลาได้ การกระจายข้อมูลเปลี่ยนไปหรือเป็นแบบเอ็กซ์โพเนนเชียลเนื่องจากเครื่องมือเพิ่มประสิทธิภาพตัดสินใจใช้การรวมประเภทอื่น ในกรณีนี้คุณสามารถตอบสนองได้เท่านั้น

กล่าวว่าสำหรับ SQL Server อย่างน้อยแบบสอบถาม DMV "ที่ขาดหาย" และ "แบบสอบถามที่ยาวที่สุด" ต่างๆสามารถระบุพื้นที่ที่มีปัญหาก่อนที่จะโทรศัพท์

แก้ไข: เพื่อให้ชัดเจน ...

เชิงรุกไม่ได้หมายความว่าปรับทุกคำค้นหาทันที มันหมายถึงการปรับสิ่งที่คุณต้องการ (เรียกใช้บ่อย) เป็นเวลาตอบสนองที่เหมาะสม ส่วนใหญ่จะไม่สนใจข้อความค้นหารายงานวันอาทิตย์ 03:00


16

ตกลงฉันจะกัดและใช้มุมมองที่แตก ก่อนอื่นฉันจะบอกว่าคุณไม่ควรเริ่มต้นด้วยการทำสิ่งที่คุณรู้ว่าจะนำคุณไปสู่ปัญหา หากคุณต้องการโทรหาวิธีปฏิบัติที่ดีที่สุดนี้ให้ดำเนินการต่อไป นี่คือเท่าที่เป็นเชิงรุกควรไป

หลังจากนั้นเสียเวลา (และเงิน) ไปกับมันและส่งมอบผลิตภัณฑ์ของคุณ แทนที่จะใช้คำสั่งการปรับแต่งเวลาแบบต่างๆที่อาจหรือไม่อาจกลายเป็นคอขวดได้ให้ใช้เวลานั้นสำหรับการทดสอบเพิ่มเติมรวมถึงการทดสอบโหลด

เมื่อคุณพบว่าบางสิ่งบางอย่างไม่ทำงานตามข้อกำหนดการออกแบบของคุณหรือถ้าบางสิ่งบางอย่างลดลงไปที่ 10% หรือ 20% ของเวลาตอบกลับของผู้สร้างโปรไฟล์ของคุณคุณควรลงทุนเวลาที่คุณต้องการปรับแต่งสิ่งที่เป็น เสีย

ในโลกที่สมบูรณ์แบบทุกอย่างจะได้รับการออกแบบอย่างสมบูรณ์แบบตั้งแต่เริ่มต้นและพัฒนาโดยใช้ลำดับการสร้างแบบลอจิคัล ในโลกแห่งความเป็นจริงมีข้อ จำกัด ด้านงบประมาณและเวลาและข้อมูลการทดสอบของคุณอาจไม่ได้ดูเหมือนข้อมูลการผลิตของคุณ ด้วยเหตุผลนี้ฉันพูดว่าใช้สามัญสำนึกเพื่อหลีกเลี่ยงปัญหาเชิงรุก แต่มุ่งเน้นทรัพยากรที่ จำกัด ของคุณในการปรับสิ่งที่กลายเป็นปัญหาจริงแทนที่จะใช้เวลาและเงินที่คุณอาจไม่ได้มองหาปัญหาในจินตนาการหรือที่อาจเกิดขึ้น


3
ฉันไม่คิดว่ามันจะแตก ไม่มีใครแนะนำให้คุณควรปรับทุกอย่างล่วงหน้าอย่างเหมาะสม แต่คุณควรทดสอบทุกอย่างและเพิ่มประสิทธิภาพของสิ่งที่เห็นได้ชัดว่าพวกเขาอาจ / จะทำให้เกิดปัญหาในการผลิต ซึ่งค่อนข้างแตกต่างจากการปรับรหัสให้เหมาะสมโดยไม่มีข้อมูลและจากการค้นพบสิ่งที่เสีย / ช้าหลังจากส่งรหัสแล้ว แน่นอนว่ามีเส้น - ดังที่คุณพูดถึงคุณต้องส่งบางสิ่งบางอย่างในที่สุด แต่ฉันคิดว่ามีความสมดุลที่ดีในที่นั้นซึ่งคุณสามารถหลีกเลี่ยงการส่งมอบสิ่งที่ดูดประสิทธิภาพ
Aaron Bertrand

4
แอรอนเห็นด้วย - อย่าส่งสิ่งใดก็ตามที่ดูดประสิทธิภาพและไม่คิดค่าใช้จ่ายและสร้างบางสิ่งโดยไม่ต้องคิดหนักเกี่ยวกับประสิทธิภาพและความยืดหยุ่น "วัดสองครั้งตัดครั้งเดียว" เป็นของสติกเกอร์กันชนของโปรแกรมเมอร์มากเท่ากับที่ช่างไม้ทำ ในเวลาเดียวกันฉันรู้สึกว่าอายุทั่วไปของคำตอบอื่น ๆ คือ "เชิงรุก> ปฏิกิริยา" และฉันรู้สึกว่ามีความคิดเห็นที่ไม่ถูกต้องว่า "ความจริง == ปฏิกิริยา" และที่สำคัญคือไม่ต้องเสียเวลามาก เป็นเชิงรุกที่คุณไม่มีเวลาหรือเงินที่เหลือสำหรับการจัดการกับความเป็นจริงที่รุนแรงและมักจะคาดเดาไม่ได้
Joel Brown

15

คุณกำลังจะทำการจูน 3 แบบคือ 1 ปฏิกิริยาและ 2 เชิงรุก

ปฏิกิริยา

จากแบบสอบถามสีน้ำเงินบางคำถามก็เริ่มก่อให้เกิดปัญหา อาจเป็นเพราะข้อผิดพลาดของแอปพลิเคชันหรือฟีเจอร์ตารางที่เกินความคาดหวังปริมาณการใช้งานที่เพิ่มขึ้นหรือเครื่องมือเพิ่มประสิทธิภาพการสืบค้นที่ได้รับ "ความคิดสร้างสรรค์" นี่อาจเป็นเรื่องกลางคันของเรื่องลงไซต์หรืออาจตอบสนองต่อความช้าของระบบในลักษณะที่ไม่สำคัญ ไม่ว่าจะด้วยวิธีใดอักขระกำหนดของการปรับค่าแบบตอบโต้คือคุณมีปัญหาอยู่แล้ว ไม่จำเป็นต้องพูดว่าคุณต้องการทำสิ่งนี้ให้น้อยที่สุดเท่าที่จะทำได้ ซึ่งนำเราไปที่ ...

เชิงรุก

ประเภทที่ 1: การบำรุงรักษาตามปกติ

ในกำหนดการบางประเภททุก ๆ สองสามเดือนหรือสัปดาห์ขึ้นอยู่กับว่า schema ของคุณเปลี่ยนแปลงบ่อยแค่ไหนและข้อมูลของคุณเติบโตเร็วแค่ไหนคุณควรตรวจสอบผลลัพธ์ของเครื่องมือวิเคราะห์ประสิทธิภาพของฐานข้อมูล (เช่นรายงาน AWR สำหรับ Oracle DBAs) คุณกำลังมองหาปัญหาเริ่มแรกนั่นคือสิ่งที่กำลังดำเนินการเพื่อปรับจูนปฏิกิริยาเช่นเดียวกับผลไม้แขวนต่ำรายการที่ไม่น่าจะทำให้เกิดปัญหาเร็ว ๆ นี้ แต่สามารถปรับปรุงได้ด้วยความพยายามเพียงเล็กน้อยในการป้องกันไกล - ปัญหาในอนาคต เวลาที่คุณควรใช้ในการนี้จะขึ้นอยู่กับว่าคุณมีเวลามากน้อยเพียงใดและคุณสามารถใช้เวลากับมันได้อีก แต่จำนวนที่เหมาะสมจะไม่เป็นศูนย์ อย่างไรก็ตามคุณสามารถลดจำนวนเงินที่คุณต้องการใช้จ่ายได้อย่างง่ายดายด้วยการทำ ...

ประเภทที่ 2: การออกแบบที่เหมาะสม

คำเตือนของ Knuth เกี่ยวกับ "การเพิ่มประสิทธิภาพก่อนวัยอันควร" เป็นที่รู้จักอย่างกว้างขวางและได้รับความเคารพอย่างถูกต้อง แต่ต้องใช้คำจำกัดความที่เหมาะสมของ "การคลอดก่อนกำหนด" นักพัฒนาแอปพลิเคชั่นบางคนเมื่อได้รับอนุญาตให้เขียนแบบสอบถามของตนเองมีแนวโน้มที่จะนำคำถามแรกที่พวกเขาพบว่าถูกต้องตามหลักเหตุผลมาใช้และไม่ต้องคำนึงถึงประสิทธิภาพการทำงานปัจจุบันหรืออนาคต หรือพวกเขาอาจทดสอบกับชุดข้อมูลการพัฒนาที่ไม่ได้เป็นตัวแทนของสภาพแวดล้อมการผลิต (เคล็ดลับ: อย่าทำเช่นนี้นักพัฒนาควรมีสิทธิ์เข้าถึงข้อมูลที่เป็นจริงสำหรับการทดสอบเสมอ) ประเด็นก็คือเวลาที่เหมาะสมในการปรับแต่งแบบสอบถามคือเมื่อมีการปรับใช้ครั้งแรกไม่ใช่เมื่อปรากฏขึ้นในรายการของ SQL ที่มีประสิทธิภาพต่ำและไม่แน่นอนเมื่อเกิดปัญหาร้ายแรง

ดังนั้นสิ่งที่จะมีคุณสมบัติเป็นการเพิ่มประสิทธิภาพก่อนกำหนดในที่ดิน DBA? ที่ด้านบนของรายการของฉันจะเสียสละฟื้นฟูโดยไม่จำเป็นต้องแสดงให้เห็น แน่ใจว่าคุณสามารถรักษายอดรวมในแถวพาเรนต์แทนที่จะคำนวณจากรันไทม์จากแถวย่อย แต่คุณต้องการจริงๆหรือ? หากคุณเป็นทวิตเตอร์หรืออเมซอนการลดความสำคัญเชิงกลยุทธ์และการคำนวณล่วงหน้าอาจเป็นเพื่อนที่ดีที่สุดของคุณ หากคุณกำลังออกแบบฐานข้อมูลการบัญชีเพียงเล็กน้อยสำหรับผู้ใช้ 5 คนโครงสร้างที่เหมาะสมเพื่ออำนวยความสะดวกด้านความสมบูรณ์ของข้อมูลจำเป็นต้องมีความสำคัญสูงสุด การปรับให้เหมาะสมก่อนวัยอื่น ๆ นั้นมีความสำคัญเช่นเดียวกัน อย่าใช้เวลาหลายชั่วโมงในการปรับแต่งแบบสอบถามที่เรียกใช้วันละครั้งและใช้เวลา 10 วินาทีแม้ว่าคุณคิดว่าคุณสามารถตัดเหลือ 0.1 วินาทีก็ตาม บางทีคุณอาจมีรายงานที่ใช้เวลา 6 ชั่วโมงต่อวัน แต่สำรวจกำหนดเวลาเป็นงานแบ็ตช์ก่อนลงทุนเวลาในการปรับแต่ง อย่าลงทุนในอินสแตนซ์การรายงานที่ทำซ้ำแบบแยกต่างหากแบบเรียลไทม์หากปริมาณการผลิตของคุณไม่เกิน 10% (สมมติว่าคุณสามารถจัดการความปลอดภัยได้)

ด้วยการทดสอบกับข้อมูลที่เป็นจริงการคาดเดาอย่างมีการศึกษาที่รูปแบบการเติบโตและปริมาณการใช้งาน (รวมถึงค่าเผื่อสำหรับ spikes) และการใช้ความรู้ของคุณเกี่ยวกับเครื่องมือเพิ่มประสิทธิภาพแพลตฟอร์มของคุณคุณสามารถปรับใช้แบบสอบถามที่ทำงาน และภายใต้เงื่อนไขที่ไม่เหมาะ เมื่อคุณใช้เทคนิคที่เหมาะสมคุณสามารถคาดการณ์ประสิทธิภาพของคิวรีได้อย่างแม่นยำและปรับให้เหมาะสม (ในแง่ขององค์ประกอบแต่ละส่วนที่เร็วที่สุดเท่าที่จำเป็น)

(และในขณะที่คุณอยู่ที่นี่เรียนรู้สถิติ! )


การออกแบบที่เหมาะสมคือ 95% ของประสิทธิภาพและความยืดหยุ่น
Mark Stewart

6

ในโลกที่สมบูรณ์แบบการปรับแต่งทั้งหมดจะทำในขั้นตอนการออกแบบเชิงรุกและไม่มีอะไรจะตอบสนองได้ แต่โลกไม่สมบูรณ์แบบ คุณจะพบว่าบางครั้งข้อมูลการทดสอบไม่ได้เป็นตัวแทนกรณีทดสอบจะพลาดการโหลดจะแตกต่างกันโดยไม่คาดคิดและจะมีข้อบกพร่องที่ทำให้เกิดปัญหาประสิทธิภาพ สถานการณ์เหล่านี้อาจต้องมีการปรับปฏิกิริยาบางอย่าง แต่ไม่ได้หมายความว่าต้องการการปรับปฏิกิริยา เป้าหมายควรเป็นสิ่งที่ต้องจับตา

การวางแผนของคุณสำหรับการปรับจูนย้อนหลังนั้นมีประโยชน์มาก เมื่อคุณทำการทดสอบคุณควรจัดทำเอกสารกำหนดเวลาและปริมาณงานที่คาดหวังและในบางครั้งควรสร้างการวิเคราะห์ที่ช่วยให้คุณทราบเมื่อกระบวนการผลิตไม่ตรงตามข้อกำหนดการออกแบบ ด้วยวิธีนี้คุณสามารถระบุล่วงหน้าว่าต้องปรับรหัสใด จากนั้นคุณสามารถกำหนดได้ว่าปัญหาคืออะไร แต่ทำไมคุณถึงไม่จับมันในขั้นตอนการออกแบบ / ทดสอบ


5

สำหรับฉันแล้วการทดสอบประสิทธิภาพเป็นส่วนหนึ่งของกระบวนการพัฒนาเสมอ ต้องการเปลี่ยนตารางนี้แก้ไขรายงานนี้เพิ่มคุณสมบัตินี้หรือไม่ ในส่วนของการทดสอบคุณต้องแน่ใจว่าคุณสามารถเปรียบเทียบประสิทธิภาพส่วนบุคคลและโดยรวมกับเส้นเขตแดนที่รู้จักและ / หรือเทียบกับข้อกำหนด (เช่นรายงานบางฉบับทำงานในพื้นหลังหรือเป็นแบบอัตโนมัติดังนั้นประสิทธิภาพ - หรือค่อนข้างเร็ว) สำหรับแบบสอบถามแต่ละรายการใน ระบบไม่ได้เป็นสิ่งสำคัญที่สุดเสมอไป)

IMHO นี่ไม่ควรเป็นกระบวนการโต้ตอบเลย - คุณไม่ควรรอจนกว่าการเปลี่ยนแปลงจะทำให้เกิดปัญหาด้านประสิทธิภาพในการผลิตเพื่อเริ่มทำปฏิกิริยากับมัน เมื่อคุณทำการเปลี่ยนแปลงใน dev / ทดสอบ ฯลฯ คุณควรทดสอบการเปลี่ยนแปลงเหล่านั้นด้วยข้อมูลที่คล้ายกันบนฮาร์ดแวร์ที่คล้ายกันด้วยแอพเดียวกันและรูปแบบการใช้งานที่คล้ายกัน อย่าปล่อยให้การเปลี่ยนแปลงเหล่านี้รีบไปผลิตและทำให้คุณประหลาดใจ สิ่งนี้จะเกิดขึ้นเกือบทุกครั้งเมื่อไม่สะดวกในการใช้การปรับแต่งวัน - งบประมาณสำหรับการปรับเวลานั้นล่วงหน้า

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