Teradata - JOIN Index
JOIN INDEX to zmaterializowany widok. Jego definicja jest trwale przechowywana, a dane są aktualizowane za każdym razem, gdy aktualizowane są tabele podstawowe, do których odnosi się indeks łączenia. JOIN INDEX może zawierać jedną lub więcej tabel, a także wstępnie zagregowane dane. Indeksy złączeń służą głównie do poprawiania wydajności.
Dostępne są różne typy indeksów złączeń.
- Indeks łączenia pojedynczej tabeli (STJI)
- Wskaźnik łączenia wielu tabel (MTJI)
- Aggregated Join Index (AJI)
Indeks łączenia pojedynczej tabeli
Indeks łączenia pojedynczej tabeli umożliwia podzielenie dużej tabeli na podstawie innych kolumn indeksu podstawowego niż ta z tabeli podstawowej.
Składnia
Poniżej znajduje się składnia JOIN INDEX.
CREATE JOIN INDEX <index name>
AS
<SELECT Query>
<Index Definition>;
Przykład
Weź pod uwagę poniższe tabele pracowników i wynagrodzeń.
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);
Poniżej znajduje się przykład, który tworzy indeks Join o nazwie Employee_JI w tabeli Employee.
CREATE JOIN INDEX Employee_JI
AS
SELECT EmployeeNo,FirstName,LastName,
BirthDate,JoinedDate,DepartmentNo
FROM Employee
PRIMARY INDEX(FirstName);
Jeśli użytkownik wyśle zapytanie z klauzulą WHERE w polu EmployeeNo, system wyśle zapytanie do tabeli Employee przy użyciu unikalnego indeksu podstawowego. Jeśli użytkownik zapyta tabelę pracowników używając nazwa_pracownika, wtedy system może uzyskać dostęp do indeksu dołączenia Employee_JI używając Employee_name. Wiersze indeksu złączenia są haszowane w kolumnie nazwa_pracownika. Jeśli indeks łączenia nie jest zdefiniowany, a nazwa_pracownika nie jest zdefiniowana jako indeks pomocniczy, system wykona pełne skanowanie tabeli w celu uzyskania dostępu do wierszy, co jest czasochłonne.
Możesz uruchomić następujący plan EXPLAIN i zweryfikować plan optymalizacji. W poniższym przykładzie widać, że optymalizator używa indeksu łączenia zamiast podstawowej tabeli Employee, gdy tabela wysyła zapytanie za pomocą kolumny 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.
Indeks łączenia wielu tabel
Indeks łączenia wielu tabel jest tworzony przez połączenie więcej niż jednej tabeli. Indeks łączenia wielu tabel może służyć do przechowywania zestawu wyników często łączonych tabel w celu poprawy wydajności.
Przykład
Poniższy przykład tworzy JOIN INDEX o nazwie Employee_Salary_JI, łącząc tabele Employee i 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);
Za każdym razem, gdy aktualizowane są podstawowe tabele Pracownik lub Wynagrodzenie, automatycznie aktualizowany jest również indeks Dołącz do Employee_Salary_JI. Jeśli uruchamiasz zapytanie łączące tabele pracowników i wynagrodzeń, optymalizator może wybrać bezpośredni dostęp do danych z Employee_Salary_JI zamiast dołączać do tabel. Plan EXPLAIN zapytania może być użyty do sprawdzenia, czy optymalizator wybierze tabelę bazową lub indeks sprzężenia.
Indeks łącznych połączeń
Jeśli tabela jest konsekwentnie agregowana w określonych kolumnach, można zdefiniować indeks łączenia zagregowanego w tabeli, aby poprawić wydajność. Jednym z ograniczeń indeksu łączenia zagregowanego jest to, że obsługuje on tylko funkcje SUMA i COUNT.
Przykład
W poniższym przykładzie pracownik i wynagrodzenie są łączone, aby określić łączne wynagrodzenie na dział.
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);