在SQLCE数据库中获取数千行的速度问题

时间:2011-12-02 13:39:24

标签: c# asp.net sql-server-ce

快速免责声明:在数据库方面,我是一个完整的菜鸟。我知道如何形成一个SQL查询......好吧,这就是它 - 我认为这就足够了。性能优化会在稍后进行。

'后来'已经到了。我需要你的帮助。

我正在对新闻文章进行NLP处理。这些文章来自互联网并存储在数据库中。用户给我一个输入期分析,我提出这段时间的所有文章,分析它们并向他们展示一些图表作为回报。我目前对此有一种相当天真的方法 - 我不限制返回的文章数量。每天约250篇文章* 6个月是45,000条记录,数量相当大。

我正在体验到平庸的获取性能。我正在使用C#+ SQLCE(一个简单的数据库开始,没有设置成本)。我尝试索引数据库无济于事。我怀疑这些问题来自

  • 在一个查询中要求这么多数据。
  • 使用SQLCE

我是否完全疯狂尝试在1次通话中获取数千条记录? SQLCE是一个愚蠢的选择吗?我基本上需要这方面的实用建议。此外,如果你能指出我的好方法来解决我的问题,那就更棒了。

你的帮助对我很有价值 - 提前感谢!

编辑 - 以下是我用来获取文章的命令:

using (SqlCeCommand com1 = new SqlCeCommand(mySqlRequestString, myConnectionString))
        {
            SqlCeResultSet res = com1.ExecuteResultSet(ResultSetOptions.Scrollable);
            if (res.HasRows)
            {
                //Use the get ordinal method so we don’t have to worry about remembering what order our SQL put the field names in.
                int ordGuid = res.GetOrdinal("Id"); int ordUrl = res.GetOrdinal("Url"); int ordPublicationDate = res.GetOrdinal("PublicationDate"); 
                int ordTitle = res.GetOrdinal("Title"); int ordContent = res.GetOrdinal("Content"); int ordSource = res.GetOrdinal("Source");
                int ordAuthor = res.GetOrdinal("Author"); int ordComputedKeywords = res.GetOrdinal("ComputedKeywords"); int ordComputedKeywordsDate = res.GetOrdinal("ComputedKeywordsDate"); 

                //Get all the Articles
                List<Article> articles = new List<Article>();
                if (res.ReadFirst())
                {
                    // Read the first record and get its data
                    res.ReadFirst();
                    Constants.Sources src = (Constants.Sources)Enum.Parse(typeof(Constants.Sources), res.GetString(ordSource));
                    string[] computedKeywords = res.IsDBNull(ordComputedKeywords)?new string[]{}: res.GetString(ordComputedKeywords).Split(',').ToArray();
                    DateTime computedKeywordsDate = res.IsDBNull(ordComputedKeywordsDate) ? new DateTime() : res.GetDateTime(ordComputedKeywordsDate);
                    articles.Add(new Article(res.GetGuid(ordGuid), new Uri(res.GetString(ordUrl)), res.GetDateTime(ordPublicationDate), res.GetString(ordTitle), res.GetString(ordContent), src, res.GetString(ordAuthor), computedKeywords, computedKeywordsDate));
                }
                // Read the remaining records
                while (res.Read())
                {
                    Constants.Sources src = (Constants.Sources)Enum.Parse(typeof(Constants.Sources), res.GetString(ordSource));
                    string[] computedKeywords = res.IsDBNull(ordComputedKeywords) ? new string[] { } : res.GetString(ordComputedKeywords).Split(',').ToArray();
                     DateTime computedKeywordsDate = res.IsDBNull(ordComputedKeywordsDate) ? new DateTime() : res.GetDateTime(ordComputedKeywordsDate);
                    articles.Add(new Article(res.GetGuid(ordGuid), new Uri(res.GetString(ordUrl)), res.GetDateTime(ordPublicationDate), res.GetString(ordTitle), res.GetString(ordContent), src, res.GetString(ordAuthor), computedKeywords, computedKeywordsDate));
                }
                return articles.ToArray();
            }
        }

1 个答案:

答案 0 :(得分:0)

  1. 您一次只能获取一页结果。
  2. SqlCE非常适合测试或使用率很低的应用程序,但您应该考虑SQL Express或完整的SQL Server。