Domanda

Ho lavorato su un progetto che utilizza un non-SQL DB proprietaria cui le query potrebbero essere interrotti e nel codice di base ci sono stati abbastanza alcuni punti in cui è stato utilizzato e reso perfetto senso che functionnality (ad esempio, per interrompere una query lunga corsa che viene annullata da parte dell'utente, o quando un più recente interrogazione avviene e rende la query precedente obsoleto, etc.) e mi sono reso conto che non ho mai visto davvero quel tipo di "query" in precedenza interrotti e ho pensato che potrebbe fare una domanda buona SO (diversi domande, ma sono tutti legati alla esattamente la stessa cosa):

  • può query SQL essere interrotta?

  • È questa parte dello standard SQL?

  • se non è parte dello standard SQL, che DB SQL permettono query per essere interrotte (qualsiasi esempio più benvenuto)?

  • è comune per interrompere una query DB (SQL o no) che saprete non si preoccupano il risultato più? (Nella base di codice su cui ho lavorato, aiuta certo Alleggerisci il carico del server)

È stato utile?

Soluzione

Imho "interrotto" dovrebbe essere sostituito da 'ucciso' o 'terminato'. Il concetto di interruzione può essere fonte di confusione come si potrebbe presumere che permetterebbe la query per essere ripreso in seguito.

Lo standard SQL non fornisce un modo per interrompere o terminare una query esecuzione, ma ogni DBMS so implementi un KILL comando o simili. Per esempio, in MySQL un utente può utilizzare SHOW [FULL] PROCESSLIST per visualizzare tutte le query in esecuzione (e dei loro stati, gli ID delle query, ecc). Gli utenti con il privilegio KILL può quindi terminare una query.

più uccisioni avvengono perché una query rischia di correre troppo a lungo o si blocca altre query, ad esempio. la tabella manca un indice o il disco è pieno. Quando non si preoccupano il risultato (ad esempio all'utente la navigazione del sito annullata.), Spesso il web server stesso sarà interrompere il processo e, quindi, la domanda in sé (senza interazione manuale o il programmatore necessario)

Altri suggerimenti

strati accedere a tutti i RDBMS io abbia mai lavorato forniscono un metodo cancellazione per le query in modo asincrono in esecuzione annulla. Controllare la documentazione per qualsiasi accesso ai dati stack tecnologico che si sta utilizzando. .NET / ADO / JDBC fornire un metodo di 'annullare'. ODBC - SQLCancel. Ovviamente sottostante RDBMS fornitori driver di accesso ai dati deve implementare il metodo.

In termini di utilità di cancellazione avrei tendo a essere critica di qualsiasi regime che ha fatto uso regolare di esso. A mio parere un migliore coordinamento e di progettazione o tenderebbero a ridurre necessità non amministrativo.

Non è significativa dipendenza da meccanismi interni della RDBMS, natura del regime delle transazioni e l'isolamento. Se il RDBMS utilizza un modello di concorrenza ottimistica (cioè commit è essenzialmente privo) annulla una query esecuzione può comportare un'operazione di rollback potenzialmente costoso. In un caso peggiore di una query in esecuzione per un'ora fino al punto di cancellazione può benissimo prendere un'altra ora per rollback.

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