กลับไปหน้าบทความ

อ่าน 7 นาที

เอ็นจิ้นจัดเก็บข้อมูลที่ขยายได้

Extensible Storage Engine ( ESE ) หรือที่รู้จักกันในชื่อJET Blueเป็น เทคโนโลยีการจัดเก็บข้อมูล แบบ ISAM (Indexed Sequential Access Method) จากMicrosoft ESE...

เอ็นจิ้นจัดเก็บข้อมูลที่ขยายได้

เอ็นจิ้นจัดเก็บข้อมูลที่ขยายได้
ชื่ออื่นๆเจ็ทบลู
นักพัฒนาไมโครซอฟต์
ปล่อยพ.ศ. 2537 ( 1994 )
เขียนเป็นซี++
ระบบปฏิบัติการไมโครซอฟต์ วินโดวส์
แพลตฟอร์มIA-32 , x86-64 , ARMและItanium (และในอดีตDEC Alpha , MIPSและPowerPC )
พิมพ์เอนจินฐานข้อมูล
ใบอนุญาตใบอนุญาต MIT
เว็บไซต์docs.microsoft.com/en-us/windows/win32/extensible-storage-engine/extensible-storage-engine แก้ไขข้อมูลนี้บนวิกิดาต้า
ที่เก็บข้อมูล
  • github.com/microsoft/Extensible-Storage-Engine

Extensible Storage Engine ( ESE ) หรือที่รู้จักกันในชื่อJET Blueเป็น เทคโนโลยีการจัดเก็บข้อมูล แบบ ISAM (Indexed Sequential Access Method) จากMicrosoft ESE เป็นหัวใจหลักของMicrosoft Exchange Server , Active DirectoryและWindows Searchนอกจากนี้ยังถูกใช้โดยส่วนประกอบต่างๆ ของ Windows รวมถึงWindows Update Client และHelp and Support Centerจุดประสงค์ของ ESE คือการอนุญาตให้แอปพลิเคชันจัดเก็บและเรียกใช้ข้อมูลผ่านการเข้าถึงแบบดัชนีและลำดับ

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

ESE Runtime (ESENT.DLL) ถูกรวมอยู่ในWindows ทุก เวอร์ชันตั้งแต่Windows 2000 เป็นต้นมา โดยเวอร์ชัน x64 ของ ESE Runtime นั้นรวมอยู่ในWindows XPและWindows Server 2003เวอร์ชัน x64 ด้วย ส่วน Microsoft ExchangeจนถึงExchange 2003 นั้นมาพร้อมกับเวอร์ชัน 32 บิตเท่านั้น เนื่องจากเป็นแพลตฟอร์มที่รองรับเพียงแพลตฟอร์มเดียว แต่สำหรับExchange 2007นั้นมาพร้อมกับเวอร์ชัน 64 บิตแล้ว

ฐานข้อมูล

ฐานข้อมูลเป็นการจัดกลุ่มข้อมูลทั้งทางกายภาพและทางตรรกะ ฐานข้อมูล ESE ดูเหมือนไฟล์เดียวสำหรับ Windows ภายในฐานข้อมูลเป็นชุดของหน้าขนาด 2, 4, 8, 16 หรือ 32 KB (ตัวเลือกหน้าขนาด 16 และ 32 KB มีเฉพาะใน Windows 7 และ Exchange 2010 เท่านั้น) [ 1 ]จัดเรียงในโครงสร้างB-tree ที่สมดุล [ 2 ]หน้าเหล่านี้ประกอบด้วยเมตาเดต้าเพื่ออธิบายข้อมูลที่อยู่ในฐานข้อมูล ข้อมูลเอง ดัชนีเพื่อจัดเก็บลำดับข้อมูลที่น่าสนใจ และข้อมูลอื่นๆ ข้อมูลเหล่านี้ผสมผสานกันภายในไฟล์ฐานข้อมูล แต่มีความพยายามที่จะเก็บข้อมูลที่ใช้ร่วมกันไว้ด้วยกันเป็นกลุ่มภายในฐานข้อมูล ฐานข้อมูล ESE อาจมีหน้าได้มากถึง 2 32หน้า หรือข้อมูล 16 เทราไบต์[ 3 ] สำหรับ หน้าขนาด 8 กิโลไบต์

ฐานข้อมูล ESE ถูกจัดระเบียบเป็นกลุ่มที่เรียกว่าอินสแตนซ์ แอปพลิเคชันส่วนใหญ่ใช้อินสแตนซ์เดียว แต่แอปพลิเคชันทุกตัวก็สามารถใช้หลายอินสแตนซ์ได้เช่นกัน ความสำคัญของอินสแตนซ์คือการเชื่อมโยงชุดบันทึกการกู้คืนเดียวกับฐานข้อมูลหนึ่งฐานหรือมากกว่า ปัจจุบัน สามารถเชื่อมต่อฐานข้อมูลผู้ใช้ได้สูงสุด 6 ฐานกับอินสแตนซ์ ESE ในเวลาใดก็ได้ แต่ละกระบวนการที่ใช้ ESE สามารถมีอินสแตนซ์ ESE ได้มากถึง 1024 อินสแตนซ์

ฐานข้อมูลสามารถพกพาได้ กล่าวคือ สามารถแยกออกจากอินสแตนซ์ ESE ที่กำลังทำงานอยู่ และเชื่อมต่อกลับไปยังอินสแตนซ์เดียวกันหรืออินสแตนซ์อื่นได้ในภายหลัง ในขณะที่แยกอยู่ ฐานข้อมูลสามารถคัดลอกได้โดยใช้ยูทิลิตี้มาตรฐานของ Windows แต่ไม่สามารถคัดลอกฐานข้อมูลได้ในขณะที่กำลังใช้งานอยู่ เนื่องจาก ESE เปิดไฟล์ฐานข้อมูลแบบเฉพาะเจาะจงเท่านั้น ฐานข้อมูลสามารถจัดเก็บไว้บนอุปกรณ์ใดก็ได้ที่รองรับการทำงาน I/O ที่สามารถเข้าถึงได้โดยตรงโดย Windows

