Вход | Регистрация


Информационные технологии :: Математика и алгоритмы

Помогите соптимизировать запрос

Помогите соптимизировать запрос
Я
   organizm
 
09.01.13 - 15:42
Нужно выбрать спецификации где по есть требуемая продукция и материал. Продукция и материал отбираются по коду. Сделал такой запрос: ВЫБРАТЬ
   Спец.Ссылка КАК Спец,
   Вых.Номенклатура КАК Продукция,
   Вх.Номенклатура КАК Материал
ИЗ
   Справочник.СпецификацииНоменклатуры КАК Спец
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК Вых
       ПО (Вых.Ссылка = Спец.Ссылка)
           И (Вых.НомерСтроки = 1)
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Вх
       ПО Спец.Ссылка = Вх.Ссылка
ГДЕ
   Вх.Номенклатура.Код = &КодНом
   И Вых.Номенклатура.Код = &КодПрод

работает подозрительно медленно. Посоветуйте что не так?
 
 
   ДенисЧ
 
1 - 09.01.13 - 15:43
добавь индексы.
Ищи не по коду, а по ссылке.
   organizm
 
2 - 09.01.13 - 15:43
строк таблицы "ИсходныеКомплектующие" что-то около 600 тыс.
   organizm
 
3 - 09.01.13 - 15:44
по ссылке не подходит, так как искать приходится из внешних данных, т.е. по коду
   tdm
 
4 - 09.01.13 - 15:45
(3) условие же на равно а не на подобно, т.е. в установке параметров запроса проще ссылку получить
   organizm
 
5 - 09.01.13 - 15:45
тупит как раз на таблице "ИсходныеКомплектующие"
   acsent
 
6 - 09.01.13 - 15:45
найди ссылку по коду отдельным запросом
   tdm
 
7 - 09.01.13 - 15:46
ну и условия из раздела ГДЕ в связи двух таблиц наложить лучше)
   acsent
 
8 - 09.01.13 - 15:46
добавь индекс по номенклатуре
   organizm
 
9 - 09.01.13 - 15:47
(7) пробовал, не почувствовал разницы
   tdm
 
10 - 09.01.13 - 15:47
(8) +1
 
 Рекламное место пустует
   Lexusss
 
11 - 09.01.13 - 15:51
sql + индекс по номенклатуре + переделать на внутреннее соединение.
Подробнее надо смотреть наполненность и статистику таблицы, а так же планы выполнения. Весьма похоже, что SQL сначала сращивает таблицы, а только затем накладывает условия.
   MrStomak
 
12 - 09.01.13 - 15:52
основная проблема - отсечение записей после запросы. Надо писать условия по коду в условиях соединения. А для использования индекса по номенклатуре, нужно использовать временные таблицы.
что-то вроде
Выбрать
Вых.Номенклатура КАК Продукция
Поместить ВтПродукция
Из Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК Вых
Где Вх.Номенклатура.Код=&КодНом ;

Выбрать Вх.Номенклатура КАК Материал
Поместить ВтМатериалы
Из Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Вых
ГДЕ Вых.Номенклатура.Код = &КодПрод;

ВЫБРАТЬ
  Спец.Ссылка КАК Спец,
  Вых.Номенклатура КАК Продукция,
  Вх.Номенклатура КАК Материал
ИЗ
  Справочник.СпецификацииНоменклатуры КАК Спец
      ЛЕВОЕ СОЕДИНЕНИЕ ВтПродукция КАК Вых
      ПО (Вых.Ссылка = Спец.Ссылка)
          И (Вых.НомерСтроки = 1)
      ЛЕВОЕ СОЕДИНЕНИЕ ВтМатериалы КАК Вх
      ПО Спец.Ссылка = Вх.Ссылка
   MrStomak
 
13 - 09.01.13 - 15:54
Ну только ссылки на спецификации по временных таблицах еще добавить
   КонецЦикла
 
14 - 09.01.13 - 15:56
Если есть возможность - посмотри план запроса, он подскажет
Мне когда-то помогало поместить в свою табличку с нужными индексами целую таблицу регистра отобранную по условию, а потом уже делать соединение
   MrStomak
 
15 - 09.01.13 - 15:56
И обращение к Справочник.СпецификацииНоменклатуры в последнем запросе вообще убрать и использовать внутреннее соединение по ссылке таблиц продукции и материалов
   organizm
 
16 - 09.01.13 - 15:57
(15) последний запрос понравился, только наверно внутренне соединение надо сделать, попробую
   КонецЦикла
 
17 - 09.01.13 - 15:58
Ха, только заметил что 2 соединения с одной таблицей, с этим-то можно что-то придумать? :)
   organizm
 
