เข้าใจความแตกต่างระหว่าง 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 พร้อมตัวอย่างบางประการ
ตัวอย่างคำสั่ง
พิจารณาตัวอย่างต่อไปนี้:
-
โดยไม่มี Clustered Index (Heap Table):
DECLARE @temp TABLE (SomeColumn VARCHAR(50)); INSERT INTO @temp SELECT 'SomeVal'; SELECT * FROM @temp;
-
โดยมี 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%)
- การดำเนินการ
- ในการทดลอง พบว่า clustered indexes outperform heap tables ใน:
-
อย่างไรก็ตาม heap table อาจเห็นประโยชน์ด้านประสิทธิภาพในสภาวะโหลดสูงเนื่องจากภาระงานบำรุงรักษาที่ต่ำกว่า แต่ขณะเดียวกันก็ก่อให้เกิดความล่าช้าในการดึงข้อมูลระหว่างการค้นหาข้อมูล
บทสรุป
โดยสรุป ในขณะที่ทั้ง Table Scans และ Clustered Index Scans สามารถสแกนบันทึกทั้งหมดในตารางได้ แต่ Clustered Index Scan มักมีประสิทธิภาพมากกว่าเนื่องจากแนวทางที่มีโครงสร้างและความสามารถในการนำทางที่รวดเร็วขึ้น โดยการเข้าใจความแตกต่างเหล่านี้ ผู้ดูแลฐานข้อมูลและนักพัฒนาสามารถตัดสินใจได้ดียิ่งขึ้นเกี่ยวกับการสร้างดัชนีและกลยุทธ์การดึงข้อมูล ซึ่งส่งผลให้ประสิทธิภาพการทำงานของแอปพลิเคชัน SQL Server ดีขึ้น
หากคุณต้องการเพิ่มประสิทธิภาพการค้นหาและกระบวนการดึงข้อมูล SQL ของคุณ ควรพิจารณาการใช้ clustered indexes อย่างเหมาะสมตามความต้องการของฐานข้อมูลและลักษณะของคำสั่งค้นหาของคุณ