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')"
查询通常是运行组合字段Level9
、Level5
、AggCode
、Date
、CompanyName
在WHERE
子句。所以除了原始的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。
我有一个 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')"
查询通常是运行组合字段Level9
、Level5
、AggCode
、Date
、CompanyName
在WHERE
子句。所以除了原始的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。