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% 的处理器。

我知道我们应该使用单独的存储过程来计算所有项目的百分比,只需要一次调用存储过程/函数,但是任何人都可以分享真实的性能和使用机会的经验吗?

我的另一个项目将使用 SQLite 数据库作为 SOAP 消息记录的容器。我认为数据库会占用很多空间,因为一对请求和响应就需要 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循环中对这里的几个进行此查询。也许尝试通过一个查询 GROUPing by获取所有数据会更有效lid?(当然,删除当前的最后一个 WHERE 条件。或者,如果您不想要表中所有lid条目的数据,而只想要几个选定条目的数据,那么添加一个and s.lid IN (…,…,…)条件。)

于 2013-03-29T13:16:17.857 回答