Domanda

Mi piacerebbe sapere la differenza di prestazioni in aggiornamento di una tabella utilizzando il seguente metodo:

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;

o come questo:

UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;

Qualcuno ha testato questo o sa come gli aggiornamenti con i cursori di lavoro in modo che possano commentare questo?

EDIT: ora ho benchmark questo e ha scoperto che si tratta infatti di circa un terzo più veloce per fare l'ultimo esempio. Ho eseguito ciascuna delle query 100000 volte e cronometrato la differenza. Ho usato psycopg2 utilizzando i cursori lato server per comunicare con Postgres. Io indagare ulteriormente per vedere se riesco a trovare che questo non è sempre il caso.

È stato utile?

Soluzione

Non ho familiarità con PostgreSQL, quindi posso solo dare una risposta generica.

Prima di tutto, se indexed_int_column non riservate, la seconda istruzione aggiornerà più righe, mentre il primo aggiornerà solo la riga attualmente sotto il c_films cursore. Quindi, le dichiarazioni non sono identici.

Supponendo unicità ei c_films cursore essendo la fila quella dove indexed_int_column = 3000, allora l'aggiornamento deve essere molto rapido una volta che il cursore è posizionato sotto una determinata riga, il cursore contiene le informazioni per accedere direttamente la posizione fisica di questa riga. La seconda istruzione invece, dovrà recuperare l'indice primo, ricercare il valore 3000 in essa e solo allora si saprà la posizione fisica della riga di aggiornamento. Che ha detto, questa operazione di ricerca doveva essere fatto per il cursore a un certo punto a (se non abbiamo fatto iterate su tutta la tabella che è). Quindi, in generale, si paga solo fuori di utilizzare il cursore, quando si deve leggere i dati prima in ogni caso, e poi si desidera aggiornare la stessa riga che avete appena letto.

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