Domanda

Supponendo una CAR tabella con due colonne CAR_ID (int) e VERSION (int).

Voglio recuperare la versione massima di ogni vettura.

Quindi ci sono due soluzioni (almeno):

select car_id, max(version) as max_version 
  from car  
 group by car_id;

o

select car_id, max_version 
  from  ( select car_id, version
               , max(version) over (partition by car_id) as max_version
            from car
                ) max_ver  
 where max_ver.version = max_ver.max_version

Sono queste due query simile performante?

È stato utile?

Soluzione

Si Può colpisce

Secondo query è un esempio di Inline View. E 'un metodo molto utile per l'esecuzione di report con vari tipi di conteggi o uso di funzioni di aggregazione con esso.

Oracle esegue la subquery e quindi utilizza le righe risultanti come vista nella clausola FROM.

Mentre consideriamo sulle prestazioni, consigliamo sempre in linea vista invece di scegliere un altro tipo di sottoquery.

E ancora una cosa seconda query darà tutti i record massimo, mentre prima vi darà un solo record max.

vedere qui

Altri suggerimenti

So che questo è estremamente vecchio ma pensava che va sottolineato.

select car_id, max_version 
  from (select car_id
             , version
             , max(version) over (partition by car_id) as max_version
          from car ) max_ver  
 where max_ver.version = max_ver.max_version

Non certo perché l'hai fatto l'opzione due in quel modo ... in questo caso il sub selezionare dovrebbe essere teoricamente più lenti, perché la vostra selezione dalla stessa tabella 2x e poi unire i risultati indietro a se stesso.

Just versione rimuovere dal vista in linea e sono la stessa cosa.

select car_id, max(version) over (partition by car_id) as max_version
  from car

Le prestazioni in realtà dipende l'ottimizzatore in questa situazione, ma sì il come risposta originale suggerisce viste in linea come fanno i risultati strette. Anche se questo non è un buon esempio essendo il suo stesso tavolo senza filtri nelle selezioni indicate.

Il partizionamento è utile anche quando si seleziona un sacco di colonne, ma ha bisogno diverse aggregazioni che si adattano al set di risultati. In caso contrario, si è costretti a gruppo da ogni altra colonna.

E 'dipenderà dalla vostra schema di indicizzazione e la quantità di dati nella tabella. L'ottimizzatore probabilmente prendere decisioni diverse in base ai dati che è in realtà all'interno della tabella.

ho trovato, almeno in SQL Server (lo so che chiesto Oracle) che l'ottimizzatore è più probabile che eseguire una scansione completa con la partizione di query contro la query GROUP BY. Ma questo è solo nei casi in cui si ha un indice che contiene CAR_ID e VERSION (DESC) in esso.

La morale della storia è che ho iniziato ad esaminare a fondo per scegliere quello giusto. Per le piccole tavole, non importa. Per davvero, davvero grandi insiemi di dati, né possono essere veloce ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top