Teradata - Índice JOIN
JOIN INDEX é uma visão materializada. Sua definição é armazenada permanentemente e os dados são atualizados sempre que as tabelas base referenciadas no índice de junção são atualizadas. JOIN INDEX pode conter uma ou mais tabelas e também conter dados pré-agregados. Os índices de junção são usados principalmente para melhorar o desempenho.
Existem diferentes tipos de índices de junção disponíveis.
- Índice de junção de tabela única (STJI)
- Índice de junção de múltiplas mesas (MTJI)
- Índice de junção agregado (AJI)
Índice de junção de mesa única
O índice Single Table Join permite particionar uma grande tabela com base nas diferentes colunas de índice primário do que a da tabela base.
Sintaxe
A seguir está a sintaxe de um JOIN INDEX.
CREATE JOIN INDEX <index name>
AS
<SELECT Query>
<Index Definition>;
Exemplo
Considere as seguintes tabelas de funcionários e salários.
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);
A seguir está um exemplo que cria um índice de junção denominado Employee_JI na tabela Employee.
CREATE JOIN INDEX Employee_JI
AS
SELECT EmployeeNo,FirstName,LastName,
BirthDate,JoinedDate,DepartmentNo
FROM Employee
PRIMARY INDEX(FirstName);
Se o usuário enviar uma consulta com uma cláusula WHERE em EmployeeNo, o sistema consultará a tabela Employee usando o índice primário exclusivo. Se o usuário consultar a tabela de funcionários usando nome_de_funcionário, então o sistema pode acessar o índice de junção Employee_JI usando nome_de_funcionário. As linhas do índice de junção são hash na coluna employee_name. Se o índice de junção não estiver definido e o employee_name não estiver definido como índice secundário, o sistema executará uma varredura completa da tabela para acessar as linhas, o que é demorado.
Você pode executar o seguinte plano EXPLAIN e verificar o plano otimizador. No exemplo a seguir, você pode ver que o otimizador está usando o índice de junção em vez da tabela base Employee quando a tabela consulta usando a coluna 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.
Índice de junção de múltiplas mesas
Um índice de junção de várias tabelas é criado juntando mais de uma tabela. O índice de junção de várias tabelas pode ser usado para armazenar o conjunto de resultados de tabelas frequentemente associadas para melhorar o desempenho.
Exemplo
O exemplo a seguir cria um JOIN INDEX denominado Employee_Salary_JI unindo as tabelas Employee e 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);
Sempre que as tabelas base Employee ou Salary são atualizadas, o índice Join Employee_Salary_JI também é atualizado automaticamente. Se você estiver executando uma consulta juntando as tabelas Employee e Salary, o otimizador pode escolher acessar os dados de Employee_Salary_JI diretamente em vez de juntar as tabelas. O plano EXPLAIN na consulta pode ser usado para verificar se o otimizador escolherá a tabela base ou o índice de junção.
Índice de junção agregado
Se uma tabela for agregada de forma consistente em certas colunas, o índice de junção agregado pode ser definido na tabela para melhorar o desempenho. Uma limitação do índice de junção agregado é que ele suporta apenas as funções SUM e COUNT.
Exemplo
No exemplo a seguir, Funcionário e Salário são unidos para identificar o salário total por Departamento.
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);