Tenho uma tabela com as seguintes colunas:
CREATE TABLE example (
exid INT,
extype INT,
studentid INT,
(more columns)
)
A tabela terá centenas de milhares de linhas e cada registro terá valores distintos de exid, extype e studentid. Enquanto Studentid e Exid terão muitos valores distintos, Extype terá max. 6 valores. A tabela será unida da seguinte maneira:
SELECT ...
FROM example ex
LEFT JOIN otherTable1 ot1 ON ex.studentid = ot1.studentid
AND ex.exid = ot1.exid
AND ex.extype = 1
LEFT JOIN otherTable2 ot2 ON ex.studentid = ot2.studentid
AND ex.exid = ot2.exid
AND ex.extype = 2
Você pode me sugerir quais Ãndices na tabela de exemplo serão os mais adequados em relação ao desempenho aqui (também devo adicionar outras tabelas usadas para junções que entrarão em milhões de linhas)?
Você deve compará-lo usando o autotrace ( http://betteratoracle.com/posts/10-using-autotrace ), por exemplo.
Se você espera que milhões de linhas sejam retornadas, não acho que a indexação ajudará em nada. Varredura simples de tabela completa e junção de hash é a maneira mais eficiente de executar esse tipo de consulta ( https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:9422487749968 ) .
Colocar a coluna menos seletiva primeiro e usar a compactação de chave pode diminuir o tamanho do Ãndice e reduzir o consumo de E/S e CPU ( http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID :8806017524595 ).
O Ãndice a seguir deve ser suficiente se você buscar apenas algumas linhas: