Teradata - เข้าร่วมดัชนี

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

มีดัชนีการเข้าร่วมประเภทต่างๆ

  • ดัชนีการเข้าร่วมตารางเดียว (STJI)
  • ดัชนีการเข้าร่วมหลายตาราง (MTJI)
  • ดัชนีการเข้าร่วมรวม (AJI)

ดัชนีการเข้าร่วมตารางเดียว

ดัชนีการเข้าร่วมตารางเดียวอนุญาตให้แบ่งตารางขนาดใหญ่โดยยึดตามคอลัมน์ดัชนีหลักที่แตกต่างจากตารางฐาน

ไวยากรณ์

ต่อไปนี้เป็นไวยากรณ์ของ JOIN INDEX

CREATE JOIN INDEX <index name> 
AS 
<SELECT Query> 
<Index Definition>;

ตัวอย่าง

พิจารณาตารางพนักงานและเงินเดือนต่อไปนี้

CREATE SET TABLE EMPLOYEE,FALLBACK ( 
   EmployeeNo INTEGER, 
   FirstName VARCHAR(30) , 
   LastName VARCHAR(30) , 
   DOB DATE FORMAT 'YYYY-MM-DD', 
   JoinedDate DATE FORMAT 'YYYY-MM-DD', 
   DepartmentNo BYTEINT 
) 
UNIQUE PRIMARY INDEX ( EmployeeNo );

CREATE SET TABLE SALARY,FALLBACK ( 
   EmployeeNo INTEGER, 
   Gross INTEGER, 
   Deduction INTEGER, 
   NetPay INTEGER 
) 
PRIMARY INDEX ( EmployeeNo ) 
UNIQUE INDEX (EmployeeNo);

ต่อไปนี้เป็นตัวอย่างที่สร้างดัชนีเข้าร่วมชื่อ Employee_JI บนตารางพนักงาน

CREATE JOIN INDEX Employee_JI 
AS 
SELECT EmployeeNo,FirstName,LastName, 
BirthDate,JoinedDate,DepartmentNo 
FROM Employee 
PRIMARY INDEX(FirstName);

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

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

EXPLAIN SELECT * FROM EMPLOYEE WHERE FirstName='Mike'; 
*** Help information returned. 8 rows. 
*** Total elapsed time was 1 second. 
Explanation 
------------------------------------------------------------------------ 
   1) First, we do a single-AMP RETRIEVE step from EMPLOYEE_JI by 
      way of the primary index "EMPLOYEE_JI.FirstName = 'Mike'" 
      with no residual conditions into Spool 1 (one-amp), which is built 
      locally on that AMP.  The size of Spool 1 is estimated with low 
      confidence to be 2 rows (232 bytes).  The estimated time for this 
      step is 0.02 seconds.
   → The contents of Spool 1 are sent back to the user as the result of 
      statement 1.  The total estimated time is 0.02 seconds.

ดัชนีการเข้าร่วมหลายตาราง

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

ตัวอย่าง

ตัวอย่างต่อไปนี้สร้าง JOIN INDEX ชื่อ Employee_Salary_JI โดยการเข้าร่วมตารางพนักงานและเงินเดือน

CREATE JOIN INDEX Employee_Salary_JI 
AS 
SELECT a.EmployeeNo,a.FirstName,a.LastName, 
a.BirthDate,a.JoinedDate,a.DepartmentNo,b.Gross,b.Deduction,b.NetPay 
FROM Employee a 
INNER JOIN Salary b 
ON(a.EmployeeNo = b.EmployeeNo) 
PRIMARY INDEX(FirstName);

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

ดัชนีการเข้าร่วมโดยรวม

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

ตัวอย่าง

ในตัวอย่างต่อไปนี้พนักงานและเงินเดือนจะถูกรวมเข้าด้วยกันเพื่อระบุเงินเดือนรวมต่อแผนก

CREATE JOIN INDEX Employee_Salary_JI 
AS 
SELECT a.DepartmentNo,SUM(b.NetPay) AS TotalPay 
FROM Employee a 
INNER JOIN Salary b 
ON(a.EmployeeNo = b.EmployeeNo)
GROUP BY a.DepartmentNo 
Primary Index(DepartmentNo);