ตาราง

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

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

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

บันทึกและคอลัมน์

เรคอร์ดคือชุดค่าคอลัมน์ที่เชื่อมโยงกัน เรคอร์ดจะถูกแทรกและอัปเดตผ่านการดำเนินการอัปเดต และสามารถลบได้ผ่านการดำเนินการลบ คอลัมน์จะถูกตั้งค่าและเรียกใช้ผ่านการดำเนินการตั้งค่าคอลัมน์และเรียกใช้คอลัมน์ตามลำดับ ขนาดสูงสุดของเรคอร์ดคือ 8110 ไบต์สำหรับเพจขนาด 8 กิโลไบต์ ยกเว้นคอลัมน์ค่าแบบยาว ประเภทคอลัมน์ LongText และ LongBinary ไม่ได้ส่งผลต่อข้อจำกัดด้านขนาดนี้อย่างมีนัยสำคัญ และเรคอร์ดสามารถเก็บข้อมูลที่มีขนาดใหญ่กว่าขนาดเพจของฐานข้อมูลได้มากเมื่อข้อมูลถูกจัดเก็บไว้ในคอลัมน์ค่าแบบยาว เมื่อมีการจัดเก็บการอ้างอิงค่าแบบยาวในเรคอร์ด จะต้องใช้ข้อมูลในเรคอร์ดเพียง 9 ไบต์เท่านั้น ค่าแบบยาวเหล่านี้อาจมีขนาด ได้ถึง 2 กิกะไบต์ (GB)

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

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

ประเภทคอลัมน์

ชื่อ คำอธิบาย
นิดหน่อย ค่าไตรภาค (NULL, 0 หรือ 1)
ไบต์ที่ไม่มีเครื่องหมาย จำนวนเต็มไม่ระบุเครื่องหมายขนาด 1 ไบต์
สั้น จำนวนเต็มแบบมีเครื่องหมาย 2 ไบต์
ชอร์ตที่ไม่มีลายเซ็น จำนวนเต็มไม่ระบุเครื่องหมายขนาด 2 ไบต์
ยาว จำนวนเต็มแบบมีเครื่องหมายขนาด 4 ไบต์
ยาวที่ไม่มีลายเซ็น จำนวนเต็มไม่ระบุเครื่องหมายขนาด 4 ไบต์
หลง หลง จำนวนเต็มแบบมีเครื่องหมายขนาด 8 ไบต์
ลายเซ็นยาวยาว จำนวนเต็มไม่ระบุเครื่องหมายขนาด 8 ไบต์
สกุลเงิน จำนวนเต็มแบบมีเครื่องหมายขนาด 8 ไบต์
อีไออี ซิงเกิล เลขทศนิยม 4 ไบต์
อีอีอีดับเบิล เลขทศนิยม 8 ไบต์
วันที่และเวลา รูปแบบวันที่และเวลา 8 ไบต์ (วันที่จำนวนเต็ม เวลาทศนิยม)
ไกด์ ตัวระบุเฉพาะขนาด 16 ไบต์
ไบนารี สตริงไบนารี ความยาวไม่เกิน 255 ไบต์
ข้อความ สตริง ANSI หรือ Unicode ความยาวไม่เกิน 255 ไบต์
ไบนารี่ยาว สตริงไบนารีขนาดใหญ่ ความยาว < 2 GB
ข้อความยาว สตริง ANSI หรือ Unicode ขนาดใหญ่ ความยาวไม่เกิน 2 GB

คอลัมน์คงที่ คอลัมน์แปรผัน และคอลัมน์ที่มีแท็ก

แต่ละตาราง ESE สามารถกำหนดคอลัมน์ความยาวคงที่ได้สูงสุด 127 คอลัมน์ คอลัมน์ความยาวแปรผันได้สูงสุด 128 คอลัมน์ และคอลัมน์ที่มีแท็กได้สูงสุด 64,993 คอลัมน์

  • คอลัมน์คงที่โดยพื้นฐานแล้วคือคอลัมน์ที่ใช้พื้นที่เท่ากันในแต่ละระเบียน โดยไม่คำนึงถึงค่าของคอลัมน์นั้น คอลัมน์คงที่ใช้พื้นที่ 1 บิตเพื่อแสดงค่าว่าง (NULL) และใช้พื้นที่คงที่ในแต่ละระเบียนที่คอลัมน์นั้น หรือคอลัมน์คงที่ที่กำหนดขึ้นในภายหลัง ถูกกำหนดค่าไว้
  • คอลัมน์ตัวแปรโดยพื้นฐานแล้วคือคอลัมน์ที่ใช้พื้นที่ในแต่ละระเบียนในปริมาณที่แตกต่างกัน ขึ้นอยู่กับขนาดของค่าในคอลัมน์นั้นๆ คอลัมน์ตัวแปรใช้พื้นที่ 2 ไบต์ในการกำหนดค่าว่าง (NULL) และขนาด และใช้พื้นที่ในปริมาณที่แตกต่างกันในแต่ละระเบียนที่กำหนดค่าให้กับคอลัมน์นั้น
  • คอลัมน์ที่มีแท็กคือคอลัมน์ที่ไม่ใช้พื้นที่ใดๆ เลยหากไม่ได้กำหนดค่าในเรคอร์ด คอลัมน์เหล่านี้อาจมีค่าเดียวหรือหลายค่าก็ได้ คอลัมน์ที่มีแท็กเดียวกันอาจมีหลายค่าในเรคอร์ดเดียว เมื่อกำหนดค่าคอลัมน์ที่มีแท็กในเรคอร์ดแล้ว แต่ละอินสแตนซ์ของคอลัมน์ที่มีแท็กจะใช้พื้นที่ประมาณ 4 ไบต์ นอกเหนือจากขนาดของค่าอินสแตนซ์ของคอลัมน์ที่มีแท็ก เมื่อจำนวนอินสแตนซ์ของคอลัมน์ที่มีแท็กเดียวมีจำนวนมาก ค่าใช้จ่ายเพิ่มเติมต่ออินสแตนซ์ของคอลัมน์ที่มีแท็กจะอยู่ที่ประมาณ 2 ไบต์ คอลัมน์ที่มีแท็กเหมาะสำหรับคอลัมน์ที่มีข้อมูลกระจัดกระจาย เนื่องจากไม่ใช้พื้นที่ใดๆ เลยหากไม่ได้กำหนดค่า หากคอลัมน์ที่มีแท็กซึ่งมีหลายค่าถูกสร้างดัชนี ดัชนีจะประกอบด้วยรายการเดียวสำหรับเรคอร์ดนั้นๆ สำหรับแต่ละค่าของคอลัมน์ที่มีแท็ก

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

