我有一个SQLite数据库,它有一个表,有1800万行和24列。这个模式大致是这样的
Date (VARCHAR)
CompanyName (VARCHAR)
Amount (REAL)
AggCode (VARCHAR)
Level1 ... Level20 (VARCHAR)
我用两种方式查询表-首先用Python脚本,然后用ExcelDNA向Excel公开C#函数(最终我更喜欢使用Excel运行查询,因为有些查询将返回需要进一步操作的数据行)。在
我发现Python的性能通常比Excel插件高出3-5倍,我想知道我的代码是否有问题。下面的查询示例
^{pr2}$查询通常是结合Level9
、Level5
、AggCode
、Date
、CompanyName
子句中的字段Level9
、CompanyName
。所以除了原始表,我还配置了以下四个索引:
CREATE INDEX idx1 on my(Level09, AggCode);
CREATE INDEX idx2 on my(Level05, AggCode);
CREATE INDEX idx3 on my(CompanyName, AggCode);
CREATE INDEX idx4 on my(Date, AggCode);
这是运行查询的示例Python代码
import sqlite3 as lite
...
con = lite.connect("C:\temp\my.db")
cur = con.cursor()
cur.execute(query)
data = cur.fetchall
for row in data:
for i in range(len(row)):
print row[i],
print "\t",
总的来说,这个代码运行得相当好。在
这是运行查询的示例C代码
using System.Data.SQLite;
...
string constr = "Data Source=C:\temp\my.db;Version=3;";
SQLiteConnection conn = new SQLiteConnection(constr);
SQLiteCommand command = new SQLiteCommand(query, conn);
conn.Open();
SQLiteDataAdapter sda = new SQLiteDataAdapter(command);
DataTable dt = new DataTable();
sda.Fill(dt);
sda.Dispose();
command.Dispose();
conn.Dispose();
object[,] ret = new object[dt.Rows.Count, dt.Columns.Count];
int rowCount = 0;
int colCount = 0;
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
ret[rowCount, colCount] = col.ColumnName;
colCount++;
}
rowCount++;
}
...
return ret;
Python或C代码是次优的吗?例如,我应该使用SQLiteDataReader
而不是SQLiteDataAdapter
?我很感激你的想法。在
结果集本身非常小,在某些情况下只有一个数字,所以我不会认为ExcelDNA会给这个过程增加空间。示例Python查询大约需要15秒,而C最多需要1分钟。在
最后,修改PRAGMA
设置将如何影响性能?关于一些通用设置的建议,我的首要任务是查询的速度?在
另外,对于如何在Python、C中实际实现这些设置或持久化,我们将非常感谢。在
我没有正确清除datatable、SQL命令或连接。一旦我将
Dispose
方法插入到finally
块中,C代码的响应会急剧增加,并且在大多数情况下都优于Python。在相关问题 更多 >
编程相关推荐