1

クエリを実行する必要がある Windows モバイル デバイスに大きな.sdfデータベース ファイルがあります。ファイルには 40,000 レコードがあります。クエリの実行にかかる時間を短縮しようとしています。現在は約 8 秒で、ユーザーが結果を待つのにかなりの時間がかかります。

最初は、データセットにリンクされたアダプターDataSetを確立しSqlCeConnectionて埋めることで、 を使用していました。と同様に試してみましたがDataTable、パフォーマンス結果はほぼ同じでした。約 8 秒でクエリを使用DataSetまたは終了します。DataTable

私が最後に試したのは、Reader(). 少し良い結果が得られますが、0.5 秒しかかかりません (クエリは ~ 7.5 秒で終了します)。

string lastName;
lastName = "";
string connectionString = @"Data Source='/Path/To/MyDatabase.sdf' Max Database Size = 128; Max Buffer Size = 1024;";
string strSql = "SELECT LastName FROM employee_list WHERE LastName = 'Johnson'";

using (SqlCeConnection mConnection = new SqlCeConnection(connectionString))
{
    mConnection.Open();

    using (SqlCeCommand mCommand = new SqlCeCommand(strSql, mConnection))
    {
        using (SqlCeDataReader reader = mCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                lastName = (string)reader["LastName"];
            }
        }

        mCommand.Dispose();
    }

    mConnection.Close();
    mConnection.Dispose();
}

どうすればこれをより速くすることができますか?

4

1 に答える 1

0

iOS でも同様の問題があり、100,000 を超えるレコードをクエリする必要がありました。当初、私たちはテクノロジを使用していました... Windows の世界のエンティティ フレームワーク (CoreData として知られている) に似ています... 実行に 15 秒以上かかっていました (クエリの 20 フィールド以上)。これを次のように変更しました。

1) 2 つの部分からなるクエリに SQLite を直接使用するようになりました。パート 1 では 3 つのフィールドのみをクエリし、インデックスが作成されています。

2) パート 2 は、ユーザーが関心を持っている「実際の詳細」を取得するために実行される後続のクエリです。

ユーザーは最初にリストのみを表示し、この時点で完全なデータセットを必要としないため、これはうまくいきました。特定の行を選択する場合にのみ、完全な「パート 2」クエリを実行する必要があります。

これが役立つかどうかはわかりませんが、クエリ時間が最大 1100 ミリ秒に短縮されました。これは、特定のケースでは大幅な改善でした。

于 2015-06-12T04:17:13.363 に答える