ฉันจะรู้ดัชนีที่จะสร้างสำหรับตารางได้อย่างไร


33

มีวิธีที่ฉันสามารถหาวิธีที่ดีที่สุดที่จะรู้ว่าดัชนีที่จะสร้างสำหรับตารางหรือไม่?


11
นั่นคือ ลองใช้use-the-index-luke.comเช่น
dezso

คำตอบที่ฉันเห็นมากที่สุดคือคุณควรจัดทำดัชนีคีย์หลักและคอลัมน์ที่คุณใช้เป็นWHEREคำสั่ง
Oskar Persson

โปรดอย่าทำอย่างนั้น คีย์หลักกำหนดวิธีการจัดเรียงข้อมูลทางกายภาพบนตารางและมีการพิจารณาของตัวเอง คุณต้องเลือกคีย์หลักอย่างระมัดระวังเช่นเดียวกับที่ใช้ในดัชนีอื่นทั้งหมดของคุณเช่นกัน อ้างถึง: sqlskills.com/blogs/kimberly/…
Ali Razeghi

4
@AliRazeghi นั่น (การจัดเรียงทางกายภาพ) เป็นจริงใน DBMS บางอย่าง (ภายใต้สถานการณ์บางอย่าง) และไม่ได้อยู่ในคนอื่น ๆ ตัวอย่างเช่นไม่เป็นความจริงใน PostgreSQL
dezso

โหวตกลับ!
Ali Razeghi

คำตอบ:


29

กฎย่อของหัวแม่มือ (บางส่วนของเหล่านี้จะถูกสร้างขึ้นโดยอัตโนมัติ แต่อาจจะสามารถลดลงได้ด้วยตนเองต่อมาขึ้นอยู่กับ DBMS ของคุณ. อย่าคิดว่าคุณจะเสมอทำงานใน PostgreSQL.)

  • สร้างดัชนีคีย์หลักทุกตัว
  • สร้างดัชนีคีย์ต่างประเทศทุกอัน
  • สร้างดัชนีทุกคอลัมน์ที่ใช้ในอนุประโยค JOIN
  • สร้างดัชนีทุกคอลัมน์ที่ใช้ในส่วนคำสั่ง WHERE
  • ศึกษาเอกสารของคุณเพื่อเรียนรู้ตัวเลือกการทำดัชนี "ความลับ" ที่ dbms ของคุณรองรับ

ทุกคีย์หลักหมายความว่าคีย์หลักหลายคอลัมน์ควรมีดัชนีเดี่ยวครอบคลุมคอลัมน์ทั้งหมด PostgreSQL จะสร้างดัชนีนี้โดยอัตโนมัติหากคุณประกาศคีย์หลักแบบหลายคอลัมน์

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

สมมติว่าการเปลี่ยนแปลงใด ๆ กับการจัดทำดัชนีจะปรับปรุงกิจกรรมฐานข้อมูลบางอย่างและลดขั้นตอนอื่น ๆ ฉันพบว่ามีประโยชน์ในการมีชุดคำสั่ง SQL ที่ฉันสามารถโพรไฟล์ก่อนและหลังการเปลี่ยนแปลงดัชนี ชุดนี้ประกอบด้วยคำสั่ง SELECT, INSERT, UPDATE และ DELETE

ไม่มีสิ่งใดทดแทนการศึกษาเอกสารสำหรับ dbms เฉพาะของคุณ

  • สร้างดัชนี
  • ดัชนี (หมายเหตุโดยเฉพาะส่วนที่เกี่ยวกับนิพจน์การจัดทำดัชนีในบางส่วนของดัชนีและการตรวจสอบการใช้ดัชนี)

14

นอกจากสิ่งที่@Catcall ได้จัดเตรียมไว้แล้วและเพื่อเพิ่มการแก้ไขเล็กน้อย:

ฉันยังครอบคลุมพื้นฐานบางอย่างในคำตอบที่เกี่ยวข้องอย่างใกล้ชิดเกี่ยวกับเรื่องนี้ดังนั้นเมื่อเร็ว ๆ นี้

คำตอบจนถึงตอนนี้ดูเหมือนจะบ่งบอกว่าคุณต้องสร้างดัชนีในคีย์หลัก แต่นั่นไม่ใช่กรณีใน PostgreSQL (มีข้อยกเว้นบางส่วน) ฉันพูดคู่มือที่นี่ :

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

ฉันเน้นตัวหนา

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

ดัชนีคอมโพสิตยังดีสำหรับการค้นหาในเขตข้อมูลแรกหรือไม่

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

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

โดยทั่วไปการดำเนินการเขียน ( DELETE, UPDATE) มีราคาแพงกว่า (แต่อาจได้รับประโยชน์ด้วย!) ในขณะที่การอ่าน ( SELECT) มักจะได้รับประโยชน์ ดัชนีมากเกินไปสามารถทำให้หน่วยความจำแคชหมดเพื่อให้แม้การดำเนินการอ่านอาจประสบ

สุดท้ายนี้หน้า Postgres Wiki เกี่ยวกับเครื่องมือบำรุงรักษาดัชนีจะค้นหาดัชนีที่ซ้ำกันหรือไม่ได้ใช้ (เหนือสิ่งอื่นใด)


ถ้าฉันจำได้ถูกต้องดัชนีอัตโนมัติเหนือ PK จะถูกสร้างขึ้นใน Oracle v.> = 10 และเซิร์ฟเวอร์ SQL> = 2008
EAmez

1

มีสองตัวเลือก

  1. ที่คุณทำมัน.
  2. เทคโนโลยีทำมัน

คำตอบสำหรับการทำมันด้วยตัวคุณเองนั้นเป็นเอกสารอย่างละเอียดที่นี่ ลองดูที่อย่างอื่นดู

Pghero

Pgheroอาจช่วยเหลือคุณได้หากคุณต้องการคำแนะนำอัตโนมัติ

ที่กล่าวว่ามีข้อบกพร่องบางอย่าง

  1. มันทำงานได้เฉพาะบนWHEREและไม่มีORDER BYJOINS
  2. มันใช้สถิติเปอร์เซ็นต์ NULL และค่าที่แตกต่างเท่านั้น

ตรวจสอบวิดีโอนี้สำหรับข้อมูลเพิ่มเติม

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