Em relação à ordem de execução da instrução Select no Sql, pouca atenção tem sido dada a esse problema, e o uso de palavras-chave também é muito casual. Quanto à questão da eficiência
, pois a quantidade de dados na tabela não é muito grande, então não me preocupo muito com isso. Ao escrever uma instrução hoje, execute-a no analisador de consultas
Demora 10s, mas leva menos de 1s para mudar para outra forma de escrita.Meu colega disse que é por causa da ordem em que as sentenças SQL são executadas. eu vi um pouco antes
O livro de Guan, tenho uma pequena impressão, encontrei informações na Internet e estudei.
Etapas de processamento de consulta lógica
(8)SELECT (9)DISTINCT
(11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4)WHERE <where_condition>
(5) )GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <havendo_condição>
(10)ORDER BY <order_by_list>
Cada etapa produz uma tabela virtual que é usada como entrada para a próxima etapa. Somente a tabela gerada pela última etapa é retornada ao chamador. como
Se não houver cláusula, a etapa correspondente será ignorada.
1. FROM: O produto cartesiano é executado nas duas primeiras tabelas na cláusula FROM para gerar a tabela virtual VT1.
2. ON: Aplique o filtro ON ao VT1. Somente as linhas para as quais <join_condition> é verdadeiro são inseridas no VT2.
3. OUTER(JOIN): Se OUTER JOIN for especificado, nenhuma linha correspondente encontrada na tabela reservada será adicionada a VT2 como linhas externas para gerar VT3.
Se a cláusula FROM contiver mais de duas tabelas, repita as etapas 1 a 3 para a tabela de resultados produzida pela junção anterior e a próxima tabela até
até que todas as tabelas sejam processadas.
4. Aplique o filtro WHERE a VT3. Apenas as linhas que tornam <where_condition> TRUE são inseridas em VT4.
5. GROUP BY: Agrupe as linhas em VT4 pela lista de colunas na cláusula GROUP BY para gerar VT5.
6. CUBE|ROLLUP: Insira o supergrupo em VT5 para gerar VT6.
7. HAVING: Aplique o filtro HAVING ao VT6. Somente grupos com <havendo_condição> TRUE serão inseridos no VT7.
8. SELECT: processa a lista SELECT e gera VT8.
9. DISTINCT: Remova linhas duplicadas de VT8 para gerar VT9.
10. ORDER BY: Classifique as linhas em VT9 de acordo com a lista de colunas na cláusula ORDER BY para gerar uma tabela (VC10).
11. TOP: Selecione o número especificado ou a proporção de linhas desde o início de VC10, gere a tabela VT11 e retorne ao chamador.