2010-11-18 64 views
4

私はコマンドラインから新しいSQLiteデータベースを作成しましたが、SQLiteデータベースへのODBC接続があります。
デフォルトでは、クエリを発行すると同期が "ON"になり、INSERTパフォーマンスが大幅に低下します。PRAGMA synchronous = OFFでSQLiteをより速く実行する方法

SQLiteデータベースをデフォルトでPRAGMA synchronous = OFFにするには、SQLコマンドを送信する必要はありません。 .INIファイルなどを作成することはできますか?

+3

おそらく、すべてのINSERTを単一のトランザクション( 'BEGIN; INSERT ...; INSERT ...; [...]; COMMIT;')に囲みたいと思うかもしれません。 。そうしないとパフォーマンスが大幅に低下します。これが非常にうまく説明されているSQLiteのFAQを参照してください。 – Benoit

+0

私はトランザクションのことについて知っていますが、トランザクションでは使用できないJavaで開発されたアプリケーションがあります.SQLliteを停止して各挿入を検証し、一時停止を作成する方法を理解しない限り、INSERTは非常に遅く、 – djangofan

答えて

10

残念ながら誰もがこの質問を6日間放置した後、私は最後に答えを見つけ出しました。 SQLite ODBC driverが答えのようです。 DSNを作成すると、DSN設定でSyncを "OFF"に設定することができます。とても便利。

+1

フル同期では96rps、通常の同期では120rps、同期オフでは約260rpsになります。違いはありませんが、少なくともその何か。 – djangofan

+0

を比較すると、私はMS Accessで約600rpsを得ます。 – djangofan

+1

+1あなた自身の質問に答えてください。 –

3

SQLiteはデフォルトでFULL同期で動作します。 INIはありません。接続されている場合を除いて変更するものはありません。ただし、これはセッションごとに1回だけ設定する必要があるため、プロジェクトの接続機能を変更して接続後に「PRAGMA synchronous = OFF」コマンドを追加することができます。それは実際には最もクリーンで最速のアプローチです。

しかし、SQLiteがデフォルトで同期をオフにしてデータベースを開くことを本当に望む場合は、別のデフォルトでSQLiteを再コンパイルすることができます。

変更:

safety_level = 3; 

へ:現在のリリース(3.7.3)、sqlite-amalgamation sourceのsqlite.cに変数safety_level探しの場合

safety_level = 1; 

(はいそれはシェル設定からのものです。)openDatabase関数(そしてもし望むならattachFunc)。


あなたが本当に取引を考慮することは非常に少なくとも、あなたが持っているだろうコメントで述べたように、このプロセスは、加速が必要な場合。道を進むと、これが好ましい解決策です。それは最も簡単ではないかもしれませんし、可能な限り多くの時間をとることもありますが、それは長期的に維持するのが最もクリーンで、最も安全で、最も簡単です。

+0

偉大な答えをありがとう。私は必要なものではありませんでしたが、私はあなたに感謝したいと思います。 – djangofan

+0

@djangofan:あなたは大歓迎です。特別なビルドを行うよりもきれいな解決策を見つけられたことをうれしく思っています。 – MPelletier

1

Javaでは、getConnectionメソッドで次のスニペットを使用します。新しい接続が確立されると、同期が無効になります。

Connection con = DriverManager.getConnection("jdbc:sqlite:lms.db");   
    Statement st = con.createStatement();   
    String sql="PRAGMA synchronous=OFF"; 
    st.execute(sql); 
+0

はい、これもC#の標準的なアプローチです。 – TheLegendaryCopyCoder

関連する問題