C# vs Python 查询 SQLite 数据库

C# vs Python query against SQLite database

我有一个 SQLite 数据库,它有一个 table,有 1800 万行和 24 列。该架构符合

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

我正在以两种方式查询 table - 首先使用 Python 脚本,然后使用暴露给 Excel 和 ExcelDNA 的 C# 函数(最终我更愿意使用 Excel 到 运行 查询,因为某些查询将 return 需要进一步操作的数据行)。

我发现 Python 通常比 Excel 加载项好 3-5 倍,我想知道我的代码是否有问题。下面的示例查询,

query = "SELECT Sum(Amount) FROM my WHERE Level9='STIN_J' AND (AggCode='R_REAL' AND Date='05DEC2016')"

查询通常是运行组合字段Level9Level5AggCodeDateCompanyNameWHERE 子句。所以除了原始的table,我还配置了以下四个索引,

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# 中实际实施这些设置或保留它们的建议,我们将不胜感激。

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