2016-12-08 14 views
3

私は1800万行と24列の単一のテーブルを持つSQLiteデータベースを持っています。 Pythonスクリプトで最初の、そしてその後、ExcelDNAを使用してExcelにさらされているC#の機能を(最終的に私が使用することを好むだろう - スキーマがC#とSQLiteデータベースに対するPythonクエリ

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

、のラインに沿っている私はテーブルの二つの方法を照会していますいくつかのクエリとしてクエリを実行するExcelは、さらに操作する必要があるデータの行を返します)。

私は、Pythonが通常Excelアドインよりも3倍から5倍の性能を上回ることがわかりました。私のコードに何か問題があるかどうかは疑問でした。以下のサンプル・クエリ、

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

クエリです通常WHERE句のフィールドLevel9Level5AggCodeDateCompanyNameを組み合わせて実行します。だから、離れて生のテーブルから、私はまた、次の4つの指標、

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#のコードのいずれかいますか?たとえば、SQLiteDataAdapterの代わりにSQLiteDataReaderを使用する必要がありますか?どんな考えにも感謝します。

結果セット自体は非常に小さく、場合によっては単一の数値なので、ExcelDNAがプロセスにヘッドルームを追加しているとは思っていませんでした。サンプルのPythonクエリは約15秒かかりますが、C#は最大1分です。

最後に、PRAGMAの設定を改訂するとパフォーマンスにどのような影響がありますか?私の最優先事項であるいくつかの一般的な設定に関する提案は、クエリの速度ですか?

また、Python、C#でこれらの設定を実際に実装する方法や、それらを永続させる方法についての提案は非常に高く評価されます。

答えて

0

データテーブル、SQLコマンドまたは接続を適切にパージしていませんでした。ブロックfinallyDisposeメソッドをスタックすると、C#コードのレスポンスが大幅に向上し、ほとんどの場合、Pythonを上回りました。

関連する問題