Domanda

Ho un multi-table query SELECT che confronta i valori di colonna con se stesso come di seguito:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

Questo sembra ridondante a me. La mia domanda è, sarà la loro rimozione hanno alcun impatto sulla logica / prestazioni?

Grazie in anticipo.

È stato utile?

Soluzione

Questo sembra ridondante, il suo unico effetto è la rimozione righe che hanno valori NULL in queste colonne. Assicurarsi che le colonne non sono NULL prima di rimuovere quelle clausole.

Se le colonne sono annullabili si può tranquillamente sostituire con queste linee (più facile da leggere, più facile da mantenere):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


Aggiornamento seguente commento di Jeffrey

Hai assolutamente ragione, io non so come non ho visto io stesso: la condizione di join t1.col1=t2.col1 implica che solo le righe con il join colonne non nullo verrà considerato. Le clausole tx.col1=tx.col1 sono quindi completamente ridondante e può essere rimosso in modo sicuro.

Altri suggerimenti

non rimuoverli fino a comprendere l'impatto. Se, come altri stanno sottolineando, non hanno alcun effetto sulla query e sono probabilmente ottimizzati fuori, non c'è nulla di male nel lasciandoli lì, ma ci possono essere un danno a rimuoverli.

Non tentare di riparare qualcosa che sta lavorando fino a quando il dannatamente sicuro che non stai rompendo qualcosa d'altro.

La ragione per cui dico questo è perché abbiamo ereditato un'applicazione di reporting eredità che aveva esattamente questo costrutto, lungo le linee di:

where id = id

E, essendo un tipo sensibile, ho piantato in asso, solo per scoprire che il motore di database non era l'unica cosa che utilizzando la query.

prima passato attraverso un pre-processore che estrae ogni colonna che esisteva in una clausola where e assicurato sono stati indicizzati. Fondamentalmente un database di auto-tuning.

Bene, immaginare la nostra sorpresa sulla prossima iterazione quando il database ha rallentato ad una frazione del suo ex velocità quando gli utenti erano facendo ad-hoc query sul campo id: -)

Si scopre che questa è stata una put kludge a cura del team di supporto precedente per garantire comune ad-hoc query stavano usando colonne indicizzate così, anche se nessuna delle nostre interrogazioni standard lo ha fatto.

Quindi, non sto dicendo che non può lo fanno, solo suggerendo che potrebbe essere una buona idea per capire il motivo per cui è stato messo in prima.

  1. Sì, le condizioni sono ovviamente superfluo dato che sono identici!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. Ma si ha bisogno di almeno uno di loro. In caso contrario, si avrebbe un join cartesiano sulle vostre mani: ogni riga da table1 sarà unito ad ogni riga in tabella2. Se table1 aveva 100 righe, e table2 aveva 1000 righe, la query risultante sarebbe tornato 100.000 risultati.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top