Sql 在具有多行(3亿行)的表上使用count(*)查询的性能
我知道使用sqlite有局限性,但我想知道它是否能够处理这种情况 我的表有超过3亿条记录,数据库容量约为12千兆。使用sqlite的数据导入util既漂亮又快速。但后来我在这个表的一个字符串列中添加了一个索引,它运行了一整夜来完成这个操作。我没有把它和其他数据库进行比较,但对我来说似乎很慢 现在添加了索引,我想在数据中查找重复项。所以我尝试运行一个“havingcount>0”查询,它似乎也需要几个小时。我的查询如下所示:Sql 在具有多行(3亿行)的表上使用count(*)查询的性能,sql,sql-server,performance,sqlite,Sql,Sql Server,Performance,Sqlite,我知道使用sqlite有局限性,但我想知道它是否能够处理这种情况 我的表有超过3亿条记录,数据库容量约为12千兆。使用sqlite的数据导入util既漂亮又快速。但后来我在这个表的一个字符串列中添加了一个索引,它运行了一整夜来完成这个操作。我没有把它和其他数据库进行比较,但对我来说似乎很慢 现在添加了索引,我想在数据中查找重复项。所以我尝试运行一个“havingcount>0”查询,它似乎也需要几个小时。我的查询如下所示: select col1, count(*) from table1 g
select col1, count(*)
from table1
group by col1
having count(*) > 1
我假设这个查询会在col1上使用我的索引,但是查询执行速度慢让我怀疑它是否不是
sql server是否能更好地处理此类问题
但后来我给这个表中的一个字符串列添加了一个索引,它运行了一整夜来完成这个任务
活动我没有把它和其他数据库进行比较,但对我来说似乎很慢
我不想告诉你,但是你的服务器看起来怎么样?没有争议,但这可能是一项非常需要解决的操作,可能需要大量IO,而普通计算机或硬盘速度较慢的chehap web服务器不适合进行大量数据库工作。我运行数百og千兆字节数据库项目工作,我最小的“大数据”服务器有2个SSD和8个Velociraptor用于数据和日志。最大的一个有3个存储节点,共有1000gb SSD光盘,这仅仅是因为IO是db服务器赖以生存和呼吸的东西
所以我尝试运行一个“havingcount>0”查询,它似乎也需要几个小时
多少公羊?足够将其全部放在内存中,还是一个内存不足的虚拟服务器,丢失的内存会导致坏IO?SqlLite可以/使用多少内存?临时设置如何?在记忆中?Sql server可能会使用大量内存/tempdb空间来执行这种类型的检查
但后来我给这个表中的一个字符串列添加了一个索引,它运行了一整夜来完成这个任务
活动我没有把它和其他数据库进行比较,但对我来说似乎很慢
我不想告诉你,但是你的服务器看起来怎么样?没有争议,但这可能是一项非常需要解决的操作,可能需要大量IO,而普通计算机或硬盘速度较慢的chehap web服务器不适合进行大量数据库工作。我运行数百og千兆字节数据库项目工作,我最小的“大数据”服务器有2个SSD和8个Velociraptor用于数据和日志。最大的一个有3个存储节点,共有1000gb SSD光盘,这仅仅是因为IO是db服务器赖以生存和呼吸的东西
所以我尝试运行一个“havingcount>0”查询,它似乎也需要几个小时
多少公羊?足够将其全部放在内存中,还是一个内存不足的虚拟服务器,丢失的内存会导致坏IO?SqlLite可以/使用多少内存?临时设置如何?在记忆中?Sql server可能会使用大量内存/tempdb空间进行此类检查。通过
PRAGMA cache\u size=
增加sqlite缓存。使用的内存是
倍
。(可通过PRAGMA page\u size=
设置)
通过将这些值分别设置为16000和32768(或大约512MB),我能够将这个程序的大容量负载从20分钟降低到2分钟。(虽然我认为如果系统上的磁盘不是那么慢,这可能不会有太大的影响)
但是,在较小的嵌入式平台上,您可能没有这些额外的内存可用,我不建议像在这些平台上那样增加内存,但对于台式机或笔记本电脑级系统,这会有很大帮助。通过
PRAGMA cache\u size=
增加sqlite缓存。使用的内存是
倍
。(可通过PRAGMA page\u size=
设置)
通过将这些值分别设置为16000和32768(或大约512MB),我能够将这个程序的大容量负载从20分钟降低到2分钟。(虽然我认为如果系统上的磁盘不是那么慢,这可能不会有太大的影响)
但是,在较小的嵌入式平台上,您可能没有这些额外的内存可用,我不建议像在这些平台上那样增加内存,但对于台式机或笔记本电脑级别的系统,它会有很大的帮助。SQLite的count()
没有经过优化-即使索引,它也会进行全表扫描。这是你的电话号码。运行以验证,您将看到:
EXPLAIN QUERY PLAN SELECT COUNT(FIELD_NAME) FROM TABLE_NAME;
我得到这样的东西:
0|0|0|SCAN TABLE TABLE_NAME (~1000000 rows)
SQLite的count()。这是你的电话号码。运行以验证,您将看到:
EXPLAIN QUERY PLAN SELECT COUNT(FIELD_NAME) FROM TABLE_NAME;
我得到这样的东西:
0|0|0|SCAN TABLE TABLE_NAME (~1000000 rows)
您是否尝试过检查索引以查看是否使用了索引?无论如何,12千兆字节只是数据,索引应该是额外的几千兆字节。我认为与其他替代方案相比,SQLite的性能可能太差了,尽管理论上是140 TB。事实上我忘了提到,索引后文件的大小基本上翻了一番-从12gb到24GB。我将运行explain tho并查看,谢谢。您是否尝试检查以查看是否使用了索引?无论如何,12千兆字节只是数据,索引应该是额外的几千兆字节。我认为与其他替代方案相比,SQLite的性能可能太差了,尽管理论上是140 TB。实际上我忘了提到,索引从12gb增加到24GB后,文件的大小基本上翻了一番。我将运行explain tho并查看,感谢大容量加载足够快,索引和重复数据消除查询现在成了问题大容量加载足够快,索引和重复数据消除查询现在成了问题我看到它没有填充ram(我有8个GIG),而且它似乎没有做很多io。它似乎只是在消耗处理器。。。这很奇怪,完全不是。你打算做大量的手术