SQL มือใหม่? Table scan, Index scan, Index seek ต่างกันอย่างไร

13-มิ.ย.-18

คัมภีร์เทพ IT

ความรู้เกี่ยวกับ SQL ถือเป็นความรู้พื้นฐานที่ Programmer/Developer ทุกคนต้องมีกันอยู่แล้ว โดยเฉพาะคำสั่ง SELECT น่าจะเป็นคำสั่งที่ถือว่าใช้งานกันบ่อยมากที่สุดคำสั่งหนึ่ง ซึ่งในบทความนี้เราจะมาดูเรื่องที่เกี่ยวข้องกับเจ้าคำสั่ง SELECT กัน คือระหว่าง Table scan, Index scan และ Index seek มันต่างกันอย่างไร

ก่อนอื่นเรามาดูแต่ละประเภทกันก่อนว่าเป็นอย่างไร แล้วค่อยไปสรุปความแตกต่างกันตอนท้ายบทความ

TABLE SCAN

Table Scan ถือเป็น Process ที่ค่อนข้างทำแบบตรงๆ คือ เมื่อได้รับคำสั่งให้ Query แบบ Table Scan แล้ว Engine จะเริ่มดำเนินการไล่ไปทีละ Row จนครบทุก Row ของ Table ถ้า Row ใดตรงกับเงื่อนไขแล้ว นั่นหมายถึง Row นั้นจะรวมอยู่ในชุดผลลัพธ์ด้วย แม้คุณอาจจะได้ยินข้อเสียจาก Table Scan มาบ้าง แต่จะว่าไปแล้วมันก็เป็น “วิธีที่เร็วที่สุด” ในการ Retrieve ข้อมูล โดยเฉพาะถ้า Table นั้นมีขนาดเล็ก แต่มันจะแย่ลงถ้า Table มีขนาดใหญ่ขึ้น คุณคงนึกภาพถึงความแตกต่างระหว่างการใช้ Full Table Scan ใน Table ที่มี 4,000,000 Rows กับ Table ที่มีแค่ 100 Rows ออกใช่ไหม โดยทั่วไป Full Table Scan มักถูกใช้เมื่อ Query นั้น ไม่มี WHERE clause เช่น

SELECT * from Employee;

นอกจากนี้ ถ้า Query ของคุณทำใน Table ขนาดใหญ่แล้วช้า ซึ่งดูเหมือนจะใช้ Table Scan หรือ Index Scan คุณสามารถดูได้จาก Execution Plan อย่างเช่น การกด Ctrl + A ใน Microsoft SQL Server Management Studio

INDEX SCAN

หาก Table ของคุณมี Clustered Index อยู่แล้ว และคุณต้องการ Query โดยต้องการข้อมูลออกมาทั้งหมดหรือข้อมูลส่วนใหญ่ของ Table (เช่น Query โดยที่ไม่ใช้ WHERE หรือ HAVING clause) แล้วละก็ เรามักจะใช้ Index Scan ซึ่ง Index Scan จะทำงานคล้ายกับ Table Scan โดยในระหว่าง Process ของการ Query ตัว Query Optimizer จะไล่ตาม Index แล้วเลือกตัวที่ดีที่สุดซึ่ง base on ข้อมูลจากการ JOIN หรือ WHERE clause พร้อมทั้งข้อมูลทางสถิติที่ Database เก็บไว้ เมื่อได้ Index ตัวที่เหมาะสมแล้ว SQL Query processor หรือ Engine จะทำการค้นหา Tree Structure ไปจนถึงจุดที่ข้อมูลตรงกับเงื่อนไข จากนั้นจะดึง Records ที่ต้องการออกมา ข้อแตกต่างหลักๆ ระหว่าง Full Table Scan กับ Index Scan ก็คือ เนื่องจากข้อมูลถูกจัดเรียง (Sorted) อยู่ใน Index Tree ทำให้ Query Engine รู้ว่าเมื่อใดถึงจุดสิ้นสุดของสิ่งที่กำลังหาอยู่ จากนั้นจะส่ง Query หรือย้ายไปที่ข้อมูลช่วงที่อยู่ถัดไป ถ้าใช้ตัวอย่างเดียวกับแบบแรกคือ

SELECT * from Employee;

