这是我们为表格获取的 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% 的处理器。
我知道我们应该使用单独的存储过程来计算所有项目的百分比,只需要一次调用存储过程/函数,但是任何人都可以分享真实的性能和使用机会的经验吗?
我的另一个项目将使用 SQLite 数据库作为 SOAP 消息记录的容器。我认为数据库会占用很多空间,因为一对请求和响应就需要 150KB。
多谢你们!