簡體   English   中英

在具有多行(3億+)的表上使用count(*)進行查詢的性能

[英]Performance of queries using count(*) on tables with many rows (300 million+)

我知道使用sqlite會有局限性,但我想知道它是否應該能夠處理這種情況。

我的表有3億多條記錄,數據庫約為12個演出。 使用sqlite的數據導入工具既好又快速。 但是后來我在該表的字符串列中添加了索引,並且它整夜運行以完成此操作。 我沒有將此與其他數據庫相提並論,但是對我來說似乎很慢。

現在已經添加了索引,我想在數據中查找重復項。 因此,我正在嘗試運行“計數> 0”查詢,而且似乎還要花費數小時。 我的查詢看起來像:

select col1, count(*) 
from table1
group by col1
having count(*) > 1

我假設該查詢將使用col1上的索引,但是查詢執行緩慢使我想知道是否不是?

也許sql server可以更好地處理這種事情?

SQLite的count()尚未優化-即使已建立索引,它也會進行全表掃描 建議使用以下方法來加快速度 運行EXPLAIN QUERY PLAN進行驗證,您將看到:

EXPLAIN QUERY PLAN SELECT COUNT(FIELD_NAME) FROM TABLE_NAME;

我得到這樣的東西:

0|0|0|SCAN TABLE TABLE_NAME (~1000000 rows)

但是后來我在該表的字符串列中添加了索引,並且它整夜運行以完成此操作。 我沒有將此與其他數據庫相提並論,但是對我來說似乎很慢。

我不想告訴yuo,但是您的服務器看起來如何? 無需爭論,但這可能是一項非常耗費資源的操作,可能需要大量的IO,硬盤速度慢的普通計算機或廉價Web服務器不適合進行大量的數據庫工作。 我運行數百Gb千兆字節的數據庫項目,而我最小的“大數據”服務器具有2個SSD和8個Velociraptors,用於數據和日志記錄。 最大的一個有3個存儲節點,總共有1000gb SSD磁盤-僅僅是因為IO是數據庫服務器賴以生存和生存的東西。

所以我正在嘗試運行“計數> 0”查詢,而且似乎還要花費數小時

多少內存? 是否足以將其全部裝入內存,或者內存不足的虛擬服務器中丟失的內存炸毀了壞IO? SqlLite可以使用多少內存? 溫度設置如何? 在記憶中? SQL服務器可能會為此類型的檢查使用大量內存/ tempdb空間。

通過PRAGMA cache_size=<number of pages>增加sqlite緩存。 使用的內存是<number of pages><size of page> (可以通過PRAGMA page_size=<size of page>

通過將這些值分別設置為16000和32768(或大約512MB),我能夠使該程序的大容量負載從20分鍾降低到2分鍾。 (盡管我認為,如果該系統上的磁盤不是很慢,那么可能不會產生太大影響)

但是在較小的嵌入式平台上可能沒有可用的額外內存,我不建議像在那些嵌入式平台上那樣增加內存,但是對於台式機或筆記本電腦級別的系統,它可以提供很大的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM