【问题标题】:SQL Query gets slower with each iteration?SQL 查询每次迭代都会变慢?
【发布时间】:2011-10-11 12:00:07
【问题描述】:

有没有办法让这个 SQL 查询更快?它在.sdf 数据库中搜索匹配的单词。数据按字母顺序排列。目前搜索大约需要 10-15 秒,搜索的第一次迭代似乎相当快但是每次迭代搜索都会变慢?为什么是这样?抱歉,这是我第一次接触 SQL。

private void Search_Database() //Searches SQL Database for matching words
{
    Possible_Words.Clear();
    using (var cn = new SqlCeConnection(@"Data Source=|DataDirectory|\Resource\Wordlist.sdf"))
    {
        cn.Open();
        using (var cmd = cn.CreateCommand())
        {
            string[] Final_Search_Array = (string[])Packaged_Search_Array.ToArray(typeof(string)); // Receives  and Unwraps Packaged Array
            int Search_Array_Index = Final_Search_Array.Length - 1;
            for (; Search_Array_Index != -1; Search_Array_Index = Search_Array_Index - 1)
            {
                switch (Final_Search_Array[Search_Array_Index].Length)
                {
                    case 2:
                        Search_Table = "[2 Letter Words]";
                        break;
                    case 3:
                        Search_Table = "[3 Letter Words]";
                        break;
                    case 4:
                        Search_Table = "[4 Letter Words]";
                        break;
                    case 5:
                        Search_Table = "[5 Letter Words]";
                        break;
                    case 6:
                        Search_Table = "[6 Letter Words]";
                        break;
                }
                cmd.CommandText = "Select * from " + Search_Table + " where [Melted] like '%" + Final_Search_Array[Search_Array_Index] + "%'";
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Possible_Words.Add(reader["Word"].ToString());
                    }
                }
            }
        }
        cn.Close();
    }
    FullList_PossibleWords.Add(Possible_Words);
}

【问题讨论】:

  • SqlParameter 为什么要浪费宝贵的 CPU 周期来保护我的代码。
  • 耶稣有一个观点(尽管它可能很钝)。使用SqlParameters 构建您的命令语句。此外,如果您在每次迭代循环时都重新打开 SqlConnection,则应将 using SqlCeConnection 语句放在循环之外。

标签: c# sql performance sql-server-ce


【解决方案1】:

一些提示:

  1. 不要在查询中使用*,而是使用所有字段名称。

  2. Melted 字段上创建索引。

  3. 在创建 Connection 对象和命令之外构建您的查询

  4. 在代码开头不需要时打开连接

如果您考虑这些提示,您的代码会变得更快。

【讨论】:

  • 实际上,对于单用户,在内存数据库(至少是 SQL Compact)中,连接处理的一般规则并不适用。创建它们会涉及很多开销,如果可能的话,它们应该被重用。
  • 这个 SO 问题涵盖了这一点。 stackoverflow.com/questions/386223/…
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2015-05-18
  • 2021-10-14
  • 2016-08-19
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2020-01-05
相关资源
最近更新 更多