ค่าระยะยาว

คอลัมน์ประเภท Long Text และ Long Binary เป็นอ็อบเจ็กต์ไบนารีขนาดใหญ่ โดยจะถูกจัดเก็บใน B+tree แยกต่างหากจากดัชนีคลัสเตอร์ที่ใช้รหัสค่าแบบยาวและออฟเซ็ตไบต์เป็นคีย์ ESE รองรับการเพิ่มข้อมูล การเขียนทับช่วงไบต์ และการกำหนดขนาดสำหรับคอลัมน์เหล่านี้ นอกจากนี้ ESE ยังมีคุณสมบัติการจัดเก็บแบบอินสแตนซ์เดียว ซึ่งช่วยให้หลายเรคอร์ดสามารถอ้างอิงถึงอ็อบเจ็กต์ไบนารีขนาดใหญ่เดียวกันได้ ราวกับว่าแต่ละเรคอร์ดมีสำเนาข้อมูลของตนเอง กล่าวคือ โดยไม่มีข้อขัดแย้งในการล็อกระหว่างเรคอร์ด ขนาดสูงสุดของค่าคอลัมน์ Long Text หรือ Long Binary คือ 2 GB

คอลัมน์เวอร์ชัน การเพิ่มค่าอัตโนมัติ และบัญชีเงินฝากค้ำประกัน

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

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

คอลัมน์ Escrow สามารถแก้ไขได้ผ่านการดำเนินการ EscrowUpdate การอัปเดตแบบ Escrow เป็นการดำเนินการเปลี่ยนแปลงค่าตัวเลข คอลัมน์ Escrow ต้องเป็นชนิด Long ตัวอย่างของการดำเนินการเปลี่ยนแปลงค่าตัวเลข ได้แก่ การเพิ่ม 2 ให้กับค่า หรือการลบ 1 ออกจากค่า ESE จะติดตามการเปลี่ยนแปลงของค่า แทนที่จะเป็นค่าสุดท้ายของการอัปเดต หลายเซสชันอาจมีการเปลี่ยนแปลงที่ค้างอยู่ซึ่งทำผ่าน EscrowUpdate ไปยังค่าเดียวกัน เนื่องจาก ESE สามารถกำหนดค่าสุดท้ายที่แท้จริงได้โดยไม่คำนึงถึงว่าธุรกรรมใดจะยืนยันหรือยกเลิก ซึ่งช่วยให้ผู้ใช้หลายคนสามารถอัปเดตคอลัมน์พร้อมกันได้โดยการเปลี่ยนแปลงค่าตัวเลข นอกจากนี้ เอ็นจินฐานข้อมูลยังสามารถลบเรคอร์ดที่มีค่าเป็นศูนย์ในคอลัมน์ได้ การใช้งานทั่วไปสำหรับคอลัมน์ Escrow ดังกล่าวคือตัวนับการอ้างอิง: หลายเธรดจะเพิ่ม/ลดค่าโดยไม่มีการล็อก และเมื่อตัวนับถึงศูนย์ เรคอร์ดจะถูกลบโดยอัตโนมัติ

ดัชนี

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

ดัชนีแบบคลัสเตอร์

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

การสร้างดัชนีบนคอลัมน์ที่มีหลายค่า

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

ดัชนีแบบเบาบาง

ดัชนีสามารถกำหนดให้เป็นดัชนีแบบเบาบางได้เช่นกัน ดัชนีแบบเบาบางจะไม่มีอย่างน้อยหนึ่งรายการสำหรับแต่ละระเบียนในตาราง มีตัวเลือกมากมายในการกำหนดดัชนีแบบเบาบาง ตัวเลือกต่างๆ ได้แก่ การยกเว้นระเบียนจากดัชนีเมื่อคีย์ดัชนีทั้งหมดเป็น NULL เมื่อส่วนใดส่วนหนึ่งของคีย์เป็น NULL หรือเมื่อส่วนแรกของคีย์เท่านั้นที่เป็น NULL นอกจากนี้ ดัชนียังสามารถมีคอลัมน์แบบมีเงื่อนไขได้ คอลัมน์เหล่านี้จะไม่ปรากฏในดัชนี แต่สามารถทำให้ระเบียนไม่ถูกจัดทำดัชนีได้เมื่อคอลัมน์แบบมีเงื่อนไขเป็น NULL หรือไม่ใช่ NULL

ดัชนีทูเพิล

นอกจากนี้ยังสามารถกำหนดดัชนีให้รวมรายการเดียวสำหรับแต่ละสตริงย่อยของคอลัมน์ข้อความหรือข้อความยาวได้ ดัชนีเหล่านี้เรียกว่าดัชนีทูเพิล ซึ่งใช้เพื่อเพิ่มความเร็วในการค้นหาด้วยเงื่อนไขการจับคู่สตริงย่อย ดัชนีทูเพิลสามารถกำหนดได้เฉพาะกับคอลัมน์ข้อความเท่านั้น ตัวอย่างเช่น หากค่าในคอลัมน์ข้อความคือ“I love JET Blue”และดัชนีถูกกำหนดค่าให้มีขนาดทูเพิลขั้นต่ำ 4 ตัวอักษรและความยาวทูเพิลสูงสุด 10 ตัวอักษร สตริงย่อยต่อไปนี้จะถูกจัดทำดัชนี:

