针对SQLite数据库的C#vs Python查询

2024-04-19 03:10:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个SQLite数据库,它有一个表,有1800万行和24列。这个模式大致是这样的

Date (VARCHAR)
CompanyName (VARCHAR)
Amount (REAL)
AggCode (VARCHAR)
Level1 ... Level20 (VARCHAR)

我用两种方式查询表-首先用Python脚本,然后用ExcelDNA向Excel公开C#函数(最终我更喜欢使用Excel运行查询,因为有些查询将返回需要进一步操作的数据行)。在

我发现Python的性能通常比Excel插件高出3-5倍,我想知道我的代码是否有问题。下面的查询示例

^{pr2}$

查询通常是结合Level9Level5AggCodeDateCompanyName子句中的字段Level9CompanyName。所以除了原始表,我还配置了以下四个索引:

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中实际实现这些设置或持久化,我们将非常感谢。在


Tags: 代码in示例newdateindexonmy
1条回答
网友
1楼 · 发布于 2024-04-19 03:10:32

我没有正确清除datatable、SQL命令或连接。一旦我将Dispose方法插入到finally块中,C代码的响应会急剧增加,并且在大多数情况下都优于Python。在

相关问题 更多 >