SAP บทช่วยสอน HANA: สร้างลำดับ

⚡ สรุปอย่างชาญฉลาด

สร้างลำดับใน SAP HANA มีอ็อบเจ็กต์ฐานข้อมูลที่สร้างรายการค่าตัวเลขที่เพิ่มขึ้นโดยอัตโนมัติ พารามิเตอร์จะควบคุมค่าเริ่มต้น การเพิ่มขึ้น ขีดจำกัด การวนรอบ และพฤติกรรมการแคชของตัวสร้างนี้

  • 🔢 คำจำกัดความหลัก: ลำดับตัวเลขจะสร้างตัวเลขตามกฎที่กำหนดไว้ในข้อกำหนด ไม่ว่าจะเป็นลำดับจากน้อยไปมากหรือจากมากไปน้อย
  • 🔗 ไม่มีการผูกตาราง: ลำดับ (Sequences) เป็นวัตถุอิสระที่แอปพลิเคชันใช้งานโดยไม่ผูกติดกับตารางใดๆ
  • 📍 สองค่า: CURRVAL จะส่งคืนค่าปัจจุบัน และ NEXTVAL จะเลื่อนไปยังค่าถัดไปและส่งคืนค่าใหม่
  • 🎚️ พารามิเตอร์ที่สำคัญ: START WITH, INCREMENT BY, MAXVALUE, MINVALUE, CYCLE และ CACHE ใช้ในการกำหนดรูปแบบของผลลัพธ์
  • ♻️ ขี่จักรยาน: คำสั่ง CYCLE จะเริ่มต้นการนับเลขใหม่เมื่อถึงขีดจำกัด ส่วนคำสั่ง NO CYCLE เป็นค่าเริ่มต้นและจะทำให้เกิดข้อผิดพลาดแทน
  • เก็บเอาไว้: CACHE จะสงวนบล็อกหมายเลขต่อโหนดเพื่อเพิ่มความเร็ว ส่วน NO CACHE คือค่าเริ่มต้น
  • 🔄 ตัวเลือกการรีเซ็ต: คำสั่ง RESET BY จะเรียกใช้ซับเควรีเมื่อฐานข้อมูลเริ่มต้นใหม่ และจะดำเนินการต่อจากค่าที่ส่งกลับมา

สร้างลำดับใน SAP HANA

ลำดับคืออะไร?

ลำดับคือออบเจ็กต์ฐานข้อมูลที่สร้างรายการค่าตัวเลขที่เพิ่มขึ้นโดยอัตโนมัติตามกฎที่ระบุในข้อกำหนดเฉพาะของลำดับ

ตัวอย่างเช่น ในการแทรกหมายเลขพนักงานโดยอัตโนมัติในคอลัมน์ (EMPLOYEE_NO) ของตาราง เมื่อมีการแทรกบันทึกใหม่ในตาราง เราจะใช้ลำดับ

ค่าลำดับจะถูกสร้างขึ้นตามลำดับจากน้อยไปหามากหรือจากมากไปหาน้อย

ลำดับไม่เกี่ยวข้องกับตาราง แอปพลิเคชันเหล่านั้นถูกใช้ มีสองค่าตามลำดับ -

  • CURRVAL – ระบุค่าปัจจุบันของลำดับ
  • NEXTVAL – ระบุค่าถัดไปของลำดับ

ซิงค์

CREATE SEQUENCE <sequence_name> [<sequence_parameter_list>] [RESET BY <subquery>]

องค์ประกอบไวยากรณ์

ELEMENTS DESCRIPTION
มันคือชื่อของลำดับ
- - โดยจะระบุพารามิเตอร์ลำดับตั้งแต่หนึ่งรายการขึ้นไป
เริ่มกับ มันอธิบายค่าลำดับเริ่มต้น
เพิ่มขึ้นโดย นี่เป็นการระบุค่าที่จะเพิ่มจากค่าสุดท้ายที่กำหนดในแต่ละครั้งเมื่อสร้างค่าลำดับใหม่ ค่าเริ่มต้นคือ 1
MAXVALUE นี่เป็นการระบุค่าสูงสุดที่ลำดับสามารถสร้างได้ ค่าอาจอยู่ระหว่าง -4611686018427387903 และ 4611686018427387902
ไม่มีค่าสูงสุด เมื่อระบุ NO MAXVALUE สำหรับลำดับที่เพิ่มขึ้น ค่าสูงสุดจะเป็น 4611686018427387903 และค่าต่ำสุดสำหรับลำดับที่ลดลงจะเป็น -1
มินแวล / ไม่มีมูลค่าขั้นต่ำ ระบุค่าต่ำสุดที่ลำดับนั้นสามารถสร้างได้ ค่าจะอยู่ระหว่าง -4611686018427387904 และ 4611686018427387902 เมื่อใช้ NO MINVALUE ค่าต่ำสุดสำหรับลำดับที่เพิ่มขึ้นคือ 1
รอบ คำสั่ง CYCLE ระบุว่าหมายเลขลำดับจะเริ่มต้นใหม่หลังจากถึงค่าสูงสุดหรือค่าต่ำสุดแล้ว
ไม่มีวงจร ตัวเลือกเริ่มต้น คำสั่ง NO CYCLE ระบุว่าหมายเลขลำดับจะไม่เริ่มต้นใหม่หลังจากถึงค่าสูงสุดหรือค่าต่ำสุดแล้ว
แคช ขนาดแคชจะระบุช่วงหมายเลขลำดับที่จะถูกแคชไว้ในโหนด ต้องเป็นจำนวนเต็มที่ไม่ติดลบ
ไม่มีแคช ตัวเลือกเริ่มต้น คำสั่ง NO CACHE ระบุว่าหมายเลขลำดับจะไม่ถูกแคชไว้ในโหนด
รีเซ็ตโดย โดยระบุว่าในระหว่างการรีสตาร์ทฐานข้อมูล ฐานข้อมูลจะดำเนินการโดยอัตโนมัติ และค่าลำดับจะรีสตาร์ทด้วยค่าที่ส่งคืน