“ฉันรัก JET”

“รักเจ็ท” “รักเจ็ท บี” “รักเจ็ท บลู” “รักเจ็ท บ ลู” “เจ็ท บลู” “เจ็ท บลู” “เจ็ท บลู” “เจ็ท บลู” “ที บลู” “ บลู”

แม้ว่าดัชนีทูเพิลจะมีขนาดใหญ่มาก แต่ก็สามารถเร่งความเร็วในการค้นหาข้อมูลในรูปแบบ: ค้นหาบันทึกทั้งหมดที่มีคำว่า “JET Blue” ได้ อย่างมีนัย สำคัญ สามารถใช้ดัชนีทูเพิลสำหรับสตริงย่อยที่ยาวกว่าความยาวทูเพิลสูงสุดได้ โดยการแบ่งสตริงย่อยที่ใช้ค้นหาออกเป็นสตริงค้นหาที่มีความยาวเท่ากับความยาวทูเพิลสูงสุด แล้วนำผลลัพธ์มาซ้อนทับกัน นอกจากนี้ยังสามารถใช้สำหรับการค้นหาแบบตรงกันทุกประการสำหรับสตริงที่มีความยาวเท่ากับความยาวทูเพิลสูงสุดหรือสั้นเท่ากับความยาวทูเพิลขั้นต่ำ โดยไม่ต้องมีการซ้อนทับดัชนี สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดำเนินการซ้อนทับดัชนีใน ESE โปรดดูที่การซ้อนทับดัชนี ดัชนีทูเพิลไม่สามารถเร่งความเร็วในการค้นหาข้อมูลที่สตริงค้นหาสั้นกว่าความยาวทูเพิลขั้นต่ำได้

ธุรกรรม

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

ธุรกรรมสามารถซ้อนกันได้สูงสุด 7 ระดับ โดยมีอีกหนึ่งระดับที่สงวนไว้สำหรับการใช้งานภายในของ ESE หมายความว่าส่วนหนึ่งของธุรกรรมสามารถถูกยกเลิกได้โดยไม่จำเป็นต้องยกเลิกธุรกรรมทั้งหมด คำสั่ง CommitTransaction ของธุรกรรมที่ซ้อนกันนั้นเป็นเพียงการแสดงถึงความสำเร็จของขั้นตอนการประมวลผลหนึ่งเท่านั้น และธุรกรรมภายนอกอาจยังคงล้มเหลวได้ การเปลี่ยนแปลงจะถูกบันทึกในฐานข้อมูลก็ต่อเมื่อธุรกรรมภายนอกสุดได้รับการยืนยันแล้วเท่านั้น ซึ่งเรียกว่าการยืนยันในระดับธุรกรรมที่ 0 เมื่อธุรกรรมได้รับการยืนยันในระดับธุรกรรมที่ 0 ข้อมูลที่อธิบายธุรกรรมจะถูกส่งไปยังล็อกแบบซิงโครนัสเพื่อให้แน่ใจว่าธุรกรรมจะเสร็จสมบูรณ์แม้ในกรณีที่ระบบล่มในภายหลัง การส่งล็อกแบบซิงโครนัสทำให้ธุรกรรมของ ESE มีความทนทาน อย่างไรก็ตาม ในบางกรณี แอปพลิเคชันต้องการจัดลำดับการอัปเดต แต่ไม่รับประกันว่าการเปลี่ยนแปลงจะเสร็จสมบูรณ์ในทันที ในกรณีนี้ แอปพลิเคชันสามารถยืนยันการเปลี่ยนแปลงด้วย JET_bitIndexLazyFlush ได้

ESE รองรับกลไกการควบคุมการทำงานพร้อมกันที่เรียกว่า มัลติเวอร์ชัน (multi-versioning) ในมัลติเวอร์ชัน ทุกธุรกรรมจะสอบถามมุมมองที่สอดคล้องกันของฐานข้อมูลทั้งหมด ณ เวลาที่ธุรกรรมเริ่มต้น การอัปเดตที่พบจะมีเฉพาะการอัปเดตที่กระทำโดยธุรกรรมนั้นเอง ด้วยวิธีนี้ แต่ละธุรกรรมจะทำงานราวกับว่าเป็นธุรกรรมที่ใช้งานอยู่เพียงธุรกรรมเดียวในระบบ ยกเว้นในกรณีที่มีข้อขัดแย้งในการเขียน เนื่องจากธุรกรรมอาจทำการเปลี่ยนแปลงโดยอิงจากข้อมูลที่อ่านซึ่งได้รับการอัปเดตไปแล้วในธุรกรรมอื่น มัลติเวอร์ชันจึงไม่รับประกันว่า ธุรกรรม จะสามารถเรียงลำดับได้ (serializable ) อย่างไรก็ตาม สามารถทำให้ เรียงลำดับได้เมื่อต้องการโดยการใช้ล็อกการอ่านเรคอร์ดอย่างชัดเจนเพื่อล็อกข้อมูลที่อ่านซึ่งการอัปเดตอิงอยู่ สามารถขอทั้งล็อกการอ่านและล็อกการเขียนได้อย่างชัดเจนด้วยการดำเนินการ GetLock

