На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Оптимизация выборки данных , SQL, C#
    Имею следующий код (VS2012, C#):

    ExpandedWrap disabled
      SqlCommand command = new SqlCommand("", sqlConnection1);
      SqlDataReader reader;
      string[] array; // Некий массив, длина которого может достигать >10000
       
      for (int i = 0; i < array.Length; i++)
      {
         command.CommandText = "SELECT [ID] FROM [Table] WHERE [Param] = '" + array[i] + "'";
         reader = command.ExecuteReader();
                    
          if (reader.HasRows)
          {
            // ...
            // reader.Close();
          }
          else
          {
            // ...
            // reader.Close();
          }              
      }



    БД - локальная формата *.mdf
    Таблица "Table" отсортирована по столбцу "Param" (индекс тоже по этому столбцу).

    При длине массива "array" больше 10000 всё подвисает...

    Можно ли оптимизировать код?

    P.S. command.ExecuteScalar() дает примерно тот же результат
    Сообщение отредактировано: cyt -
      Некоторой оптимизацией будет перенос sql кода в хранимую процедуру.
      Выполнение всех 10К запросов в один заход должно также ускорить код.

      Все запросы в один заход можно выполнить если елементы массива сджойнить (ето кривой подход):
      ExpandedWrap disabled
        SELECT [ID] FROM [Table] WHERE [Param] IN ('''" + array[0].Replace("'","''") + "'',''" + atrray[1]].Replace("'","''")  + "'',''" ...

      либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру.
      Сообщение отредактировано: MIF -
        Цитата MIF @
        либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру.

        MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще.
          Цитата Craft @
          Цитата MIF @
          либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру.

          MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще.

          И каким образом это можно сделать? Я про выбор пачками.
            Цитата Craft @
            Цитата (Craft @ Сегодня, 11:35)
            Цитата (MIF @ Сегодня, 09:09)
            либо создать параметр типа xml, впихнуть в него все значения массива и передат' его в хранимую процедуру.

            MS SQL Server и SQL CE очень медленно работают с расбором xml. Проверено на практике. Врятли это ускорит процес. Можно сделать такой вариант как предложили вы. Но я бы вибирал пачками например по 1К записей. Так и дебажить проще.

            И каким образом это можно сделать? Я про выбор пачками.

            Я думал можно попробовать указывать диапазон виборки через between. Но сейчас сомневаюсь будет ли это работать быстрее. Попробуйте тот вариант что подсказал вам MIF с хранимой процедурой. У вас сложная нагрузка на выборку данных. Може хранимка хоть немного поможет.
              Если мне не изменяет память, то SQL CE не поддерживает хранимые процедуры.

              Добавлено
              ExpandedWrap disabled
                string[] array; // Некий массив, длина которого может достигать >10000

              Плохое решение, сожрет кучу памяти на хранение условий выборки. Не понятно, для чего хранить такие объемы статической информации?
                а может есть способ получить этот загадочный массив на стороне сервера БД и сделать просто подзапрос в условии фильтрации?
                  Цитата
                  а может есть способ получить этот загадочный массив на стороне сервера БД и сделать просто подзапрос в условии фильтрации?

                  У ТС локальная база. ;)
                    не вижу связи :) если предположим что Table и таблица из которой получено 10000 записей находятся в одной БД то всё классно будет работать на уровне БД, ведь никто не написал откуда взялось такое здоровенное количество параметров, вряд-ли через UI ;)
                      Цитата
                      если предположим что Table и таблица из которой получено 10000 записей находятся в одной БД то всё классно будет работать на уровне БД

                      В таком случае, не понятно вообще зачем фетчить 10к строк в память...
                        вот и я том - откуда то они взялись, может не проблема сервера БД что он как то плохо работает с таким адским скриптом, а в том что скрипт адский ;)
                          Хм. Ну вот у меня 10000 параметров (массив array), значения которых определяются в момент выполнения.
                          Как по-другому добавить их значения в запрос выборки я не знаю.
                          Сообщение отредактировано: cyt -
                            Ну а запрос с IN попробовал? Не работает?
                              Цитата MIF @
                              Ну а запрос с IN попробовал? Не работает?

                              К сожалению, нет.
                                cyt, извини за настойчивость, раскрой эту страшную тайну - по какой логике и откуда ты получаешь 10000 записей.
                                P.S: я просто не могу поверить что не из БД.
                                Сообщение отредактировано: nvn -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0424 ]   [ 15 queries used ]   [ Generated: 21.05.24, 12:37 GMT ]