ฉันทำงานกับ SQL Server และ Oracle อาจมีข้อยกเว้นบางอย่าง แต่สำหรับแพลตฟอร์มเหล่านั้นคำตอบทั่วไปคือข้อมูลและดัชนีจะได้รับการปรับปรุงในเวลาเดียวกัน
ฉันคิดว่ามันจะมีประโยชน์ในการวาดความแตกต่างระหว่างเมื่อดัชนีมีการปรับปรุงสำหรับช่วงที่เป็นเจ้าของการทำธุรกรรมและช่วงอื่น ๆ ตามค่าเริ่มต้นเซสชันอื่น ๆ จะไม่เห็นดัชนีที่อัปเดตจนกว่าจะมีการทำธุรกรรม อย่างไรก็ตามเซสชันที่เป็นเจ้าของการทำธุรกรรมจะเห็นดัชนีที่อัพเดตทันที
สำหรับวิธีหนึ่งในการคิดเกี่ยวกับมันให้พิจารณาที่โต๊ะที่มีคีย์หลัก ใน SQL Server และ Oracle สิ่งนี้ถูกนำไปใช้เป็นดัชนี เวลาส่วนใหญ่ที่เราต้องการให้มีข้อผิดพลาดทันทีหากมีการINSERT
ทำซึ่งจะเป็นการละเมิดคีย์หลัก เพื่อที่จะเกิดขึ้นดัชนีจะต้องปรับปรุงในเวลาเดียวกันกับข้อมูล โปรดทราบว่าแพลตฟอร์มอื่น ๆ เช่น Postgres อนุญาตข้อ จำกัด รอการตัดบัญชีซึ่งจะถูกตรวจสอบเฉพาะเมื่อมีการทำธุรกรรม
นี่คือตัวอย่างของ Oracle ฉบับย่อที่แสดงกรณีทั่วไป:
CREATE TABLE X_TABLE (PK INT NULL, PRIMARY KEY (PK));
INSERT INTO X_TABLE VALUES (1);
INSERT INTO X_TABLE VALUES (1); -- no commit
INSERT
คำสั่งที่สองส่งข้อผิดพลาด:
ข้อผิดพลาด SQL: ORA-00001: ข้อ จำกัด ที่ไม่ซ้ำกัน (XXXXXX.SYS_C00384850) ละเมิด
00001.
00000 - "ละเมิดข้อ จำกัด ที่ไม่ซ้ำกัน (% s.% s) ที่ละเมิด"
* สาเหตุ: คำสั่ง UPDATE หรือ INSERT พยายามแทรกคีย์ที่ซ้ำกัน สำหรับ Trusted Oracle ที่กำหนดค่าในโหมด DBMS MAC คุณอาจเห็นข้อความนี้หากมีรายการที่ซ้ำกันอยู่ในระดับที่แตกต่างกัน
* การกระทำ: ลบข้อ จำกัด ที่ไม่ซ้ำกันหรือไม่ใส่รหัส
หากคุณต้องการดูการดำเนินการปรับปรุงดัชนีด้านล่างนี้เป็นการสาธิตอย่างง่ายใน SQL Server ขั้นแรกสร้างตารางสองคอลัมน์ที่มีหนึ่งล้านแถวและดัชนีแบบไม่รวมกลุ่มในVAL
คอลัมน์:
DROP TABLE IF EXISTS X_TABLE_IX;
CREATE TABLE X_TABLE_IX (
ID INT NOT NULL,
VAL VARCHAR(10) NOT NULL
PRIMARY KEY (ID)
);
CREATE INDEX X_INDEX ON X_TABLE_IX (VAL);
-- insert one million rows with N from 1 to 1000000
INSERT INTO X_TABLE_IX
SELECT N, N FROM dbo.Getnums(1000000);
แบบสอบถามต่อไปนี้สามารถใช้ดัชนี nonclustered เนื่องจากดัชนีเป็นดัชนีครอบคลุมสำหรับแบบสอบถามนั้น มันมีข้อมูลทั้งหมดที่จำเป็นในการดำเนินการ ตามที่คาดไว้ไม่มีการส่งคืน
SELECT *
FROM X_TABLE_IX
WHERE VAL = 'A';
ทีนี้มาเริ่มทรานแซคชันและอัพเดทVAL
แถวเกือบทั้งหมดในตาราง:
BEGIN TRANSACTION
UPDATE X_TABLE_IX
SET VAL = 'A'
WHERE ID <> 1;
นี่เป็นส่วนหนึ่งของแผนแบบสอบถามสำหรับสิ่งนั้น:
วงกลมสีแดงคือการปรับปรุงดัชนีที่ไม่คลัสเตอร์ วงกลมสีน้ำเงินแสดงถึงการปรับปรุงดัชนีคลัสเตอร์ซึ่งเป็นข้อมูลพื้นฐานของตาราง แม้ว่าธุรกรรมนั้นยังไม่ได้รับการยืนยัน แต่เราเห็นว่าข้อมูลและดัชนีนั้นได้รับการปรับปรุงในส่วนของการดำเนินการของแบบสอบถาม โปรดทราบว่าคุณจะไม่เห็นสิ่งนี้เสมอในแผนขึ้นอยู่กับขนาดของข้อมูลที่เกี่ยวข้องพร้อมกับปัจจัยอื่น ๆ
ด้วยการทำธุรกรรมยังไม่ได้รับการยอมรับมาทบทวนSELECT
แบบสอบถามจากด้านบน
SELECT *
FROM X_TABLE_IX
WHERE VAL = 'A';
เครื่องมือเพิ่มประสิทธิภาพการสืบค้นยังคงสามารถใช้ดัชนีได้และในครั้งนี้คาดว่าจะมีการส่งคืนแถว 999999 การดำเนินการแบบสอบถามส่งคืนผลลัพธ์ที่คาดหวัง
นั่นเป็นตัวอย่างที่ง่าย แต่หวังว่ามันจะเคลียร์สิ่งต่าง ๆ ออกไปเล็กน้อย
นอกจากนี้ฉันทราบว่ามีบางกรณีที่อาจเป็นที่ถกเถียงกันอยู่ว่าดัชนีไม่ได้รับการอัพเดตทันที สิ่งนี้ทำเพื่อเหตุผลด้านประสิทธิภาพและผู้ใช้ไม่ควรเห็นข้อมูลที่ไม่สอดคล้องกัน ตัวอย่างเช่นการลบบางครั้งจะไม่ถูกนำไปใช้กับดัชนีใน SQL Server อย่างสมบูรณ์ กระบวนการพื้นหลังทำงานและล้างข้อมูลในที่สุด คุณสามารถอ่านเกี่ยวกับบันทึกผีหากคุณอยากรู้