18 - 09.01.13 - 15:58
(14) админы не дают прав к профайлеру (((
   КонецЦикла
 
19 - 09.01.13 - 16:00
Можно обойтись двумя запросами
В первом поместить нужные элементы во врем. таблицу
В последнем будет одно левое соединение
   MrStomak
 
20 - 09.01.13 - 16:24
собственно забыл еще одну вещь важную - нужно номенклатуру с нужным кодом поместить во временную таблицу и вместо условия по коду номенклатуры в таблицах материалов и продукции делать внутреннее соединение с этой временной таблицей нужной номенклатуры. В этом случае будет поиск по индексу в табличных частях (если, конечно, для номенклатуры там стоит свойство "Индексировать"), что существенно улучшит приохзводительность при таких объёмах.
   Lexusss
 
21 - 09.01.13 - 16:30
Без плана запроса все - это гадание на кофейной гуще. Никто никогда не угадает, какой план SQL подберет для выполнения такого извращения.
Можно попробовать уточнить условия за счет явного внутреннего соединения с таб частям, а так же справочником номенклатуры для поиска по коду.

ВЫБРАТЬ
  Спец.Ссылка КАК Спец,
  Вых.Номенклатура КАК Продукция,
  Вх.Номенклатура КАК Материал
ИЗ
  Справочник.СпецификацииНоменклатуры КАК Спец
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК Вых
      ПО Вых.Ссылка = Спец.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ВыхНоменклатура
ПО ВыхНоменклатура.Ссылка = Вых.Номенклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК Вх
      ПО Спец.Ссылка = Вх.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК ВхНоменклатура
ПО ВхНоменклатура.Ссылка = Вх.Номенклатура
ГДЕ
  ВхНоменклатура.Код = &КодНом
  И ВыхНоменклатура.Код = &КодПрод
  И Вых.НомерСтроки = 1
   Fragster
 
22 - 09.01.13 - 16:35
Сначала сделать 2 временные таблицы с  ВхНоменклатура.Код = &КодНом и  ВыхНоменклатура.Код = &КодПрод И Вых.НомерСтроки = 1 а потом уже их соединять
   MrStomak
 
23 - 09.01.13 - 16:38
(21) не будет скана по индексу в этом варианте.
(22) +1
   GANR
 
24 - 09.01.13 - 16:42
(0)+ (12) Таблицы нужно по возможности фильтровать ПЕРЕД соединением, а не после. Ведь количество сравнений при соединении 2-х таблиц равняется (количество записей левой таблицы) x (количество записей правой таблицы). Выводы делайте сами...
   GANR
 
25 - 09.01.13 - 16:54
+(1) Ссылка представляет собой кластерный индекс. Поиск по кластерному индексу всегда быстрее чем по некластерному и уж тем более по неиндексированному полю.
   КонецЦикла
 
26 - 09.01.13 - 17:02
(25) scan по кластерному проиграет seek по некластерному :)
   Lexusss
 
27 - 09.01.13 - 17:10
(23) Ты протелепатил наполненность индекса по номенклатуре и ссылке в двух таблицах? В индексе по коду номенклатуры, уверен практически на 100%, будет строго 1 запись на значение :)
Так что скорее всего SQL сначала просканит по индексу кода оба раза в справочниках. А вот дальше будет большой вопрос про наполненность: что полезнее - ссылка или номенклатура в Вх и Вых таблицах. И принимать решение принудительно, сидя здесь, далеко от самого сервера - крайне не разумно.
Особливо меня пугает отбор НомерСтроки = 1. Это, скорее всего, и сносит мозг серверу.
(24) MS SQL глубоко наплевать на место наложения отборов при внутреннем соединении.
   Fragster
 
28 - 09.01.13 - 17:37
(27) в ТЧ составной индекс на Ссылка + номерстроки, не?
   GANR
 
29 - 09.01.13 - 17:49
(27) А временные таблицы?
   Lexusss
 
30 - 09.01.13 - 17:56
(28) Платформа такого индекса не делает. Да и смысла он не имеет. Скорее всего, все равно полезнее будет индекс по номенклатуре.
(29) ВТ позволяют нам игнорировать оптимизатор SQL и фактически самим указывать, как строить план выполнения. В 98% случает у 99% 1Сников так получится гораздо кривее, нежели план выполнения построит сам MS SQL просто по грамотно написанному запросу 1С.
   Fragster
 
31 - 09.01.13 - 17:58
(30).1 ну да, там индекс гуид + кейфилд. у меня кейфилд в 99% совпадает с номером строки, а в оставшихся случаях - там всего одна строка. если есть пример с другими данными - прошу.
   Fragster
 
32 - 09.01.13 - 18:00
правда при выборке по номеру строки это не поможет, да
   Lexusss
 
33 - 09.01.13 - 18:05
(31) Вообще то, платформа делает индекс Номенклатура + Ссылка. Как ты умудрился сделать наоборот - незнамо мне... Автору идеально подошел бы индекс НомерСтроки + Номенклатура + Ссылка, но такого платформа не умеет.
Да и, опять же догадываясь, что статистика распределния Справочник.СпецификацииНоменклатуры.ВыходныеИзделия по значениям НомерСтроки будет из серии
1 - 99%
все остальное - 1%, такой индекс не сильно поможет.
 
 
   Fragster
 
34 - 09.01.13 - 18:07
(33) я бы сделал как в (22)
   Lexusss
 
35 - 09.01.13 - 18:14
(34) Допустим, у автора всего 20 единиц номенклатуры, 30 000 разными способами формирующимися из разных наборов сырья. Твои хитрые временные таблицы при пересечении сформируют множество в 900 млн строк без индексов. Сервер умрет....
Надо смотреть наполнение конкретных таблиц и статистику их распределения + полюбас план выполнения.
   MrStomak
 
36 - 09.01.13 - 18:16
(27) Индекс по коду номенклатуры, конечно, будет. Однако, в твоём запросе это нисколько не поможет- сканироваться по коду будет не физическая таблица номенклатуры, у которой индекс по коду есть, а результат запроса к спецификации с неявным соединением на номенклатуру. При этом это неявное соединение с номенклатурой будет без указания условия по коду, что позволило бы отобрать её по индексу - 1С так умно разыменования не интерпретирует.
   Fragster
 
37 - 09.01.13 - 18:17
(35) в запросе у автора одна номенклатура.
   Lexusss
 
38 - 09.01.13 - 20:08
(36) Последовательность соединений и наложения отборов определит SQL сервер по своей статистике, а не разыменования 1С.
(37) Один сорт йогурта получается из одного сорта сырья, но с добавлением сотни разных приправ в разных объемах. Вот и получится таблица много на много.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует