понедельник, 3 декабря 2012 г.

Поиск по индексированым таблицам

Сегодня обратил внимание на то что порядок объявления индексированных полей в таблице значений,  влияет на скорость поиска. Таким образом необходимо отслеживать в каком порядке перечислены поля индекса и поля отбора. В случае нарушения последовательности поиск происходит практически без увеличения производительности.

Например имеем таблицу с колонками Номенклатура и ТипЦен нам необходимо будет искать в этой таблице значения по обоим полям. Поэтому добавляем индексы:

   мТаблицаЦенИОстатков.Индексы.Добавить("Номенклатура");
   мТаблицаЦенИОстатков.Индексы.Добавить("ТипЦен");


В случае если при поиске строк по полям мы напишем:

    Отбор = Новый Структура();
    Отбор.Вставить("ТипЦен",  ТипЦен);
    Отбор.Вставить("Номенклатура", Номенклатура); 
    Строки = мТаблицаЦенИОстатков.НайтиСтроки(Отбор);

При таком варианте написания поиск будет происходить перебором, в отличии, если бы мы написали строки поиска в обратном порядке, т.е. так же как и при объявлении индексов.

    Отбор.Вставить("Номенклатура", Номенклатура);
    Отбор.Вставить("ТипЦен",  ТипЦен
);

Однако даже при правильном указании полей поиска, производительность оставляет желать лучшего. Чем это обосновано не знаю, тем не менее наиболее лучший вариант получается, когда поиск производится по одной колонке, а дальше, в цикле, происходит поиск необходимых строк.

  мТаблицаЦенИОстатков.Индексы.Добавить("Номенклатура");
  Отбор = Новый Структура();
  Отбор.Вставить("Номенклатура",  Номенклатура);
  Строки =  мТаблицаЦенИОстатков.НайтиСтроки(Отбор);
  Для Каждого ТекСтр Из Строки Цикл
         Если ТекСтр.ТипЦен <> ТипЦен Тогда
                  Продолжить;
         КонецЕсли;
         //Код процедуры
КонецЦикла;

Комментариев нет:

Отправить комментарий