我在磁盘文件中创建了一个新的 SQLite 数据库,并使用以下命令关闭了 AutoCommit:
my $dsn = "dbi:SQLite:dbname=folder/path/file.db";
my $user = "";
my $password = "";
my $dbh = DBI->connect($dsn, $user, $password,{AutoCommit => 0});
#… Doing some processing on the database (Creating tables/Inserting rows/Updating fields)
#… Many query SELECT statements here
# My question here: Does SQLite read data from memory or disk each time a SELECT statement is performed.
查询数据时(使用SELECT SQL语句),SQLite是从磁盘文件还是内存中读取数据? SQLite 是否执行任何磁盘活动(其性能低于内存 RAM 活动)?
旁注:
这个问题的答案将帮助指导我选择是否先将数据库从磁盘文件加载到内存,然后从中处理和查询数据,最后完成后保存回磁盘文件 https://stackoverflow.com/questions/53304184/,或仅使用关闭自动提交解决方案的其他选项。
Note:我创建的数据库不会变得太大,所以我不担心数据库填满内存的问题。
如果 SQLite 每次调用 SELECT 查询语句时都从磁盘读取数据,那么与我在我的文章中提到的将 DB 复制到内存解决方案相比,这将导致巨大的性能滞后。上一个问题 https://stackoverflow.com/questions/53304184.
有用的答案即将到来:
• 性能测试 https://gist.github.com/schwern/4cd618e7233aa71324dd84d878e31048 by Schwern https://stackoverflow.com/users/14660/schwern(提及here https://stackoverflow.com/questions/53304184/how-to-save-in-memory-sqlite-database-to-a-file-in-perl/53304435#comment93491144_53304435)表明,对内存数据库或磁盘数据库进行操作和查询会产生相同的性能。
一般来说,是的,如果您的数据库位于磁盘上,那么将访问磁盘以执行任何操作SELECT
除非必要的数据缓冲在内存中的某个地方(很可能在 SQLite 本身或磁盘缓存中)。
但请注意这句话,“如果您的数据库位于磁盘上SQLite 还支持内存数据库。如果您有足够的备用 RAM 来保存数据库,并且您要对其执行足够的操作以弥补首先将其复制到内存中的成本,那么可能值得研究。
除了问题中的设置之外,您可以:
my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
$dbh->sqlite_backup_from_file('folder/path/file.db');
然后,您将拥有一个内存数据库,它是原始磁盘数据库的副本,您可以SELECT
无需接触磁盘即可随心所欲(除非磁盘太大并且部分内存被换出)。
如果您对内存数据库进行任何更改,您还需要
$dbh->sqlite_backup_to_file('folder/path/file.db');
before $dbh
如果您想将这些更改保存回磁盘,请断开连接。
请记住,只有在您更改内存副本的同时没有其他进程可能对磁盘副本进行更改时,这才是安全的,因为两个进程都不会知道对另一个进程所做的更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)