นอกจากนี้ ESE ยังรองรับคุณสมบัติการควบคุมการทำงานพร้อมกันขั้นสูงที่เรียกว่าการล็อกเอสโครว์ (escrow locking) การล็อกเอสโครว์เป็นการอัปเดตที่มีการทำงานพร้อมกันสูงมาก โดยค่าตัวเลขจะถูกเปลี่ยนแปลงในลักษณะสัมพัทธ์ เช่น โดยการเพิ่มหรือลบค่าตัวเลขอื่น การอัปเดตด้วยเอสโครว์จะไม่ขัดแย้งกับการอัปเดตเอสโครว์อื่น ๆ ที่เกิดขึ้นพร้อมกันกับข้อมูลเดียวกัน เนื่องจากโอเปอเรชันที่รองรับนั้นสามารถสลับลำดับได้ และสามารถยืนยันหรือยกเลิกได้โดยอิสระ ดังนั้นจึงไม่รบกวนธุรกรรมการอัปเดตที่เกิดขึ้นพร้อมกัน คุณสมบัตินี้มักใช้สำหรับการรวมข้อมูลที่ได้รับการดูแลรักษา

ESE ยังขยายความหมายของการทำธุรกรรมจากการดำเนินการจัดการข้อมูลไปสู่การดำเนินการกำหนดข้อมูลด้วย สามารถเพิ่มดัชนีลงในตารางและให้ธุรกรรมที่ทำงานพร้อมกันอัปเดตตารางเดียวกันได้โดยไม่มีการแย่งชิงการล็อกธุรกรรมใดๆ ต่อมา เมื่อธุรกรรมเหล่านี้เสร็จสมบูรณ์ ดัชนีที่สร้างขึ้นใหม่จะพร้อมใช้งานสำหรับธุรกรรมทั้งหมดและมีรายการสำหรับการอัปเดตเรคอร์ดที่ทำโดยธุรกรรมอื่นๆ ที่ไม่สามารถรับรู้ถึงการมีอยู่ของดัชนีเมื่อการอัปเดตเกิดขึ้น การดำเนินการกำหนดข้อมูลสามารถทำได้ด้วยคุณสมบัติทั้งหมดที่คาดหวังจากกลไกธุรกรรมสำหรับการอัปเดตเรคอร์ด การดำเนินการกำหนดข้อมูลที่รองรับในลักษณะนี้ ได้แก่ AddColumn, DeleteColumn, CreateIndex, DeleteIndex, CreateTable และ DeleteTable

การนำทางเคอร์เซอร์และบัฟเฟอร์การคัดลอก

เคอร์เซอร์คือตัวชี้เชิงตรรกะภายในดัชนีตาราง เคอร์เซอร์อาจอยู่บนเรคอร์ด ก่อนเรคอร์ดแรก หลังเรคอร์ดสุดท้าย หรือแม้กระทั่งระหว่างเรคอร์ด หากเคอร์เซอร์อยู่ก่อนหรือหลังเรคอร์ด แสดงว่าไม่มีเรคอร์ดปัจจุบันอยู่ สามารถมีเคอร์เซอร์หลายตัวในดัชนีตารางเดียวกันได้ การดำเนินการกับเรคอร์ดและคอลัมน์หลายอย่างขึ้นอยู่กับตำแหน่งของเคอร์เซอร์ สามารถย้ายตำแหน่งของเคอร์เซอร์ได้ทีละลำดับโดยใช้การดำเนินการย้าย (Move) หรือโดยตรงโดยใช้คีย์ดัชนีด้วยการดำเนินการค้นหา (Seek) นอกจากนี้ยังสามารถย้ายเคอร์เซอร์ไปยังตำแหน่งเศษส่วนภายในดัชนีได้ ด้วยวิธีนี้ เคอร์เซอร์สามารถย้ายไปยังตำแหน่งแถบเลื่อนได้อย่างรวดเร็ว การดำเนินการนี้ทำได้ด้วยความเร็วเท่ากับการดำเนินการค้นหา ไม่จำเป็นต้องเข้าถึงข้อมูลระหว่างกลาง

แต่ละเคอร์เซอร์จะมีบัฟเฟอร์สำเนาเพื่อสร้างเรคอร์ดใหม่ หรือแก้ไขเรคอร์ดที่มีอยู่ทีละคอลัมน์ บัฟเฟอร์นี้เป็นบัฟเฟอร์ภายในซึ่งสามารถเปลี่ยนแปลงเนื้อหาได้ด้วยการดำเนินการ SetColumns การแก้ไขบัฟเฟอร์สำเนาจะไม่เปลี่ยนแปลงข้อมูลที่จัดเก็บไว้โดยอัตโนมัติ สามารถคัดลอกเนื้อหาของเรคอร์ดปัจจุบันลงในบัฟเฟอร์สำเนาได้โดยใช้การดำเนินการ PrepareUpdate และการดำเนินการ Update จะจัดเก็บเนื้อหาของบัฟเฟอร์สำเนาเป็นเรคอร์ด บัฟเฟอร์สำเนาจะถูกล้างโดยอัตโนมัติเมื่อมีการยืนยันหรือยกเลิกธุรกรรม รวมถึงเมื่อมีการดำเนินการนำทาง สามารถใช้ RetrieveColumns เพื่อดึงข้อมูลคอลัมน์จากเรคอร์ดหรือจากบัฟเฟอร์สำเนา หากมีอยู่

การประมวลผลคำถาม

แอปพลิเคชัน ESE มักทำการสอบถามข้อมูลอยู่เสมอ ส่วนนี้ของเอกสารจะอธิบายถึงคุณสมบัติและเทคนิคสำหรับแอปพลิเคชันในการเขียนตรรกะการประมวลผลการสอบถามข้อมูลบน ESE

การเรียงลำดับและตารางชั่วคราว

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

ดัชนีครอบคลุม

การดึงข้อมูลคอลัมน์โดยตรงจากดัชนีรองเป็นวิธีการเพิ่มประสิทธิภาพที่สำคัญอย่างหนึ่ง สามารถดึงข้อมูลคอลัมน์ได้โดยตรงจากดัชนีรองโดยไม่ต้องเข้าถึงระเบียนข้อมูล ผ่านแฟล็ก RetrieveFromIndex ในการดำเนินการ RetrieveColumns การดึงข้อมูลคอลัมน์จากดัชนีรองนั้นมีประสิทธิภาพมากกว่าการดึงจากระเบียน เมื่อทำการนำทางโดยใช้ดัชนี หากดึงข้อมูลคอลัมน์จากระเบียน จะต้องมีการนำทางเพิ่มเติมเพื่อค้นหาระเบียนโดยใช้คีย์หลัก ซึ่งอาจส่งผลให้มีการเข้าถึงดิสก์เพิ่มเติม เมื่อดัชนีมีคอลัมน์ที่จำเป็นทั้งหมด จะเรียกว่าดัชนีครอบคลุม โปรดทราบว่าคอลัมน์ที่กำหนดไว้ในดัชนีหลักของตารางจะพบได้ในดัชนีรองด้วย และสามารถดึงข้อมูลได้ในทำนองเดียวกันโดยใช้ JET_bitRetrieveFromPrimaryBookmark

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

จุดตัดดัชนี

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

การตัดกันของดัชนี (Index intersection) เป็นกลไกการค้นหาที่สำคัญ ซึ่งใช้ดัชนีหลายตัวร่วมกันเพื่อประมวลผลข้อจำกัดที่ซับซ้อนได้อย่างมีประสิทธิภาพมากขึ้น แทนที่จะใช้ดัชนีเพียงตัวเดียว ช่วงดัชนีบนดัชนีหลายตัวจะถูกรวมเข้าด้วยกันเพื่อให้ได้จำนวนระเบียนที่น้อยลงมาก ซึ่งสามารถใช้เงื่อนไขที่เหลืออยู่ได้ ESE ทำให้เรื่องนี้ง่ายขึ้นโดยการจัดเตรียมการดำเนินการ IntersectIndexes การดำเนินการนี้รับช่วงดัชนีหลายช่วงบนดัชนีจากตารางเดียวกัน และส่งคืนตารางชั่วคราวของคีย์หลักที่สามารถใช้เพื่อนำทางไปยังระเบียนในตารางหลักที่ตรงตามเงื่อนไขดัชนีทั้งหมด

ตารางที่เชื่อมต่อไว้ล่วงหน้า

การเชื่อมต่อ (Join) เป็นการดำเนินการทั่วไปในการออกแบบตารางแบบนอร์มาไลซ์ (Normalized Table) โดยจะนำข้อมูลที่มีความสัมพันธ์กันทางตรรกะมารวมกันเพื่อใช้งานในแอปพลิเคชัน การเชื่อมต่ออาจเป็นการดำเนินการที่ใช้ทรัพยากรมาก เนื่องจากอาจต้องมีการเข้าถึงข้อมูลจำนวนมากเพื่อนำข้อมูลที่เกี่ยวข้องเข้าสู่หน่วยความจำ ในบางกรณี สามารถลดภาระงานนี้ได้โดยการกำหนดตารางฐาน (Base Table) เดียวที่เก็บข้อมูลสำหรับตารางตรรกะสองตารางขึ้นไป ชุดคอลัมน์ของตารางฐานคือการรวมกันของชุดคอลัมน์ของตารางตรรกะเหล่านั้น คอลัมน์ที่มีแท็ก (Tagged Columns) ทำให้สิ่งนี้เป็นไปได้ เนื่องจากสามารถจัดการข้อมูลที่มีหลายค่าและข้อมูลที่มีค่ากระจัดกระจายได้ดี เนื่องจากข้อมูลที่เกี่ยวข้องถูกจัดเก็บไว้ด้วยกันในเรคอร์ดเดียวกัน จึงมีการเข้าถึงข้อมูลพร้อมกัน ซึ่งช่วยลดจำนวนการเข้าถึงดิสก์ในการดำเนินการเชื่อมต่อ กระบวนการนี้สามารถขยายไปยังตารางตรรกะจำนวนมากได้ เนื่องจาก ESE สามารถรองรับคอลัมน์ที่มีแท็กได้มากถึง 64,993 คอลัมน์ เนื่องจากสามารถกำหนดดัชนีบนคอลัมน์ที่มีหลายค่าได้ จึงยังคงสามารถสร้างดัชนีให้กับตาราง 'ภายใน' ได้ อย่างไรก็ตาม มีข้อจำกัดบางประการ และแอปพลิเคชันควรพิจารณาการเชื่อมต่อล่วงหน้าอย่างรอบคอบก่อนที่จะใช้วิธีการนี้

การบันทึกและการกู้คืนจากข้อผิดพลาด

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

การดำเนินการธุรกรรมจะถูกบันทึกไว้ และบันทึกนั้นจะถูกเขียนลงดิสก์ทุกครั้งที่มีการยืนยันธุรกรรมในระดับ 0 วิธีนี้ช่วยให้กระบวนการกู้คืนสามารถทำซ้ำการอัปเดตที่ทำโดยธุรกรรมที่ยืนยันในระดับ 0 และยกเลิกการเปลี่ยนแปลงที่ทำโดยธุรกรรมที่ไม่ได้ยืนยันในระดับ 0 รูปแบบการกู้คืนประเภทนี้มักเรียกว่ารูปแบบการกู้คืนแบบ 'ย้อนกลับ/เดินหน้า' บันทึกสามารถเก็บไว้จนกว่าข้อมูลจะถูกคัดลอกอย่างปลอดภัยผ่านกระบวนการสำรองข้อมูลที่อธิบายไว้ด้านล่าง หรือบันทึกสามารถนำกลับมาใช้ใหม่ในลักษณะหมุนเวียนได้ทันทีที่ไม่ได้ใช้สำหรับการกู้คืนจากระบบล่มอีกต่อไป การบันทึกแบบหมุนเวียนช่วยลดพื้นที่ดิสก์ที่จำเป็นสำหรับบันทึก แต่มีผลกระทบต่อความสามารถในการสร้างสถานะข้อมูลขึ้นใหม่ในกรณีที่สื่อบันทึกล้มเหลว

สำรองข้อมูลและกู้คืน

