Domanda

Ho una tabella che contiene informazioni sulle città in un gioco, puoi costruire un edificio ogni turno e questo viene registrato con il valore " usedBuilding " ;.

Ad ogni turno eseguirò uno script che altera usedBuilding a 0, la domanda è: quale dei due modi seguenti è più veloce e importa in che modo viene utilizzato?

UPDATE cities SET usedBuilding = 0;
UPDATE cities SET usedBuilding = 0 WHERE usedBuilding = 1;
È stato utile?

Soluzione

In generale, la clausola del secondo caso (con la clausola WHERE) sarebbe più veloce, poiché non causerebbe la valutazione del trigger, la registrazione delle transazioni, l'aggiornamento dell'indice, ecc. sulle righe non utilizzate.

Potenzialmente - a seconda della distribuzione dei valori 0/1, potrebbe effettivamente essere più veloce aggiornare tutte le righe invece di fare il confronto - ma questo è un caso piuttosto degenerato.

Poiché circa il 95% dei costi della query è I / O, l'utilizzo della clausola WHERE non farà alcuna differenza (poiché la colonna non è indicizzata e si esegue una scansione della tabella) o una differenza enorme (se la colonna è indicizzato o la tabella è partizionata, ecc.). Ad ogni modo, non fa male.

Sospetto che per la quantità di dati che stai parlando, non noterai alcuna differenza nei piani di esecuzione o nella velocità, il che lo rende accademico nel migliore dei casi, ottimizzazione prematura nel peggiore dei casi. Quindi, consiglierei di andare con qualsiasi cosa logicamente abbia senso per la tua app.

Altri suggerimenti

Se usedBuilding è indicizzato, sarà più veloce usare la clausola where poiché accederà / aggiornerà solo le righe in cui usedBuilding è vera. Se non è indicizzato, eseguiresti comunque una scansione della tabella completa, quindi non farebbe molta (alcuna?) Differenza.

Prova in entrambi i modi in sequenza alcune migliaia di volte e cronometra! Probabilmente dipende da: quanti record sono effettivamente in questa tabella e se si adattano tutti alla memoria o se devono essere paginati su disco. Quanti edifici hanno il valore 1 prima di eseguire l'aggiornamento (suppongo che potrebbe essere 1).

Non importa in che modo viene utilizzato, ma il più corto probabilmente ha il minimo che può andare storto. Il codice che non scrivi non può contenere bug.

Con quale frequenza si verificano questi turni? Quante righe ti aspetti di avere in questa tabella? Se le risposte sono "meno di una volta al secondo" e "meno di 10000", smetti di preoccuparti.

A meno che tu non abbia un interesse accademico in questo, ovviamente.

Sembra che ci sarebbe un numero inferiore di transazioni per rendere " UPDATE città SET usedBuilding = 0; " eseguire la query più specifica. Il motivo principale che mi viene in mente contro questo sarebbe se tu avessi più di uno stato nella tua colonna. Se è solo un booleano, allora andrebbe bene, ma potresti voler passare un po 'di tempo a pensare se sarà sempre così.

L'indicizzazione potrebbe anche rendere più efficiente il piano di esecuzione utilizzando la clausola WHERE.

Il modo migliore per ottenere una risposta definitiva sarebbe quello di creare un profilo utilizzando molti dati di esempio in diversi scenari.

l'indicizzazione non ti aiuterà affatto a meno che tu non abbia qualcosa come forse il 2% dei valori usedBuilding = 1.

tuttavia queste 2 affermazioni sono logicamente diverse e possono significare cose totalmente diverse. ma se per il tuo caso sono gli stessi, usa quello senza la clausola where.

Quante righe hai esattamente? Sospetto che per un gioco online di dimensioni ridotte, in realtà non ti interessa.

Se stai facendo diversi aggiornamenti alla " città " tabella, potrebbe essere una buona idea eseguirli tutti in un'unica istruzione UPDATE, se possibile.

Effettuare qualsiasi modifica a una riga richiede probabilmente tanto I / O quanto scrivere l'intera riga (tranne ovviamente aggiornare colonne indicizzate richiede anche scritture di indice), quindi perdi facendo diversi AGGIORNAMENTI che colpiscono molte righe.

Ma se hai, diciamo, < 1000 righe, non ti interessa davvero :)

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