2012-10-19 7 views
7

mio Google Cloud SQL tavolo hanno 1126571 righe attualmente e l'aggiunta di almeno 30 mila ogni day.When eseguire la query:Google Cloud SQL: impossibile eseguire l'istruzione

select count(distinct sno) as tot from visits 

SQL SOLLECITO genererà seguente errore:

Error 0: Unable to execute statement 

. Cloud SQL Query passibile di 60 secondi supera l'eccezione. Come superare il problema quando il tavolo diventa grande.

risposta

0

aggiungi un INDEX nella colonna sno e migliorerà le sue prestazioni.

ALTER TABLE visits ADD INDEX (sno) 
+0

nella mia tabella ogni inserimento di secondi sta succedendo. Quindi l'indicizzazione causerà la riduzione delle prestazioni delle query di inserimento –

+0

@JinjuJoseph È possibile aggiungere un trigger sulle visite per aggiornare il valore desiderato in un'altra tabella e indicare i totali nel campo tot. Quindi dovresti selezionare il valore aggregato direttamente da lì. –

1

Rompere il tavolo in due tabelle. Uno per ricevere nuove visite ... transazioni ... uno per la segnalazione. Indicizza la tabella di rapporto. Trasferisci e cancella i dati su base regolare.

La tabella delle transazioni rimarrà relativamente piccola e quindi sarà veloce da contare. La tabella di rapporto sarà veloce da contare a causa dell'indice.

0

Provare a suddividere la query di selezione per molte parti, ad esempio, la prima query di selezione deve essere limitata a 50000 e quindi la seconda query di selezione deve essere avviata da 50000 e limitata a 50000 e così via.

Potete farlo da questo scenario:

1- Ricevi contano record.

2- Creare un ciclo e terminarlo con il numero di record.

3- Per ogni ciclo, rendono la query di selezione selezionare 50000 record e aggiungere i risultati di un DataTable (dipende da ciò che è il tuo linguaggio di programmazione)

4- Nel ciclo successivo, è necessario iniziare a selezionare da dove precedente loop terminato, ad esempio, la seconda query deve selezionare i successivi 50000 record e così via.

È possibile specificare la vostra selezione indice iniziale da questa dichiarazione query SQL:

SELECT * FROM mytable somefield LIMIT 50000 OFFSET 0; 

allora si otterrà l'intero dati che si desidera.

NOTA: fare un test per vedere quale è il numero massimo di record può essere caricato in 60 secondi, questo diminuirà i loop e, quindi, le prestazioni aumentate.

Problemi correlati