เข้าใจความแตกต่างระหว่าง Table Scan และ Clustered Index Scan

เมื่อทำงานกับฐานข้อมูล คุณอาจพบคำว่า Table Scan และ Clustered Index Scan ทั้งสองวิธีนี้ถูกออกแบบมาเพื่อเข้าถึงข้อมูลในฐานข้อมูล SQL Server แต่มีการทำงานที่แตกต่างกันและมีผลกระทบต่อประสิทธิภาพที่แตกต่างกัน ในบทความนี้เราจะสำรวจความแตกต่างพื้นฐานระหว่างแต่ละวิธีและเหตุผลที่หนึ่งอาจถือว่าดีกว่าอีกวิธีหนึ่ง

Table Scan คืออะไร?

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

  • Heap Table: หากตารางไม่มี clustered index จะถูกจัดประเภทเป็น heap table ซึ่งหมายความว่าหน้าข้อมูลไม่ได้มีการจัดระเบียบในลำดับที่เฉพาะเจาะจง ทำให้เกิดข้อจำกัดดังนี้:
    • ไม่มีหน้าข้อมูลที่เชื่อมโยงกัน
    • ต้องดึงข้อมูลจาก Index Allocation Map (IAM) เพื่อนำทางหน้าข้อมูล

Clustered Index Scan คืออะไร?

ในทางตรงกันข้าม Clustered Index Scan จะใช้ clustered index เพื่อเข้าถึงข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น ใน clustered table หน้าข้อมูลจะถูกจัดระเบียบในลำดับที่เฉพาะเจาะจง (ตามคอลัมน์ที่ดัชนี) ซึ่งช่วยให้ประสิทธิภาพดีขึ้นในระหว่างการสแกน

  • Doubly Linked List: หน้าข้อมูลจะเชื่อมต่อกันผ่าน doubly linked list ซึ่งหมายความว่า:
    • สามารถทำการสแกนแบบลำดับได้รวดเร็วยิ่งขึ้น
    • มีภาระงานน้อยลงเมื่อคุณต้องการค้นหาแถวข้อมูลเฉพาะเนื่องจากข้อมูลถูกจัดเรียง

การเปรียบเทียบประสิทธิภาพ: Table Scan vs. Clustered Index Scan

มาสำรวจเหตุผลที่ Clustered Index Scan มักจะได้รับความนิยมมากกว่า Table Scan พร้อมตัวอย่างบางประการ

ตัวอย่างคำสั่ง

พิจารณาตัวอย่างต่อไปนี้:

  1. โดยไม่มี Clustered Index (Heap Table):

    DECLARE @temp TABLE (SomeColumn VARCHAR(50));
    INSERT INTO @temp SELECT 'SomeVal';
    SELECT * FROM @temp;
    
  2. โดยมี Clustered Index:

    DECLARE @temp TABLE (RowID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, SomeColumn VARCHAR(50));
    INSERT INTO @temp SELECT 'SomeVal';
    SELECT * FROM @temp;
    

การวิเคราะห์ประสิทธิภาพ

นี่คือวิธีการที่สองวิธีนี้เปรียบเทียบกัน:

  • Table Scans:

    • การสแกนต้องการการนำทางผ่านหน้าทั้งหมด
    • ใช้การเขียนที่สองไปยัง IAM ซึ่งอาจทำให้ประสิทธิภาพช้าลง
  • Clustered Index Scans:

    • เนื่องจากข้อมูลมีการจัดระเบียบ เมื่อคุณทำการสั่งค้นหาด้วย WHERE มันสามารถลดปริมาณข้อมูลที่ต้องสแกนอย่างมาก
    • แม้สำหรับคำสั่งที่ดึงข้อมูลทั้งหมด ลักษณะการเชื่อมโยงของหน้าจะทำให้รวดเร็วกว่า heap เล็กน้อย

เมื่อใดที่จะใช้แต่ละวิธี

  • Clustered Index Scan โดยทั่วไปมีประสิทธิภาพมากกว่าเพราะ:

    • สามารถรองรับการค้นหาขอบเขตได้อย่างมีประสิทธิภาพ
    • อนุญาตให้มีประสิทธิภาพที่เหมาะสมผ่านการทำงานแบบ CLUSTERED INDEX SEEK
  • Table Scans มีประสิทธิภาพน้อยในกรณีที่:

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

ผลกระทบต่อการนำเข้า อัพเดต และลบข้อมูล

  • การทำงานของ INSERT, UPDATE, และ DELETE:

    • ในการทดลอง พบว่า clustered indexes outperform heap tables ใน:
      • การดำเนินการ INSERT (เร็วขึ้น 3%)
      • การดำเนินการ UPDATE (เร็วขึ้น 8%)
      • การดำเนินการ DELETE (เร็วขึ้น 18%)
  • อย่างไรก็ตาม heap table อาจเห็นประโยชน์ด้านประสิทธิภาพในสภาวะโหลดสูงเนื่องจากภาระงานบำรุงรักษาที่ต่ำกว่า แต่ขณะเดียวกันก็ก่อให้เกิดความล่าช้าในการดึงข้อมูลระหว่างการค้นหาข้อมูล

บทสรุป

โดยสรุป ในขณะที่ทั้ง Table Scans และ Clustered Index Scans สามารถสแกนบันทึกทั้งหมดในตารางได้ แต่ Clustered Index Scan มักมีประสิทธิภาพมากกว่าเนื่องจากแนวทางที่มีโครงสร้างและความสามารถในการนำทางที่รวดเร็วขึ้น โดยการเข้าใจความแตกต่างเหล่านี้ ผู้ดูแลฐานข้อมูลและนักพัฒนาสามารถตัดสินใจได้ดียิ่งขึ้นเกี่ยวกับการสร้างดัชนีและกลยุทธ์การดึงข้อมูล ซึ่งส่งผลให้ประสิทธิภาพการทำงานของแอปพลิเคชัน SQL Server ดีขึ้น

หากคุณต้องการเพิ่มประสิทธิภาพการค้นหาและกระบวนการดึงข้อมูล SQL ของคุณ ควรพิจารณาการใช้ clustered indexes อย่างเหมาะสมตามความต้องการของฐานข้อมูลและลักษณะของคำสั่งค้นหาของคุณ