โดยใช้วิธี Index Scan และมี Clustered Index อยู่แล้วใน Table ก็จะได้ผลลัพธ์ที่รวดเร็วกว่า Table Scan แต่ก็ยังช้ากว่า Index Seek

INDEX SEEK

เมื่อเงื่อนไขการค้นหาของคุณตรงกับ Index มากเพียงพอ Index นั้นจะค้นหาโดยตรงไปยังจุดใดจุดหนึ่งของข้อมูล ซึ่งวิธีนั้นเรียกว่า Index Seek ซึ่งถือเป็นวิธีที่เร็วที่สุดในการ Retrieve ข้อมูลใน Database ซึ่ง Index Seek ถือเป็นสัญญาณที่ดีที่ Index ของคุณจะถูกใช้อย่างเหมาะสม โดยจะเกิดขึ้นเมื่อคุณระบุเงื่อนไขใน WHERE clause เช่น การค้นหา Employee ด้วย id  หรือ name หากคุณมี Index อยู่แล้ว โดยจากตัวอย่าง Query ต่อไปนี้ที่จะใช้ Index Seek:

SELECT * from Employee where EmployeeId=3;

ในกรณีนี้ Query Optimize สามารถใช้การ Index โดยตรงไปยัง Employee คนที่ 3 และทำการ Retrieve ข้อมูลออกมา

ความแตกต่างระหว่าง Table Scan, Index Scan และ Index Seek ใน SQL

  1. Table Scan และ an Index Scan ถูกใช้กรณีที่ต้องการ Retrieve Data ส่วนใหญ่ออกมา(90-100% ของข้อมูล) ในขณะที่ Index Seek จะใช้ในกรณีที่ต้องการ Retrieve Data ออกมาเพียงเล็กน้อยด้วยเงื่อนไขบางอย่างออกมา(10% ของข้อมูล)
  2. ถ้า Query ของคุณไม่มี WHERE clause และใน Table ไม่มี Clustered Index จะใช้ Full Table Scan แต่ถ้ามี Clustered Index อยู่แล้ว สามารถใช้ Index Scan ได้
  3. Index Scan จะทำได้เร็วกว่า Table Scan เพราะมันจะค้นหาจาก Sorted Data และ Query Optimizer รู้ว่าจะหยุดตรงไหนและจะค้นหาที่ Range ต่อๆ ไป
  4. Index Seek จะ Retrieve Data ได้เร็วที่สุด และเหมาะที่จะใช้เมื่อเงื่อนไขของการค้นหามีความเฉพาะเจาะจง โดยทั่วไปเมื่อมี WHERE clause ใน Query และคุณกำลังใช้ Column ที่มี Index อยู่ เมื่อนั้นควรจะใช้ Index Seek ในการ Retrieve Data อย่างเช่นในตัวอย่างที่แสดงใน Query ด้านล่าง

SELECT * from Employee WHERE Id= 3;

คุณสามารถดูได้จาก Execution Plan ใน Query ของคุณ ใน MSSQL Management Studio คุณสามารถเห็น Execution Plan โดยคลิก Ctrl + A และรอดูผลลัพธ์การ Query

นั่นคือทั้งหมดเกี่ยวกับ ความแตกต่างระหว่าง Table scan, Index scan และ Index seek ใน Database อย่างที่กล่าวไป มี 2 วิธีที่จะ Retrieve จาก Database คือใช้ Table Scan หรือไม่ก็ใช้ Index ซึ่งแบบหลัง จะทำได้เร็วกว่าในกรณีที่ Table มีขนาดใหญ่ และทางเลือกของการใช้ Index ขึ้นอยู่กับหลายปัจจัย เช่น WHERE clause, การ JOIN กันของ Table, Column ที่คุณจะใช้ หรือขนาดของ Table เป็นต้น

ถ้าคุณรู้สึกว่า Query ของคุณมันช้า คุณต้องเช็ค Execution Plan เพื่อ Confirm ว่าจะใช้ Index Seek หรือ Index Scan หรือ Table Scan จากนั้นคุณสามารถ Optimize Query ของคุณ โดยเลือกใช้ Index ที่เหมาะสม หรือปรับปรุง Query ของคุณซะใหม่

ที่มา:  http://www.java67.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความที่เกี่ยวข้อง