На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Можно ли ускорить работу БД на КПК?
    Сабж.
    В данный момент база достаточно тормознутая. Но таких нужных вещей как fulltextsearch или хотя бы index я не наблюдаю...

    Я базу редактирую в самам КПК (изврат, не правда ли? но на компе у вижлстудии редактор sdf баз слетел напрочь).

    Что может помочь оптимизировать базу? Запросы нормальные.
      В общем, база - .sdf
      Подключается так:
      ExpandedWrap disabled
        String ds = "Data Source=";
                    ds = ds + "\"";
                    ds = ds + filename;//application folder
                    ds = ds + "\\base\\basefile.sdf";
                    ds = ds + "\"";
                    ds=ds+"; password='megapassword=)'";
                    Connection = new SqlCeConnection(ds);
                    Connection.Open();

      Запрос делается так:
      ExpandedWrap disabled
        SqlCeDataReader rdr = null;
                    try
                    {
                        listBox1.Items.Clear();
                        SqlCeCommand cmd = new SqlCeCommand("Select name from basetable1 where name like '%abc%'", Connection);
                        rdr = cmd.ExecuteReader();
                        while (rdr.Read())
                        {
                            listBox1.Items.Add(rdr.GetString(0));
                            ogr++;
                            if (ogr > 100)
                                break;
                        }
                    }
                    finally
                    {
                        rdr.Close();
                    }


      Запрос долгий. Индексации в sdf не нашел, fulltextsearch тоже. Каким нибудь другим образом ускорить можно?
        ExpandedWrap disabled
          SqlCeCommand cmd = new SqlCeCommand("Select TOP 100 name from basetable1 where name like '%abc%'", Connection);
                          rdr = cmd.ExecuteReader();
                          while (rdr.Read())
                          {
                              listBox1.Items.Add(rdr.GetString(0));
          Проблема обнаружена.
          SQL запрос следующего типа:
          String sql = "Select column1 from tab1,tab2,tab3 where (tab1.col1=tab2.column1) and (tab2.column1=tab3.col1) and (tab3.val=tab1.val)";

          Код обработки:
          reader = command.ExecuteReader();
          // тут со временим все ок
          listBox1.Items.Clear();
          listBox1.BeginUpdate();
          while (reader.Read())
          {
          listBox1.Items.Add(reader.GetString(0));
          }
          listBox1.EndUpdate();
          // эта часть берет на себя бОльшую часть времени

          Может, можно как-нибудь в таблицу считывать а не построчно? Тогда, авось, быстрее будет

          -Added
          Цитата MIF @
          ExpandedWrap disabled
            SqlCeCommand cmd = new SqlCeCommand("Select TOP 100 name from basetable1 where name like '%abc%'", Connection);
                            rdr = cmd.ExecuteReader();
                            while (rdr.Read())
                            {
                                listBox1.Items.Add(rdr.GetString(0));

          Это понятно. Но для 10 записей 3 секунды на цикл описанный мною выше - это слишком круто.
          Сама же команда выполняется моментально.
          На сотню ограничение есть.

          Можно ли получить доступ ко всему результату? Ко всем rows результата сразу по, например, индексам
            Цитата Slukad @
            Можно ли получить доступ ко всему результату? Ко всем rows результата сразу по, например, индексам
            Да, с использованием SqlCeDataAdapter и DataTable (или DataSet).
              А это может повысить скорость работы БД ?
                Скорее всего, нет.
                  Ладно, еще какие-нибудь способы ускорения работы БД есть?
                    Цитата Slukad @
                    Ладно, еще какие-нибудь способы ускорения работы БД есть?

                    Оформи свой запрос хранимой процедурой.
                      Цитата Slukad @
                      Ладно, еще какие-нибудь способы ускорения работы БД есть?
                      что тебя привязывает к данной БД. Мож, ее сменить можно?
                        Juice, как?
                        MIF, очень сильно привязывает
                          Возьми создай в БД хранимую процедуру.

                          Пишу по памяти так что не обессудь :)

                          ExpandedWrap disabled
                            CREATE PROCEDURE FindNames
                                @name varchar(128)
                            AS
                            BEGIN
                                SELECT [Name] from basetable1 where [Name] like '%@name%';
                            END


                          Тогда вызывать все это дело ты сможешь так:

                          ExpandedWrap disabled
                            SqlCeCommand cmd = new SqlCeCommand("FindNames", Connection);
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parammeters.AddWithValue("@name", "abc");
                            SqlCeDataReader reader = cmd.ExecuteReader();
                            Видимо нельзя будет хранимку создать это ведь у тебя Compact Edition, а в нем нет хранимых процедур.:(
                              У меня вообще начинает складываться впечатление, что SQL CE такая жопа...
                                Короче, анализ сделал. Сижу в ауте.
                                ExpandedWrap disabled
                                              DateTime d3 = DateTime.Now;
                                              command = new SqlCeCommand(s, Connection);
                                              reader = command.ExecuteReader();
                                              DateTime d4 = DateTime.Now;
                                              String sss = "";
                                              while (true)
                                              {
                                                  DateTime opus = DateTime.Now;
                                                  if (reader.Read())
                                                  {
                                                      DateTime opusdei = DateTime.Now;
                                                      TimeSpan tt = opusdei.Subtract(opus);
                                                      sss = sss + "\n time " + tt.ToString();
                                                      listBox1.Items.Add(reader.GetString(0));
                                                  }
                                                  else
                                                  {
                                                      break;
                                                  }
                                              }
                                              DateTime d5 = DateTime.Now;
                                              TimeSpan t3 = d4.Subtract(d3);
                                              TimeSpan t4 = d5.Subtract(d4);
                                              TimeSpan t5 = d5.Subtract(d3);
                                              String sh = "Time spanning\n" +
                                                  "\nExecuting: " + t3.ToString() +
                                                  "\nFilling: " + t4.ToString() +
                                                  "\nOvA: " + t5.ToString();
                                              log.WriteLine(sh);
                                              log.WriteLine(sss);
                                              MessageBox.Show(sss);


                                В логе строки:
                                Общая статистика:
                                Executing - 1c
                                Filling - 34 c
                                Jverall - 35 c.

                                Ага, думаю. Фигня. Результатов вывелось всего два!!! (их столько в базе и было).
                                Смотрю временные границы вывода результатов:
                                time 19c
                                time 5c
                                Первый результ reader.Read() выполнялся 19 сек, второй - 5. И это не 34...

                                Делаю с тем же sql запросом. Изменяю только слово поиска. КОличество найденного - около сотни.
                                Executing - 1
                                Filling - 34.
                                Временные границы:
                                time 1
                                time 0
                                time 1
                                time 2 и т.д.

                                В чем фишка не могу понять?
                                  Т.к. индексов нет, то идёт сканирование всей таблицы. Время сканирования = 34 секунды.
                                  Для проверки сделай запрос, который возвращает 2 записи из конца таблицы. Ожидаемый ресультат: 34 сек, 0 сек, общее время = 34 сек..
                                  И запрос, возвращающий 2 записи из начала раблицы. Озйидаемый результат: 0 сек, 0 сек, общее время = 34 сек..

                                  Добавлено
                                  Цитата Slukad @
                                  time 19c
                                  time 5c
                                  Первый результ reader.Read() выполнялся 19 сек, второй - 5. И это не 34...
                                  10 cекунд потрачено на проход последней части таблицы.
                                    Красиво... И индексов, значит, в SQLCe нет вообще... Блин...
                                      В КПКшном SQL CE ЕСТЬ индексы.

                                      Вопрос.
                                      Есть таблица типа:
                                      ExpandedWrap disabled
                                        name nvarchar(50)
                                        sname nvarchar(50)
                                        fname nvarchar(50)
                                        idf int
                                        opis ntext
                                        opis2 ntext

                                      Нужно создать для нее индексы на основе того, что будет использоваться
                                      ExpandedWrap disabled
                                        Select name from table where opis like '%[string]%';
                                        Я не встречал БД, в которых можно индексировать текстовые поля. Я имею в виду стандартные индексы. Маловероятно, что твоя БД умеет это делать.
                                        Slukad, ищи, есть ли в БД full-teхt indeхes.
                                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                        0 пользователей:


                                        Рейтинг@Mail.ru
                                        [ Script execution time: 0,0645 ]   [ 15 queries used ]   [ Generated: 16.07.25, 05:07 GMT ]