Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 若首先将SQLite表加载到.NET DataTable中,然后使用DataTable.Select,则c中的查询速度比System.Data.SQLite快得多。为什么?_C#_Database_Sqlite - Fatal编程技术网

C# 若首先将SQLite表加载到.NET DataTable中,然后使用DataTable.Select,则c中的查询速度比System.Data.SQLite快得多。为什么?

C# 若首先将SQLite表加载到.NET DataTable中,然后使用DataTable.Select,则c中的查询速度比System.Data.SQLite快得多。为什么?,c#,database,sqlite,C#,Database,Sqlite,我在SQLite数据库中有表。 我使用C和System.Data.SQLite DLL访问数据库。 我的测试显示以下查询速度非常慢: string sql = "select column1, column2 from table_1 where column1=1 and column2=2" SQLiteCommand mycommand = new SQLiteCommand(cnn); mycommand.CommandText = sql; SQLiteDataReader read

我在SQLite数据库中有表。 我使用C和System.Data.SQLite DLL访问数据库。 我的测试显示以下查询速度非常慢:

string sql = "select column1, column2 from table_1 where column1=1 and column2=2" 
SQLiteCommand mycommand = new SQLiteCommand(cnn);
mycommand.CommandText = sql;
SQLiteDataReader reader = mycommand.ExecuteReader();
tb.Load(reader);
reader.Close();
但如果我先将整个表加载到.NET DataTable中,如下图所示,然后使用DataTable.Select,则速度要快得多:

string sql = @"SELECT * FROM '" + data_table_name + "'" + ";\n";
SQLiteCommand mycommand = new SQLiteCommand(cnn);
mycommand.CommandText = sql;
SQLiteDataReader reader = mycommand.ExecuteReader();
tb.Load(reader);
reader.Close();
DataRow[] rows = tb.Select("column1=1 AND column2=2");
如果在加载整个表后有多个查询,则差异更为显著

这实际上是在.NET中缓存整个表。我尝试了不同类型的表,它们有不同的大小和主键,它们的行为都是一样的

现在,我知道我们会使用这样的优化,但不知道是否还有其他解决方法

此外,我还发现,如果表的索引是string而不是integer,那么只要对字符串进行短测试(最多10个字符串),直接SQL查询实际上会更快,而无需缓存表。但是,在缓存表之后,使用整数索引要比使用字符串索引快


有人可以解释这种行为吗?

您是否尝试过先加载所有数据,然后再使用过滤查询加载?我想知道运行的第一个查询是否有一些启动开销会影响您的基准测试。表中是否有相关的索引?还有,数据库最近被清空了吗?斯坦利,没有,以前没有查询过。数据库是在测试程序之外新创建的,测试程序只做简单的查询。Hanna,我尝试过不同类型的索引,整数,字符串短或长,一个索引,两个索引,三个索引,使它们成为主键,或者现在,所有内容…基本上,select*from aTable很快,一旦有Where。。。,它变慢了,我使用了一个性能分析工具ANTs,发现在SQLite_step_3中的System.Data.SQLite花费了很多时间…@user1943928也许可以尝试获取System.Data.SQLite源代码的副本并将其添加到您的项目中以代替DLL,然后在调用第一个代码段时逐步执行,看看有什么慢。可能是您在他们的代码中发现了问题。