การบันทึกและการกู้คืนข้อมูลยังมีบทบาทสำคัญในการปกป้องข้อมูลจากการทำงานผิดพลาดของสื่อบันทึกข้อมูล ESE รองรับการสำรองข้อมูลแบบออนไลน์ โดยจะคัดลอกฐานข้อมูลหนึ่งฐานหรือมากกว่านั้น พร้อมกับไฟล์บันทึกข้อมูลในลักษณะที่ไม่ส่งผลกระทบต่อการทำงานของฐานข้อมูล ฐานข้อมูลยังคงสามารถเรียกดูและอัปเดตได้ในขณะที่กำลังทำการสำรองข้อมูล การสำรองข้อมูลนี้เรียกว่า 'การสำรองข้อมูลแบบคลุมเครือ' (fuzzy backup) เนื่องจากกระบวนการกู้คืนจะต้องดำเนินการเป็นส่วนหนึ่งของการกู้คืนข้อมูลสำรองเพื่อให้ได้ชุดฐานข้อมูลที่สอดคล้องกัน รองรับทั้งการสำรองข้อมูลแบบสตรีมมิ่งและการสำรองข้อมูลแบบเงา (shadow copy)

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

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

การกู้คืนสามารถใช้เพื่อกู้คืนข้อมูลสำรองเพียงชุดเดียว หรือสามารถใช้เพื่อกู้คืนข้อมูลสำรองแบบเต็มชุดเดียวกับข้อมูลสำรองแบบเพิ่มทีละส่วนตั้งแต่หนึ่งชุดขึ้นไป นอกจากนี้ ยังสามารถเล่นไฟล์บันทึกที่มีอยู่ซ้ำได้ เพื่อสร้างชุดข้อมูลทั้งหมดขึ้นใหม่จนถึงธุรกรรมสุดท้ายที่บันทึกไว้ในระดับธุรกรรม 0 การกู้คืนข้อมูลสำรองสามารถทำได้บนระบบใดก็ได้ที่สามารถรองรับแอปพลิเคชันเดิมได้ ไม่จำเป็นต้องเป็นเครื่องเดียวกัน หรือแม้แต่การกำหนดค่าเครื่องเดียวกัน ตำแหน่งของไฟล์สามารถเปลี่ยนแปลงได้ในระหว่างกระบวนการกู้คืน

สำรองข้อมูลและกู้คืนไปยังฮาร์ดแวร์ต่างๆ

เมื่อสร้างฐานข้อมูล ESENT ขนาด เซกเตอร์ของดิสก์ ทางกายภาพ จะถูกจัดเก็บไว้พร้อมกับฐานข้อมูล ขนาดเซกเตอร์ทางกายภาพจะต้องคงที่ระหว่างเซสชัน มิฉะนั้นจะมีการรายงานข้อผิดพลาด เมื่อมีการโคลนไดรฟ์ทางกายภาพหรือกู้คืนจากอิมเมจไดรฟ์ไปยังไดรฟ์ที่ใช้ขนาดเซกเตอร์ทางกายภาพที่แตกต่างกัน ( ไดรฟ์ ฟอร์แมตขั้นสูง ) ESENT จะรายงานข้อผิดพลาด[ 4 ]

นี่เป็นปัญหาที่ทราบกันดีอยู่แล้ว และ Microsoft มี hot fixes ให้ใช้งาน สำหรับ Windows Vista หรือ Windows Server 2008 โปรดดู KB2470478 [ 5 ]สำหรับ Windows 7 หรือ Windows Server 2008 R2 โปรดดู KB982018 [ 6 ]

ประวัติศาสตร์

JET Blue เดิมทีได้รับการพัฒนาโดย Microsoft ในฐานะตัวเลือกการอัปเกรดสำหรับ เอ็นจิ้นฐานข้อมูล JET RedในMicrosoft Accessแต่ไม่เคยถูกนำมาใช้ในบทบาทนี้ แต่กลับถูกนำไปใช้โดย Exchange Server, Active Directory, File Replication Service (FRS), Security Configuration Editor, Certificate Services, Windows Internet Name Service (WINS) และบริการ แอปพลิเคชัน และส่วนประกอบ Windows อื่นๆ ของ Microsoft อีกมากมาย[ 7 ]เป็นเวลาหลายปีที่มันเป็น API ส่วนตัวที่ใช้โดย Microsoft เท่านั้น แต่ต่อมาได้กลายเป็น API ที่เผยแพร่ให้ทุกคนสามารถใช้งานได้

การพัฒนา Data Access Engine (DAE) เริ่มขึ้นในเดือนมีนาคม ปี 1989 เมื่อ Allen Reiter เข้าร่วมงานกับ Microsoft ในช่วงปีถัดมา ทีมพัฒนาสี่คนได้ทำงานให้กับ Allen เพื่อพัฒนา ISAM ให้เสร็จสมบูรณ์เป็นส่วนใหญ่ Microsoft มี BC7 ISAM (JET Red) อยู่แล้ว แต่เริ่มโครงการ Data Access Engine (DAE) เพื่อสร้างเอนจินฐานข้อมูลที่แข็งแกร่งกว่าเดิม เพื่อเข้าสู่สถาปัตยกรรมไคลเอ็นต์-เซิร์ฟเวอร์ที่กำลังเป็นที่นิยมในขณะนั้น ในฤดูใบไม้ผลิปี 1990 ทีม BC7 ISAM และ DAE ได้รวมกันเป็นโครงการ Joint Engine Technology (JET) ซึ่งรับผิดชอบในการผลิตเอนจินสองตัว คือ v1 ( JET Red ) และ v2 (JET Blue) ที่จะสอดคล้องกับข้อกำหนด API เดียวกัน (JET API) DAE กลายเป็น JET Blue ตามสีธงชาติอิสราเอล ส่วน BC7 ISAM กลายเป็น JET Red ตามสีธงชาติรัสเซีย แม้ว่า JET Blue และ JET Red จะเขียนขึ้นตามข้อกำหนด API เดียวกัน แต่ก็ไม่ได้ใช้โค้ด ISAM ร่วมกันเลย ทั้งสองระบบรองรับตัวประมวลผลคำสั่งค้นหาทั่วไปคือ QJET ซึ่งต่อมาเมื่อรวมกับ BC7 ISAM ก็กลายเป็นคำที่ใช้เรียกแทน JET Red ในที่สุด

JET Blue เปิดตัวครั้งแรกในปี 1994 ในฐานะ ISAM สำหรับ WINS, DHCP และ บริการ RPL ที่ปัจจุบันเลิกใช้งานแล้ว ใน Windows NT 3.5 ต่อมาได้เปิดตัวอีกครั้งในฐานะเครื่องมือจัดเก็บข้อมูลสำหรับ Microsoft Exchange ในปี 1996 บริการ Windows อื่นๆ เลือกใช้ JET Blue เป็นเทคโนโลยีจัดเก็บข้อมูล และภายในปี 2000 ทุกเวอร์ชันของ Windows ก็เริ่มมาพร้อมกับ JET Blue JET Blue ถูกใช้โดย Active Directory และกลายเป็นส่วนหนึ่งของชุดโค้ดพิเศษของ Windows ที่เรียกว่า Trusted Computing Base (TCB) จำนวนแอปพลิเคชันของ Microsoft ที่ใช้ JET Blue ยังคงเติบโตอย่างต่อเนื่อง และ API ของ JET Blue ได้รับการเผยแพร่ในปี 2005 เพื่ออำนวยความสะดวกในการใช้งานโดยแอปพลิเคชันและบริการจำนวนมากขึ้นเรื่อยๆ ทั้งภายในและภายนอก Windows

บทความใน Microsoft Exchange Web Blog [ 8 ]ระบุว่านักพัฒนาที่มีส่วนร่วมใน JET Blue ได้แก่ Cheen Liao, Stephen Hecht, Matthew Bellew, Ian Jose, Edward "Eddie" Gilbert, Kenneth Kin Lum, Balasubramanian Sriram, Jonathan Liem, Andrew Goodsell, Laurion Burchall, Andrei Marinescu, Adam Foxman, Ivan Trindev, Spencer Low และ Brett Shirley

ในเดือนมกราคม 2021 ไมโครซอฟต์ได้เปิดซอร์สโค้ด ESE [ 9 ]โดยโพสต์ลงใน GitHub ภายใต้ใบอนุญาต MIT ที่อนุญาตให้ใช้ งาน ได้อย่างอิสระ

เปรียบเทียบกับสีแดงเจ็ท

แม้ว่าจะมีสายพันธุ์ร่วมกัน แต่ JET Redและ ESE ก็มีความแตกต่างกันอย่างมาก

  • JET Red เป็นเทคโนโลยีการแชร์ไฟล์ ในขณะที่ ESE ถูกออกแบบมาเพื่อใช้งานร่วมกับแอปพลิเคชันเซิร์ฟเวอร์ และไม่ได้ทำหน้าที่แชร์ไฟล์
  • JET Red พยายามกู้คืนไฟล์อย่างเต็มที่ ในขณะที่ ESE มีการบันทึกการเขียนล่วงหน้าและการแยกสแนปช็อตเพื่อรับประกันการกู้คืนจากความเสียหาย
  • JET Red เวอร์ชันก่อน 4.0 รองรับการล็อกเฉพาะระดับหน้า ในขณะที่ ESE และ JET Red เวอร์ชัน 4.0 รองรับการล็อกระดับระเบียน
  • JET Red รองรับอินเทอร์เฟซการสืบค้นข้อมูลที่หลากหลาย รวมถึงODBCและOLE DBส่วน ESE นั้นไม่มีเอ็นจิ้นการสืบค้นข้อมูลมาให้ แต่ต้องอาศัยแอปพลิเคชันในการเขียนคำสั่งสืบค้นข้อมูลของตนเองในรูปแบบ โค้ด C ISAM
  • JET Red มีขนาดไฟล์ฐานข้อมูลสูงสุด 2 GiBในขณะที่ ESE มีขนาดไฟล์ฐานข้อมูลสูงสุด 8 TiBสำหรับหน้าข้อมูลขนาด 4 KiBและ 16 TiB สำหรับหน้าข้อมูลขนาด 8 KiB
  • เว็บไซต์อย่างเป็นทางการ
  • เอ็นจิ้นจัดเก็บข้อมูลที่ขยายได้บนGitHub
  • เครื่องมือจัดเก็บข้อมูลที่ขยายได้ - CodeProject
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Extensible_Storage_Engine&oldid=1278858802 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ เอ็นจิ้นจัดเก็บข้อมูลที่ขยายได้

Extensible Storage Engine ( ESE ) หรือที่รู้จักกันในชื่อJET Blueเป็น เทคโนโลยีการจัดเก็บข้อมูล แบบ ISAM (Indexed Sequential Access Method) จากMicrosoft ESE...

ฐานข้อมูล

ฐานข้อมูลเป็นการจัดกลุ่มข้อมูลทั้งทางกายภาพและทางตรรกะ ฐานข้อมูล ESE ดูเหมือนไฟล์เดียวสำหรับ Windows ภายในฐานข้อมูลเป็นชุดของหน้าขนาด 2, 4, 8, 16 หรือ 32 KB (ตัวเลือกหน้าขนาด 16 และ 32 KB มีเฉพาะใน Windows 7 และ Exchange 2010 เท่านั้น) [ 1 ]...

ตาราง

ตารางคือกลุ่มของระเบียนที่มีรูปแบบเดียวกัน โดยแต่ละระเบียนจะมีชุดคอลัมน์เหมือนกัน ตารางแต่ละตารางจะถูกระบุด้วยชื่อตาราง ซึ่งมีขอบเขตการใช้งานเฉพาะภายในฐานข้อมูลที่ตารางนั้นอยู่...

บันทึกและคอลัมน์

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