テーブル用に取得した 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 しか必要としないため、データベースは多くのスペースを必要とする可能性があると思います。
みんなありがとう!