На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Можно ли ускорить работу БД на КПК?
    Сабж.
    В данный момент база достаточно тормознутая. Но таких нужных вещей как 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 и т.д.

                                В чем фишка не могу понять?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0371 ]   [ 17 queries used ]   [ Generated: 25.04.24, 05:29 GMT ]