2010-06-15 17 views
19

Mi piacerebbe capire come funziona esattamente il conteggio di sql. È un'intera scansione della tabella che si verifica o è una proprietà della tabella che viene letta. Tuttavia ritengo che una scansione del tavolo sarebbe un overhead in caso di tabelle enormi con un sacco di record.come funziona il conteggio sql?

+6

Va .... Un po 'piggie, due porcellini, tre porcellini, ecc – StingyJack

+1

@StingyJack, no no no, hai sbagliato tutto! va una patata, due patate, tre patate ... –

+1

@KM: questa è un'ottimizzazione che non tutti i DBMS implementano ancora. –

risposta

12

In generale viene eseguita una scansione di tabella o indice. Ciò è dovuto principalmente al fatto che in un motore di supporto MVCC, diverse transazioni potrebbero vedere diverse righe, quindi non esiste un singolo "conteggio delle righe" che sia simultaneamente corretto per tutti.

Allo stesso modo, se si dispone di una clausola WHERE, la condizione where potrebbe essere diversa per i client diversi, in modo che visualizzino numeri diversi.

Se è necessario eseguire molti conteggi di tabelle di grandi dimensioni, è consigliabile archiviare i propri contatori in una tabella diversa. Esattamente come lo si fa è completamente specifico per l'applicazione.

+0

viste materializzate possono migliorare drasticamente le prestazioni delle query aggergate ad alta frequenza (come count(), ecc.). In un modo molto più veloce (meno sovraccarico) e più affidabile di creare il proprio contatore nel proprio tavolo. –

0

In postgreSQL viene eseguita una scansione della tabella. Penso che dipenda dall'implementazione.

Edit: Vedere this link

+0

che ne dici di Oracle ... 9i in particolare? – ria

+0

È possibile eseguire una query per verificare il piano di esecuzione – pcent

1

YSE funzione count DOSE TABLE SCAN, invece di usare conteggio sul tavolo per ottenere il numero totale di righe è possibile utilizzare:

SELECT 
Total_Rows= SUM(st.row_count) 
FROM 
sys.dm_db_partition_stats st 
WHERE 
object_name(object_id) = 'TABLENAME' 

o

SELECT sysobjects.[name], max(sysindexes.[rows]) AS TableRows 
FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id] 
WHERE sysobjects.xtype = 'U' and sysobjects.[name]='tablename' 
GROUP BY sysobjects.[name] 
ORDER BY max(rows) DESC 

ALTRI MODI PER OTTENERE TOTALE CONTA: http://www.codeproject.com/Tips/58796/Number-of-different-way-to-get-total-no-of-row-fro.aspx

1

Dipende dal DBMS utilizzato.

Se c'è un indice, dovrebbe esserci una riga di indice per ogni riga di tabella. Un DBMS intelligente sceglierà probabilmente l'indice più piccolo e conteggia le righe dell'indice.

Infine, se la tabella è sufficientemente piccola, può contare le righe della tabella e ignorare l'indice.

2

Di solito è una sorta di scansione indice, a meno che non ci sia un indice univoco sulla tabella.

Stranamente, la maggior parte dei motori di database può contare solo tramite la scansione. Forniscono anche soluzioni alternative per contare usando i metadati della tabella. Ad esempio, SQL Server supporta SELECT rowcnt FROM sysindexes .... Tuttavia, questi di solito non sono accurati al 100%.

+1

... e il fatto che di solito non sono accurati al 100% è la ragione per cui un vero conteggio (*) 'viene eseguito mediante scansione (o la tabella o un indice). –

6

Questo dipenderà molto dall'implementazione SQL che si sta utilizzando (MS SQL Server, MySQL, Oracle, PostgreSQL ecc.) E quanto intelligente è il suo ottimizzatore.

Può anche dipendere dalla query. Ad esempio, con qualcosa come

SELECT COUNT(primary_key) FROM table; 

l'ottimizzatore può rendersi conto che non è necessario eseguire la scansione del tavolo (poiché non v'è alcun filtro con WHERE e nessuna possibilità che tutti i valori sono NULL) e appena restituire la dimensione della tavolo. Con una query più complicata (in cui è presente il filtro o la possibilità di NULL), il database potrebbe dover eseguire la scansione della tabella, oppure potrebbe essere in grado di eseguire un'ottimizzazione con l'uso di un indice.

3

Questo ovviamente dipende dall'implementazione (ad esempio RDBMS diversi possono utilizzare strategie diverse) e dipende dall'utilizzo (ad es.select count(*) from mytable e select count(*) from mytable where myfield < somevalue) possono utilizzare metodi diversi anche nello stesso DB.

Se si sta tentando di ottenere il conteggio basato su un partizionamento già espresso da un indice, i DB intelligenti proveranno a utilizzare l'indice da solo. O qualcosa come il vecchio "rushmore" usato in Foxbase.

Quindi, "dipende", ma alla fine della giornata, se non sono disponibili metodi migliori, sì, il DB eseguirà una scansione della tabella.

-1

Non importa!

Suppongo che tu voglia il conteggio delle righe per una sorta di paging ... quindi assicurati che il tuo algoritmo di paging sia nelle migliori pratiche e dimentichi come funziona il motore.

Consenti alle persone che lavorano nel database di occuparsi di questo, basta seguire la raccomandazione di coloro che sono esperti nel database che stai utilizzando.

SQL Server - http://www.4guysfromrolla.com/webtech/042606-1.shtml

Oracle - Paging with Oracle

MySQL-http://php.about.com/od/phpwithmysql/ss/php_pagination.htm

+3

Forse l'OP ha posto la domanda perché vogliono sapere la risposta vera. Supponendo che uno scenario particolare, e poi dicendo che la risposta non ha importanza in quello scenario, non è molto utile. Apprezzo lo sforzo che hai messo nella raccolta dei link, ma sfortunatamente nessuno di loro in realtà risponde alla domanda reale! –

+0

I collegamenti, spiegano le migliori pratiche per effettuare il paging in ogni database. E sono quasi sicuro che la domanda riguarda le sue perfomance ... analisi paralisi – Fraga

+0

Sono qui perché voglio sapere cosa succede dietro lo sql –

Problemi correlati