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?
risposta
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.
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. –
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
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.
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%.
... 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). –
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.
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.
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
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! –
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
Sono qui perché voglio sapere cosa succede dietro lo sql –
- 1. conteggio SQL - non funziona
- 2. Conteggio SQL (*) e distinto
- 3. SQL distinto e conteggio
- 4. gruppo SQL di giorno, con il conteggio
- 5. ottenere conteggio query in SQL
- 6. Come funziona il backup nel server SQL?
- 7. Come funziona il predicato IN in SQL?
- 8. Come utilizzare il conteggio distinto in pymongo?
- 9. sql selezionare il conteggio di più relazioni con join sinistro
- 10. conteggio max per il conteggio (*)
- 11. SQL: Conteggio distinto nella clausola where?
- 12. Query SQL con join, conteggio e dove
- 13. Ottieni il conteggio query SQL durante una sessione shell Django
- 14. Utilizzando l'unione e il conteggio (*) insieme nella query SQL
- 15. Conteggio SQL e duplicati di gruppo
- 16. SQL Best Practice: count (1) o il conteggio (*)
- 17. Conteggio di istruzioni SQL in Hibernate
- 18. Trovare conteggio per un periodo in SQL
- 19. Filtraggio di un conteggio sql (*) con SQLAlchemy
- 20. Restituisce un conteggio con linq-to-sql
- 21. è il conteggio (colonna indicizzata) più veloce del conteggio (*)?
- 22. Catturare conteggio da una query SQL
- 23. Query SQL per conteggio() più tabelle
- 24. Conteggio SQL per una colonna di data
- 25. Righe conteggio SQL in una tabella
- 26. SQL mediante conteggio delle righe vs Top
- 27. dottrina carico supplementare pigri non funziona come previsto con conteggio
- 28. MySQL "Il conteggio delle colonne non corrisponde al conteggio dei valori" ma il conteggio corrisponde allo
- 29. Come eseguire il conteggio del conteggio della raccolta all'entità con fluent-nibernato
- 30. Il conteggio stringa() metodo
Va .... Un po 'piggie, due porcellini, tre porcellini, ecc – StingyJack
@StingyJack, no no no, hai sbagliato tutto! va una patata, due patate, tre patate ... –
@KM: questa è un'ottimizzazione che non tutti i DBMS implementano ancora. –