这是我们为表格获得的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);
表的数据样本:
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。
谢谢,伙计们!
答案 0 :(得分:0)
您是否尝试过使用某种索引来加快查询速度? 我也建议使用准备和参数化查询,因为在循环中生成新命令非常繁重。
另外,根据我的经验,当表中有很多行时,SQLite数据库很慢。我们曾经清理旧数据的SQLite数据库,我们将其存档到另一个数据库中。
BTW,MS SQL Server CE(它是嵌入式进程内数据库,不需要设置)当表中有大量数据时表现得非常完美。我们用作Windows服务的缓存数据库,处理数千个客户端。当数据库大小超过1GB时,它开始变慢。答案 1 :(得分:0)
要执行查询,SQLite引擎肯定需要CPU时间,这也取决于查询复杂性。 dotConnect for SQLite调用sqlite3.dll引擎的函数,然后此引擎定义所需的资源量,包括CPU时间。使用所需CPU时间的事实是正常行为。
答案 2 :(得分: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
进行了这个查询。也许通过一个查询尝试获取所有数据会更有效率,按lid
进行分组? (当然,删除当前的最后一个WHERE条件。或者,如果您希望数据不是表中的所有lid
条目,而只是选择几个,那么添加and s.lid IN (…,…,…)
条件。)