Pergunta

Ao juntar duas tabelas, o que são a diferença entre os dois blocos abaixo e que é a melhor abordagem?

Padrão A:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
WHERE 1=1
    AND A.Name = "Foo"
    AND B.Title = "Bar"

O padrão B:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
            AND B.Title = "Bar"
WHERE 1=1
    AND A.Name = "Foo"
Foi útil?

Solução

Isso vai variar de pessoa para pessoa, mas acho que o padrão A é melhor.

O que ele faz é que separa o nível de tabela junta-se a partir dos filtros. Isso pode ser útil para consultas com várias associações e vários filtros porque separa claramente os dois tipos de união que está acontecendo.

Outras dicas

Eu prefiro padrão A, mas provavelmente não há nenhuma diferença. Você realmente tem que olhar para o plano de execução que para se certificar de que está funcionando de forma eficiente.

Se você substituir INNER JOIN com OUTER JOIN, haverá diferença.

Caso contrário, essas consultas:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

SELECT  *
FROM    A, B
WHERE   B.Title = "Bar"
        AND A.Name = "Foo"
        AND A.PK = B.FK

são idênticos.

Oracle, MySQL, PostgeSQL e SQL Server vai tratá-los exatamente o mesmo, e usar exatamente o mesmo plano para todos eles.

Eu usaria esta:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

Se há uma chave de coluna única em B.FK, e este:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

Se há uma chave composta em (B.FK, B.title).

A junção condições são mais visuais neste caso.

Eu posso estar errado sobre isso, mas eu vejo o 1º abordagem como uma forma mais eficiente. Suas consultas são executadas de dentro para fora. Então, quando você executar o seu juntar-se em primeiro lugar, ele vai correr mais rápido só porque ele tem que corresponder em (provavelmente indexado) PK e FK Campos e não qualquer coisa estranha como seu campo Título (que é provavelmente um varchar, tornando o jogo ainda mais lento). Então, pelo tempo que você chegar ao seu filtragem onde cláusula, você tem menos dados para realizar correspondente no. Total embora especulação. Eu me pergunto o que os outros diriam. Não faria mal para ver o plano de execução sobre isso:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top