ตัวอย่าง -

เราจะสร้างลำดับที่มีชื่อว่า DHK_SCHEMA.EMP_NO ซึ่งจะสร้างค่าที่เพิ่มขึ้นของลำดับ +1 ในแต่ละครั้งเมื่อมีการใช้ลำดับ

สคริปต์ลำดับ –

CREATE SEQUENCE DHK_SCHEMA.EMP_NO START WITH 100 INCREMENT BY 1;

ที่นี่เราจะใช้วัตถุ "ลำดับ" ในตัวอย่างด้านล่างเพื่อเพิ่มมูลค่าของพนักงานไม่ +1 แต่ละครั้งที่มีการดำเนินการแบบสอบถามแบบใช้เลือกข้อมูล ในแบบสอบถาม สามารถใช้ "nextval" สำหรับการสร้างหมายเลขซีเรียลหรือข้อกำหนดประเภทเดียวกันได้

การใช้ลำดับ –

SELECT DHK_SCHEMA.EMP_NO.nextval FROM DUMMY;

ผลลัพธ์ – 100, 101, 102 … และอื่นๆ สำหรับทุกการเรียกใช้คำสั่ง select ข้างต้น

วิธีการใช้ลำดับในตาราง

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

1) เรียกใช้ NEXTVAL โดยตรงในคำสั่ง INSERT วิธีการที่ชัดเจนที่สุด คือ แอปพลิเคชันจะเป็นผู้ตัดสินใจว่าจะใช้หมายเลขนั้นเมื่อใด

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE (
  EMPLOYEE_NO INTEGER NOT NULL,
  EMP_NAME    NVARCHAR(100),
  PRIMARY KEY (EMPLOYEE_NO)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE
  VALUES (DHK_SCHEMA.EMP_NO.NEXTVAL, 'Anita Sharma');

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

CREATE COLUMN TABLE DHK_SCHEMA.EMPLOYEE2 (
  EMPLOYEE_NO INTEGER DEFAULT DHK_SCHEMA.EMP_NO.NEXTVAL,
  EMP_NAME    NVARCHAR(100)
);

INSERT INTO DHK_SCHEMA.EMPLOYEE2 (EMP_NAME) VALUES ('Ravi Kumar');

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

SELECT DHK_SCHEMA.EMP_NO.CURRVAL FROM DUMMY;

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

ลำดับเทียบกับคอลัมน์เอกลักษณ์

SAP HANA ยังมีคอลัมน์ระบุตัวตน (identity column) ซึ่งสร้างตัวเลขโดยไม่ต้องมีอ็อบเจ็กต์แยกต่างหาก ทั้งสองวิธีนี้แก้ปัญหาเดียวกันแต่ใช้วิธีการที่แตกต่างกัน

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

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

การจัดการลำดับ: ALTER, DROP และช่องว่าง

ลำดับขั้นตอนต่างๆ มักไม่คงเดิมเหมือนตอนแรกที่สร้างไว้ มีงานบำรุงรักษาอยู่สามอย่างที่เกิดขึ้นซ้ำๆ

การเปลี่ยนแปลงพฤติกรรม คำสั่ง ALTER SEQUENCE จะปรับค่าเพิ่มขึ้น ขีดจำกัด หรือรอบการทำงานของลำดับที่มีอยู่โดยไม่ทำให้ลำดับนั้นหายไปping คำสั่ง RESTART WITH จะรีเซ็ตตัวนับ ซึ่งเป็นขั้นตอนปกติหลังจากโหลดข้อมูลทดสอบใหม่

ALTER SEQUENCE DHK_SCHEMA.EMP_NO RESTART WITH 1000;
ALTER SEQUENCE DHK_SCHEMA.EMP_NO INCREMENT BY 10;
DROP SEQUENCE DHK_SCHEMA.EMP_NO;

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

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

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

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

คำถามที่พบบ่อย

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

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

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

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

เนื่องจากฟังก์ชัน NEXTVAL ยังไม่ได้ถูกเรียกใช้ในเซสชันปัจจุบัน ฟังก์ชัน CURRVAL จึงรายงานค่าที่ส่งไปยังเซสชันนี้ ดังนั้นจึงไม่มีอะไรให้รายงานจนกว่าจะมีการเรียกใช้ฟังก์ชันดังกล่าว

สรุปโพสต์นี้ด้วย: