Учебники

Teradata — Индекс JOIN

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 для таблицы Employee.

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

Если пользователь отправляет запрос с предложением WHERE в EmployeeNo, то система запросит таблицу Employee, используя уникальный первичный индекс. Если пользователь запрашивает таблицу сотрудников, используя employee_name, тогда система может получить доступ к индексу соединения Employee_JI, используя employee_name. Строки индекса соединения хэшируются в столбце employee_name. Если индекс соединения не определен, а имя сотрудника не определено как вторичный индекс, тогда система выполнит полное сканирование таблицы, чтобы получить доступ к строкам, которые занимают много времени.

Вы можете запустить следующий план EXPLAIN и проверить план оптимизатора. В следующем примере вы можете видеть, что оптимизатор использует индекс соединения вместо базовой таблицы Employee, когда таблица запрашивает с использованием столбца 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 путем объединения таблиц Employee и Salary.

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, индекс соединения Employee_Salary_JI также автоматически обновляется. Если вы выполняете запрос, соединяющий таблицы Employee и Salary, оптимизатор может выбрать прямой доступ к данным из Employee_Salary_JI, а не к таблицам. План EXPLAIN по запросу можно использовать для проверки того, выберет ли оптимизатор базовую таблицу или индекс соединения.

Совокупный индекс присоединения

Если таблица последовательно агрегируется в определенных столбцах, то для повышения производительности можно определить агрегированный индекс соединения. Одним из ограничений агрегатного индекса соединения является то, что он поддерживает только функции SUM и COUNT.

пример

В следующем примере Сотрудник и Зарплата объединяются для определения общей заработной платы по отделу.