การใช้ UPDATE, DELETE หรือ INSERT เพื่อย้ายข้อมูลอาจใช้เวลาค่อนข้างนานและใช้ทรัพยากร (IO) ทั้งข้อมูลและล็อกไฟล์ / ดิสก์ มีความเป็นไปได้ที่จะหลีกเลี่ยงการกรอกบันทึกธุรกรรมที่มีจำนวนระเบียนที่อาจเกิดขึ้นในขณะที่ทำงานบนตารางขนาดใหญ่: การใช้การสลับพาร์ติชันเฉพาะข้อมูลเมตาเท่านั้นที่เปลี่ยนไป
ไม่มีการเคลื่อนไหวของข้อมูลที่เกี่ยวข้องดังนั้นจึงดำเนินการได้อย่างรวดเร็ว (เกือบจะทันที)
ตารางตัวอย่าง
คำถามไม่แสดงตารางต้นฉบับ DDL DDL ต่อไปนี้จะใช้เป็นตัวอย่างในคำตอบนี้:
CREATE TABLE dbo.idT(
id int not null
, uid uniqueidentifier not null
, name varchar(50)
);
ALTER TABLE dbo.idT ADD CONSTRAINT PK_idT PRIMARY KEY CLUSTERED(id);
มีการเพิ่มรหัสสุ่ม dummy ครึ่งโหลจาก 0 ถึง 15 ด้วยแบบสอบถามนี้:
WITH ids(n) AS(
SELECT x1.n+x2.n*4
FROM (values(0), (3)) as x1(n)
CROSS JOIN (values(0), (2), (3)) as x2(n)
)
INSERT INTO idt(id, uid, name)
SELECT n, NEWID(), NEWID()
FROM ids
ตัวอย่างข้อมูลใน IdT
id uid name
0 65533096-5007-43EA-88AD-D6776B3B94FA 6A69D4F2-D682-4168-A92F-4CD2E2DBC21D
3 CE87F1ED-BE1A-4F2D-8D62-E1ECA822D35B AF0524D9-0DBB-41E1-883B-003CB4E4F012
8 34A1DBFD-4F92-4F34-9F04-4CDC824AB15A 02B4BDA4-D515-4262-9031-0BE496AC24CE
11 51606C95-9DE8-4C30-B23B-F915EEA41156 93258103-9C22-4F9C-85CF-712ED0FB3CE6
12 CEC80431-0513-4751-A250-0EB3390DACAB 2DA6B8AF-3EBC-42B3-A76C-028716E24661
15 5037EA83-286F-4EBC-AD7C-E237B570C1FF 095E51E9-8C38-4104-858F-D14AA810A550
สร้างตารางใหม่ด้วย IDENTITY(0, 1)
ปัญหาเดียวกับidT
คือการขาดIDENTITY(0, 1)
คุณสมบัติใน id ตารางใหม่ที่มีโครงสร้างคล้ายกันและIDENTITY(0, 1)
ถูกสร้างขึ้น:
CREATE TABLE dbo.idT_Switch(
id int identity(0, 1) not null
, uid uniqueidentifier not null
, name varchar(50)
);
ALTER TABLE dbo.idT_Switch ADD CONSTRAINT PK_idT_Switch PRIMARY KEY CLUSTERED(id);
นอกเหนือจากIDENTITY(0, 1)
, เป็นเหมือนidT_Switch
idT
กุญแจต่างประเทศ
idT
ต้องลบกุญแจต่างประเทศเพื่ออนุญาตให้ใช้เทคนิคนี้
สวิตช์พาร์ติชั่น
idT
และidT_Switch
ตารางมีโครงสร้างที่รองรับ แทนการใช้DELETE
, UPDATE
และINSERT
งบที่จะย้ายแถวจากidT
ไปidT_Switch
หรือในidT
ตัวเองALTER TABLE ... SWITCH
สามารถนำมาใช้:
ALTER TABLE dbo.idT
SWITCH TO dbo.idT_Switch;
'พาร์ติชัน' เดียวของPK_idT
(ทั้งตาราง) ถูกย้ายไปที่PK_idT_Switch
(และในทางกลับกัน) idT
ตอนนี้มี 0 แถวและidT_Switch
มี 6 แถว
คุณสามารถดูรายการทั้งหมดของแหล่งที่มาและข้อกำหนดความเข้ากันได้ของปลายทางที่นี่:
การถ่ายโอนข้อมูลอย่างมีประสิทธิภาพโดยใช้การสลับพาร์ติชัน
หมายเหตุการใช้งานSWITCH
นี้ไม่ต้องการ Enterprise Edition เพราะไม่มีการแบ่งพาร์ติชันอย่างชัดเจน ตารางที่ไม่แบ่งพาร์ติชันถือเป็นตารางที่มีพาร์ติชันเดียวจาก SQL Server 2005 เป็นต้นไป
แทนที่ idT
idT
ตอนนี้ว่างเปล่าและไร้ประโยชน์และสามารถทิ้ง:
DROP TABLE idT;
idT_Switch
สามารถเปลี่ยนชื่อและจะแทนที่idT
ตารางเก่า:
EXECUTE sys.sp_rename
@objname = N'dbo.idT_Switch',
@newname = N'idT', -- note lack of schema prefix
@objtype = 'OBJECT';
กุญแจต่างประเทศ
สามารถเพิ่มกุญแจต่างประเทศได้อีกครั้งในidT
ตารางใหม่ สิ่งอื่นใดที่ถูกลบไปก่อนหน้านี้idT
เพื่อให้ตารางที่เข้ากันได้สำหรับการสลับจะต้องทำซ้ำ
reseed
SELECT IDENT_CURRENT( 'dbo.idT');
คำสั่งนี้ส่งคืน 0 ตาราง idT มี 6 แถวพร้อม MAX (id) = 15. สามารถใช้DBCC CHECKIDENT (table_name) :
DBCC CHECKIDENT ('dbo.idT');
เนื่องจาก 15 มีค่ามากกว่า 0 จึงจะดำเนินการใหม่โดยอัตโนมัติโดยไม่ต้องค้นหา MAX (id):
หากค่าข้อมูลประจำตัวปัจจุบันสำหรับตารางน้อยกว่าค่าข้อมูลประจำตัวสูงสุดที่เก็บไว้ในคอลัมน์ข้อมูลระบุค่าจะถูกรีเซ็ตโดยใช้ค่าสูงสุดในคอลัมน์ข้อมูลประจำตัว ดูส่วน 'ข้อยกเว้น' ที่ตามมา
IDENT_CURRENT ตอนนี้ผลตอบแทนที่15
ทดสอบและเพิ่มข้อมูล
INSERT
คำสั่งง่ายๆ:
INSERT INTO idT(uid, name) SELECT NEWID(), NEWID();
เพิ่มแถวนี้:
id uid name
16 B395D692-5D7B-4DFA-9971-A1497B8357A1 FF210D9E-4027-479C-B5D8-057E77FAF378
id
คอลัมน์ตอนนี้ใช้ตัวตนและมูลค่าแทรกใหม่แน่นอน 16 (15 + 1)
ข้อมูลมากกว่านี้
มีคำถามและคำตอบที่เกี่ยวข้องกับพื้นหลังเพิ่มเติมเกี่ยวกับSWITCH
เทคนิคที่นี่:
เหตุใดจึงลบคุณสมบัติเอกลักษณ์ในคอลัมน์ไม่ได้รับการสนับสนุน
IDENTITY
อะไร