撷取行消耗的处理器时间的100%

问题描述:

这是我们对一个表有DDL脚本:撷取行消耗的处理器时间的100%

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。

谢谢,伙计们!

您是否尝试过使用一些索引来加速您的查询? 我也会建议使用准备和参数化查询,因为在循环中生成新命令非常繁重。

另外,从我的经验来看,SQLite数据库在表中有很多行时非常慢。我们用来清理旧数据的SQLite数据库,我们将它归档到另一个数据库中。

顺便说一句,MS SQL Server CE(它嵌入在proc数据库中,不需要安装)在表中有很多数据时表现得非常完美。我们将其用作处理数千个客户端的Windows服务的缓存数据库。当数据库大小超过1GB时,它开始变慢。

+0

是的,我有一个在盖子上的索引柱。它需要更快的时间(与索引),但仍然报价缓慢和100%的处理器。您能否介绍一下如何对旧数据进行归档?你有几排桌子? – kseen 2013-03-27 04:14:04

要执行查询,SQLite引擎肯定需要CPU时间,这也取决于查询的复杂性。用于SQLite的dotConnect调用sqlite3.dll引擎的函数,然后该引擎定义所需的资源量,包括CPU时间。使用所需CPU时间的事实是一种正常行为。

你说你只对你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的那个GROUPing? (当然,如果你希望数据不是表中所有的lid条目,但只是几个选择的条目,然后添加一个and s.lid IN (…,…,…)条件。)