如何在.NET中使用SQLite提高批量选择查询的性能?
我有一个很大的长数据表存储在SQLite中,可能有500多个条目。我使用System.Data.SQLite包执行查询,并以常规ADO.net方式将数据读取到定制的内存收集结构中 代码F 使用cnxn=newSQLiteConnection@DataSource=C:\Temp\test.db;版本=3;只读=真; 打开 让数据=调整数组大小 让cmd=newSQLiteCommand@SELECTX,Y,Z,AAA来自数据,cnxn 让reader=cmd.ExecuteReader 边读边做 设d={X=reader.GetInt320;Y=reader.GetInt321; Z=reader.GetInt322;AAA=reader.GetDouble3} data.Addd 关闭 问题 System.Data.SQLite是用于此作业的性能最好的库吗?我使用它只是因为它似乎是标准的 这是一种更好的编码方式吗 数据库本身是否有任何有助于此场景的设置/配置 为什么我认为这应该可以走得更快? 我的计算机的理论读取速度为725 mb/s SSD。读取上面的sqlite,我在1s内读取40mb,这是一个有效的实际速度40mb/s如何在.NET中使用SQLite提高批量选择查询的性能?,.net,sqlite,f#,deserialization,.net,Sqlite,F#,Deserialization,我有一个很大的长数据表存储在SQLite中,可能有500多个条目。我使用System.Data.SQLite包执行查询,并以常规ADO.net方式将数据读取到定制的内存收集结构中 代码F 使用cnxn=newSQLiteConnection@DataSource=C:\Temp\test.db;版本=3;只读=真; 打开 让数据=调整数组大小 让cmd=newSQLiteCommand@SELECTX,Y,Z,AAA来自数据,cnxn 让reader=cmd.ExecuteReader 边读边做
另一个令人惊讶的评测结果显示,大约35%的时间都花在reader.Read上。Read[不足为奇]和GetInt32和GetDouble中的其余部分[非常令人惊讶]。为什么要同时将500万行放入内存?没有什么东西能把速度提高到某个点以上。可能想重新考虑一下这个设计。@Hanky웃Panky谢谢,但我真的很想把它们都带到内存中,并无限期地保存在内存中,同时充分了解为什么这可能不是一个好的设计。测量循环:检查读取或添加是否占用了最多的时间。@CL.来自分析:读取占用的时间最多,然后是GetInt32,然后是GetDouble@Hanky웃索引中的列越少,存储在光盘上的叶页就越少。更少的页面意味着将表加载到内存中的磁盘io更少。如果所需的列是聚集索引中列的1/10,那么使用只覆盖这些列的索引可以将从光盘加载到内存中的数据减少90%,从而减少查询时间的1/10。为什么要一次将500万行全部放入内存?没有什么东西能把速度提高到某个点以上。可能想重新考虑一下这个设计。@Hanky웃Panky谢谢,但我真的很想把它们都带到内存中,并无限期地保存在内存中,同时充分了解为什么这可能不是一个好的设计。测量循环:检查读取或添加是否占用了最多的时间。@CL.来自分析:读取占用的时间最多,然后是GetInt32,然后是GetDouble@Hanky웃索引中的列越少,存储在光盘上的叶页就越少。更少的页面意味着将表加载到内存中的磁盘io更少。如果所需的列是聚集索引中列的1/10,那么如果索引仅覆盖这些列,则从光盘加载到内存的数据将减少90%,从而减少查询时间的1/10。