0

テーブル用に取得した DDL スクリプトを次に示します。

CREATE TABLE [stat_ping] (
  [lid] INT NOT NULL ON CONFLICT IGNORE, 
  [ping] NUMERIC(6, 2) NOT NULL ON CONFLICT IGNORE, 
  [timeping] DATETIME NOT NULL ON CONFLICT IGNORE);

テーブルのデータ サンプル: </p>

lid ping    timeping
2036    1   2013-02-26 10:46:27.000
2002    1   2013-02-26 10:46:27.000
2006    1   2013-02-26 10:46:27.000
2015    1   2013-02-26 10:46:27.000
2009    1   2013-02-26 10:46:27.000
2000    1   2013-02-26 10:46:27.000
2016    1   2013-02-26 10:46:27.000
2031    1   2013-02-26 10:46:27.000
2016    1   2013-02-26 10:46:27.000
2018    1   2013-02-26 10:46:27.000
2012    1   2013-02-26 10:46:27.000
2008    1   2013-02-26 10:46:28.000
2019    1   2013-02-26 10:46:29.000
2001    0   2013-02-26 10:46:29.000
2005    1   2013-02-26 10:46:29.000
113     1   2013-02-26 10:46:30.000

このようなクエリを使用して、そのデータによってサービスの可用性の割合を計算します。

lock (Logger._lockObj)
{
    using (SQLiteConnection sql = new SQLiteConnection(ConfigurationManager.ConnectionStrings["SQLite"].ToString()))
    {
        sql.Open();
        foreach (var item in kk)
        {
            item.ping.stconn = 0;
            string sqlquery = "select (sum(s.ping)*100/count(s.timeping)) from stat_ping as s where s.timeping between datetime('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "','-1 day') and datetime('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "') and s.lid=" + item.lid;
            using (SQLiteCommand comm = new SQLiteCommand(sqlquery, sql))
            {                                
                item.ping.stconn = Convert.ToByte(comm.ExecuteScalar());
            }
        }
    }
}

接続には Devart SQLite データ プロバイダーを使用します。テーブル stat_ping には、約 100000 行が含まれています。したがって、5 つのアイテムの場合、パーセントの計算に約 6 ~ 7 秒かかり、100% のプロセッサが必要になります。

ストアド プロシージャ/関数を 1 回呼び出すだけで、すべてのアイテムの割合を計算するために個別のストアド プロシージャを使用する必要があることはわかっていますが、実際のパフォーマンスと機会の使用経験について誰かが共有できますか?

もう 1 つのプロジェクトでは、SQLite データベースを SOAP メッセージ ロギングのコンテナーとして使用します。要求と応答の 1 つのペアで 150KB しか必要としないため、データベースは多くのスペースを必要とする可能性があると思います。

みんなありがとう!

4

3 に答える 3

0

クエリを高速化するためにインデックスを使用してみましたか? ループ内で新しいコマンドを生成するのは非常に重いため、準備済みのパラメーター化されたクエリを使用することも提案します。

また、私の経験から、テーブルに多くの行がある場合、SQLite データベースは非常に遅くなります。以前は古いデータの SQLite データベースをクリーンアップし、それを別のデータベースにアーカイブしました。

ところで、MS SQL Server CE (組み込みのインプロセス データベースであり、セットアップは必要ありません) は、テーブルに大量のデータがある場合に完璧に動作します。数千のクライアントを扱う Windows サービスのキャッシング データベースとして使用しました。データベースのサイズが 1GB を超えると、速度が低下し始めます。

于 2013-03-27T03:48:23.853 に答える
0

クエリを実行するために、SQLite エンジンは確かに CPU 時間を必要としますが、これはクエリの複雑さにも依存します。dotConnect for SQLite は sqlite3.dll エンジンの関数を呼び出し、このエンジンは CPU 時間を含む必要なリソース量を定義します。必要な CPU 時間を使用するのは正常な動作です。

于 2013-03-29T12:42:18.333 に答える
0

列にインデックスしかないと言いますが、ここでlidデータをフィルタリングしていますtimeping

 string sqlquery = "select (sum(s.ping)*100/count(s.timeping))
   from stat_ping as s where s.timeping between
   datetime('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "','-1 day')
   and
   datetime('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')
   and s.lid=" + item.lid;

– で追加のインデックスを試してくださいtimeping

lidまた、ループ内のいくつかに対してこのクエリを実行していることにも気付きました。おそらく、 1 つのクエリですべてのデータを取得しようとする方が効率的で、GROUPing by lid? (もちろん、現在の最後の WHERE 条件を削除します。またはlid、テーブル内のすべてのエントリではなく、いくつかの選択されたエントリのデータが必要な場合は、条件を追加しand s.lid IN (…,…,…)ます。)

于 2013-03-29T13:16:17.857 に答える