LIMIT ROWS EXAMINED
MariaDB starting with 5.5.21
This feature was introduced in MariaDB 5.5.21.
Sintassi
SELECT ... FROM ... WHERE ... [clausola_groupby] [clausola_orderby] LIMIT [[scarto,] num_righe] ROWS EXAMINED limite_righe;
Similmente ai parametri di LIMIT
, 'limite_righe
' può essere un parametro sia nei Prepared Statement, sia negli Stored Program.
Spiegazione
Lo scopo di questa ottimizzazione è avere la possibilità di terminare le istruzioni SELECT
quando esaminano troppi record e quindi consumano troppe risorse. Questo è stato fatto estendendo la clausola LIMIT
— LIMIT ROWS EXAMINED limite_righe
. Laddove è possibile, la semantica di LIMIT ROWS EXAMINED
è la stessa di LIMIT
(per esempio, per le funzioni aggreganti).
La clausola LIMIT ROWS EXAMINED
viene presa in considerazione solo durante l'esecuzione. Viene perciò ignorata nei casi seguenti:
- Durante l'esecuzione di
EXPLAIN
. - Durante l'ottimizzazione della query.
- Durante le operazioni ausiliarie, come la scrittura nelle tabelle di sistema (come i log).
TLa clausola non si applica alle istruzioni DELETE
e UPDATE
, e se utilizzata con esse produce un errore di sintassi.
Gli effetti di questa clausola sono i seguenti:
- Il server conta il numero di righe lette, inserite, modificate ed eliminate durante l'esecuzione. Questo conteggio include i record nelle tabelle temporanee e l'ordinamento che avviene durante le operazioni interne richiesta da una query.
- Se il contatore eccede il numero specificato in LIMIT ROWS EXAMINED, l'esecuzione della query termina appena possibile.
- Quando la clausola LIMIT ROWS EXAMINED termina una query, produce i seguenti effetti:
- Il risultato della query potrebbe essere un sottoinsieme dei risultati che avrebbe potuto ottenere, a seconda di quando è stata interrotta. Se nessun record è stato trovato prima dell'interruzione, l'insieme dei risultati è vuoto.
- Viene generato un warning in questa forma: "Query execution was interrupted. The query examined at least 100 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete."
- Se l'elaborazione della query viene interrotto durante un filesort, oltre al warning viene restituito un errore.
- Se una UNION viene interrotta durante l'esecuzione delle sue query, l'ultimo passaggio della UNION viene comunque eseguito per poter ottenere un risultato parziale.
- A seconda della join e di altre strategie di esecuzione, la stessa query potrebbe non restituire alcun risultato, oppure restituire un differente sottoinsieme dei risultati completi.
- Se la query contiene una clausola GROUP BY, l'ultimo gruppo raggiunto al momento dell'esecuzione viene scartato.
La clausola LIMIT ROWS EXAMINED
non può essere specificata per le subquery. Può esserci una sola clausola LIMIT ROWS EXAMINED
per l'intera SELECT
. Se una SELECT
contiene più subquery con clausole LIMIT ROWS EXAMINED
, viene presa in considerazione soltanto l'ultima sottoposta a parsing.
Esempi
Un semplice esempio:
SELECT * from t1, t2 LIMIT 10 ROWS EXAMINED 10000;
La clausolaLIMIT ROWS EXAMINED
è globale per l'intera istruzione.
Se una query composta (cioè una UNION
o una query che comprende tabelle derivate o subquery) contiene più di una clausola LIMIT ROWS EXAMINED
,viene presa in considerazione soltanto l'ultima che è stata sottoposta a parsing. In questo modo vale l'ultima oppure quella più esterna. Per esempio, nella query:
SELECT * FROM t1 WHERE c1 IN (SELECT * FROM t2 WHERE c2 > ' ' LIMIT ROWS EXAMINED 0) LIMIT ROWS EXAMINED 11;
Il limite preso in considerazione è 11, non 0.