0Pricing
SQL Academy · บทเรียน

การสแกนเฉพาะดัชนีและแผนที่การมองเห็น

เปิดใช้การสแกนเฉพาะดัชนีด้วยการสร้างดัชนีให้ครอบคลุมคำสั่งค้นหาและปรับแผนที่การมองเห็นให้เป็นปัจจุบัน

การสแกนเฉพาะดัชนีและแผนที่การมองเห็น เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

การสแกนจากดัชนีเท่านั้นคืออะไร

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

เงื่อนไข

การสแกนจากดัชนีเท่านั้นต้องมีเงื่อนไขดังนี้:

  • คอลัมน์ทั้งหมดที่ SELECT ต้องอยู่ในดัชนี
  • เพจของแถวต้องถูกทำเครื่องหมายว่า "มองเห็นทั้งหมด" ในแผนผังการมองเห็น

แผนผังการมองเห็น

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

ทำให้คำสั่งสอบถามใช้การสแกนจากดัชนีเท่านั้น

ครอบคลุมคอลัมน์ที่จำเป็นทั้งหมด:

-- Query:
SELECT id, email FROM users WHERE id = 42;

-- Without an index on (id, email), only an Index Scan that visits the heap is possible.
-- With this:
CREATE INDEX users_id_email_idx ON users (id, email);
-- Or better:
CREATE INDEX users_id_email_idx ON users (id) INCLUDE (email);
-- The query can be index-only.

INCLUDE

ดัชนีแบบครอบคลุมที่มีคอลัมน์ซึ่งไม่ใช่คีย์ (PG 11 ขึ้นไป) คอลัมน์จะถูกเก็บไว้ในส่วนปลายของดัชนี แต่ไม่ถูกใช้จัดลำดับ จึงไม่ส่งผลต่อต้นทุนการแทรก:

CREATE INDEX users_id_idx ON users(id) INCLUDE (email, full_name);

SELECT id, email, full_name FROM users WHERE id = 42;
-- Index-only scan if visibility map allows.

เหตุใดจึงยังอาจเข้าถึงฮีป

หลังจากมีการเขียนข้อมูลจำนวนมาก แผนผังการมองเห็นอาจล้าสมัย ให้เรียกใช้ VACUUM (โดยไม่ใช้ FULL) เพื่อรีเฟรชข้อมูล

VACUUM (VERBOSE) users;
-- "scanned X pages, X of which are visible"
-- More visible pages = more Index-Only Scans possible.

ตรวจสอบการสแกนจากดัชนีเท่านั้น

EXPLAIN จะแสดงข้อมูลนี้:

EXPLAIN ANALYZE
SELECT id, email FROM users WHERE id = 42;
--  Index Only Scan using users_id_email_idx on users
--    Index Cond: (id = 42)
--    Heap Fetches: 0       ← key number

ค่า Heap Fetches บอกอะไรคุณ

"Heap Fetches: 0" — สมบูรณ์แบบ ข้อมูลทั้งหมดมาจากดัชนี "Heap Fetches: N" — มี N แถวที่ต้องเข้าถึงฮีป (ไม่ได้ตั้งค่าบิตในแผนผังการมองเห็น) หลังจาก autovacuum ทำงาน ค่า Heap Fetches มักจะลดลง

ควรใช้ INCLUDE หรือดัชนีผสมเมื่อใด

  • ใช้ INCLUDE กับคอลัมน์ที่ใช้ SELECT เท่านั้น (ไม่ได้ใช้กรองหรือจัดเรียง)
  • ใช้ดัชนีผสม (คีย์) เมื่อมีการกรองหรือจัดเรียงด้วยคอลัมน์นั้นด้วย

INCLUDE ทำให้ดัชนีแคบลงและเขียนข้อมูลได้เร็วขึ้น

ข้อมูลส่วนเกินในดัชนีส่งผลเสียต่อการสแกนจากดัชนีเท่านั้น

ดัชนีที่มีข้อมูลส่วนเกินจะมีเพจมากขึ้น ดังนั้นแม้แต่การสแกนจากดัชนีเท่านั้นก็ยังต้องอ่านข้อมูลมากขึ้น ควรทำ VACUUM และสร้างดัชนีใหม่เมื่อข้อมูลส่วนเกินมีปริมาณสูง

อย่าครอบคลุมทุกอย่าง

การเพิ่มคอลัมน์ลงในดัชนีมากเกินไปทำให้การเขียนช้าลงและดัชนีมีขนาดใหญ่ ควรครอบคลุมเฉพาะเส้นทางการอ่านที่ใช้งานบ่อย

ใช้มุมมองที่คำนวณไว้ล่วงหน้าเป็นตัวครอบคลุม

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

สรุปทบทวน

การสแกนจากดัชนีเท่านั้น = เส้นทางการอ่านที่เร็วที่สุด

  • คอลัมน์ที่เลือกทั้งหมดต้องอยู่ในดัชนี
  • INCLUDE เพิ่มคอลัมน์ที่ไม่ใช่คีย์ได้โดยมีต้นทุนต่ำ
  • แผนผังการมองเห็นต้องระบุว่า "มองเห็นทั้งหมด" — VACUUM จะคอยอัปเดตให้เป็นปัจจุบัน
  • EXPLAIN: เป้าหมายคือ Heap Fetches: 0

ตรวจสอบอย่างรวดเร็ว

คุณเห็น Heap Fetches: 100,000 ใน EXPLAIN แม้โหนดจะเป็นการสแกนจากดัชนีเท่านั้น วิธีแก้โดยทั่วไปคืออะไร

คำถามที่พบบ่อย

บทเรียน “การสแกนเฉพาะดัชนีและแผนที่การมองเห็น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสแกนเฉพาะดัชนีและแผนที่การมองเห็น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสแกนเฉพาะดัชนีและแผนที่การมองเห็น”

เปิดใช้การสแกนเฉพาะดัชนีด้วยการสร้างดัชนีให้ครอบคลุมคำสั่งค้นหาและปรับแผนที่การมองเห็นให้เป็นปัจจุบัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การสแกนเฉพาะดัชนีและแผนที่การมองเห็น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. MVCC และสาเหตุของข้อมูลบวม
  2. VACUUM, autovacuum, vacuum_cost_delay
  3. ANALYZE และ pg_statistic
  4. การสแกนเฉพาะดัชนีและแผนที่การมองเห็น
← กลับไปที่ SQL Academy