|   |   | 
| 
 | оптимизировать запрос | ☑ | ||
|---|---|---|---|---|
| 0
    
        ic-kat 30.10.12✎ 10:45 | 
        добрый день всем присутствующим.
  есть некий запрос, вот его фрагмент "ВЫБРАТЬ ПЕРВЫЕ 50 | ОстаткиГруза.Накладная КАК Накладная, | ОстаткиГруза.Накладная.Номер Как Номер |ИЗ | РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад | И(НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ))) КАК ОстаткиГруза в связи с тем, что РегистрСведений.Погрузка просто громадный, всякий толк от его использования в параметрах виртуальной таблицы пропадает наверное. как его оптимизировать? если делать соединение, то какое? | |||
| 11
    
        Hmster 30.10.12✎ 10:53 | 
        структуру регистра сведений покажи     | |||
| 12
    
        ic-kat 30.10.12✎ 10:54 | 
        измерения склад и накладная, ресурс остаток     | |||
| 13
    
        rphosts 30.10.12✎ 10:55 | 
        (10) а точно что именно этот кусок запроса всё тормозит?     | |||
| 14
    
        ic-kat 30.10.12✎ 10:56 | 
        да, я его пробовала вынести в вт, вообще на 40 минут все зависло, убила процесс     | |||
| 15
    
        GLazNik 30.10.12✎ 10:56 | 
        (8) тогда в результате не факт что в результате будет именно 50 записей :) может вообще получится что из 50 строк, что есть в остатках условию по регистру не удовлетворяющий регистру сведений.
  (10) без (НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ)) запрос быстро выполняется? | |||
| 16
    
        le_ 30.10.12✎ 10:56 | 
        (12) Остаток в регистре сведений?..     | |||
| 17
    
        Hmster 30.10.12✎ 10:56 | 
        (12) а признакК заначит реквизит? регистр периодический? подчиненный?     | |||
| 18
    
        cw014 30.10.12✎ 10:57 | 
        (10) Значит неправильно пробовала:
  ВЫБРАТЬ ПЕРВЫЕ 50 ОстаткиГруза.Накладная КАК Накладная, ОстаткиГруза.Накладная.Номер Как Номер ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Погрузка КАК Погрузка ПО ОстаткиГруза.Накладная = Погрузка.Накладная И Погрузка.ПризнакК | |||
| 19
    
        rphosts 30.10.12✎ 10:57 | 
        (16) вот такая вот самописка....     | |||
| 20
    
        GLazNik 30.10.12✎ 10:57 | 
        +(15) с соединением получится что-то типа:
  "ВЫБРАТЬ ПЕРВЫЕ 50 | ОстаткиГруза.Накладная КАК Накладная, | ОстаткиГруза.Накладная.Номер Как Номер |ИЗ | РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Погрузка КАК Погрузка ПО ОстаткиГруза.Накладная = Погрузка.Накладная И Погрузка.ПризнакК = ЛОЖЬ | |||
| 21
    
        rphosts 30.10.12✎ 10:58 | 
        +(19) возможно досталась в наследство     | |||
| 22
    
        ic-kat 30.10.12✎ 10:58 | 
        ой, нет, не того регистра структуру описала.     | |||
| 23
    
        cw014 30.10.12✎ 10:58 | 
        Ведь на сколько я понимаю "ПризнакК" имеет тип "Булево"?     | |||
| 24
    
        cw014 30.10.12✎ 10:58 | 
        (20) Нужно те, которые с признаком, см внимательнее запрос     | |||
| 25
    
        ic-kat 30.10.12✎ 10:59 | 
        у погрузки вот так:
  измерения накладная, ячейка, ресурсы направлени и погружено мест, признакК - реквизит | |||
| 26
    
        ic-kat 30.10.12✎ 11:00 | 
        (20) если так, то не попадут те, что в остатках, но их нет в погрузке     | |||
| 27
    
        ic-kat 30.10.12✎ 11:00 | 
        (23) призакК - булево     | |||
| 28
    
        rphosts 30.10.12✎ 11:00 | 
        а у погрузки какая структура?     | |||
| 29
    
        GLazNik 30.10.12✎ 11:01 | 
        (24) копипаст :) "НЕ" пропустил... но идея то собственно понятна     | |||
| 30
    
        Hmster 30.10.12✎ 11:01 | 
        (25) подчиненные регистр? есть периодичность?     | |||
| 31
    
        ic-kat 30.10.12✎ 11:01 | 
        (28) в 25 описала     | |||
| 32
    
        Hmster 30.10.12✎ 11:02 | 
        реквизит проиндексирован? что дает запрос из (18) ?     | |||
| 33
    
        cw014 30.10.12✎ 11:02 | 
        (31) попробуй (18) - оно?     | |||
| 34
    
        dmpl 30.10.12✎ 11:04 | 
        (0) 
  
 может быть лучше. | |||
| 35
    
        GLazNik 30.10.12✎ 11:04 | 
        (26) нет в регистре Погрузка?
  Тогда так "ВЫБРАТЬ ПЕРВЫЕ 50 | ОстаткиГруза.Накладная КАК Накладная, | ОстаткиГруза.Накладная.Номер Как Номер |ИЗ | РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад) КАК ОстаткиГруза | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Погрузка КАК Погрузка ПО ОстаткиГруза.Накладная = Погрузка.Накладная |ГДЕ ЕСТЬNULL(Погрузка.ПризнакК,Истина) | |||
| 36
    
        cw014 30.10.12✎ 11:06 | 
        (35) ++     | |||
| 37
    
        ic-kat 30.10.12✎ 11:06 | 
        (33) 18 не то, так не попадают записи, которые есть в остатках, но нет в погрузке.
  (35) а так попробую, но наверно едолго работать будет, раз условие позже накладывается | |||
| 38
    
        МихаилМ 30.10.12✎ 11:07 | 
        для мс скл использование выбратьпервые
  без сортировать по всем всем полям индекса - очень ресурсоёмкая операция. | |||
| 39
    
        GLazNik 30.10.12✎ 11:08 | 
        (37) не факт... скульный оптимизатор вещь хитрая... :)     | |||
| 40
    
        dmpl 30.10.12✎ 11:08 | 
        (38) Безотносительно SQL - это вообще бессмысленно без сортировки. Типа, выберите мне что-нибудь в количестве 50 штук...     | |||
| 41
    
        ic-kat 30.10.12✎ 11:10 | 
        (35) только наверное ГДЕ ЕСТЬNULL(Погрузка.ПризнакК,ЛОЖЬ) ?     | |||
| 42
    
        GLazNik 30.10.12✎ 11:10 | 
        (38) на счет ресурсоёмкости не уверен, но без сортировки смысл теряется... ну если только для проверки...     | |||
| 43
    
        GLazNik 30.10.12✎ 11:11 | 
        (41) неа... именно истина... вам же нужны документы которых нет Погрузке     | |||
| 44
    
        Fragster гуру 30.10.12✎ 11:11 | 
        Что дает:
  Выбрать Сумма(1) Из (Выбрать * Из РегистрНакопления.ГрузВЯчейках.Остатки) КАК Вложенный | |||
| 45
    
        cw014 30.10.12✎ 11:12 | 
        (37) 
  "И(НЕ Накладная В (ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ)))" - у тебя так то тоже :) | |||
| 46
    
        GLazNik 30.10.12✎ 11:16 | 
        (44) это к чему тут?     | |||
| 47
    
        ic-kat 30.10.12✎ 11:16 | 
        (41) да, действительно
  (44) то же, что и вт (45) не так | |||
| 48
    
        dmpl 30.10.12✎ 11:16 | 
        Вопрос всем кто тут левые и прочие соединения предлагает. С чего вы взяли, что 1 накладная идет только в одну ячейку?     | |||
| 49
    
        Fragster гуру 30.10.12✎ 11:17 | 
        проиндексировано ли поле ПризнакК в регистре РегистрСведений.Погрузка? есть ли индекс по полю "накладная" или является оно первым измерением в РегистрНакопления.ГрузВЯчейках?     | |||
| 50
    
        acsent 30.10.12✎ 11:17 | 
        ПризнакК индексированное поле?     | |||
| 51
    
        ic-kat 30.10.12✎ 11:17 | 
        (35) результат выборки верный, но работает так же медленно :(
  в связь корректно условие никак не запихать? | |||
| 52
    
        cw014 30.10.12✎ 11:18 | 
        (47) тогда оставляй как есть     | |||
| 53
    
        ic-kat 30.10.12✎ 11:20 | 
        накладная индексируется по регистру накоплений, но не первое измерение     | |||
| 54
    
        cw014 30.10.12✎ 11:20 | 
        (47) хотя если по скорости, посмотри, сколько длится такой запрос:
  "ВЫБРАТЬ ОстаткиГруза.Накладная ПОМЕСТИТЬ НакладныеОстатков ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад ) КАК ОстаткиГруза ; ВЫБРАТЬ Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ РАЗЛИЧНЫЕ НакладныеОстатков.Накладная ИЗ НакладныеОстатков) | |||
| 55
    
        ic-kat 30.10.12✎ 11:21 | 
        признакК не идексируется     | |||
| 56
    
        Fragster гуру 30.10.12✎ 11:21 | 
        а первая часть (49), а главное, (44)?     | |||
| 57
    
        cw014 30.10.12✎ 11:21 | 
        (47) Если по скорости быстро, тогда можно тебе помочь     | |||
| 58
    
        Fragster гуру 30.10.12✎ 11:22 | 
        (55) а сколько выполняется отдельно ВЫБРАТЬ Накладная ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ ? может имеет смысл проиндексировать? да и список накладных лучше во временную таблицу запихать, а потом её уже в отбор регистра накопления.     | |||
| 59
    
        ic-kat 30.10.12✎ 11:22 | 
        (57) это про что сейчас?     | |||
| 60
    
        cw014 30.10.12✎ 11:23 | 
        (59) про (54)     | |||
| 61
    
        Fragster гуру 30.10.12✎ 11:23 | 
        (46) а если годы не закрывался регистр?     | |||
| 62
    
        Fragster гуру 30.10.12✎ 11:24 | 
        (47).2 что "то же"? число какое?     | |||
| 63
    
        Нуф-Нуф 30.10.12✎ 11:29 | 
        нихера тут оптимизаторов. до разбора движка скуля еще не добрались?     | |||
| 64
    
        Hmster 30.10.12✎ 11:32 | 
        (54) ошибся в условии.
  надо условие Погрузка.ПризнакК = ложь | |||
| 65
    
        Hmster 30.10.12✎ 11:32 | 
        Сколько по времени выполняется запрос? 
  "ВЫБРАТЬ ОстаткиГруза.Накладная ПОМЕСТИТЬ НакладныеОстатков ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад ) КАК ОстаткиГруза ; ВЫБРАТЬ Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ Погрузка.ПризнакК = ЛОЖЬ И Погрузка.Накладная В (ВЫБРАТЬ РАЗЛИЧНЫЕ НакладныеОстатков.Накладная ИЗ НакладныеОстатков) | |||
| 66
    
        ic-kat 30.10.12✎ 11:33 | 
        попробую сейчас     | |||
| 67
    
        cw014 30.10.12✎ 11:33 | 
        (54) Почему это? Разве он не имеет тип "Булево"?     | |||
| 68
    
        cw014 30.10.12✎ 11:34 | 
        (64) Почему это? Разве он не имеет тип "Булево"?     | |||
| 69
    
        dmpl 30.10.12✎ 11:34 | 
        (65) А в чем смысл выбирать различные уже из временной таблицы?     | |||
| 70
    
        Hmster 30.10.12✎ 11:35 | 
        (68) тебе нужны все которые не входят в список признакК=ложь, а не те кто входят в список признакК=Истина     | |||
| 71
    
        cw014 30.10.12✎ 11:36 | 
        Понял, нам же потом этот список нужен для отбора. Тогда
  "НЕ Погрузка.ПризнакК" | |||
| 72
    
        cw014 30.10.12✎ 11:36 | 
        (69) Да нивчем, конечно можно было еще в первом запросе такое указать :)     | |||
| 73
    
        cw014 30.10.12✎ 11:37 | 
        (66) Вот как должно быть:
  ВЫБРАТЬ РАЗЛИЧНЫЕ ОстаткиГруза.Накладная ПОМЕСТИТЬ НакладныеОстатков ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад ) КАК ОстаткиГруза ; ВЫБРАТЬ Погрузка.Накладная ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ НЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ НакладныеОстатков.Накладная ИЗ НакладныеОстатков) | |||
| 74
    
        Нуф-Нуф 30.10.12✎ 11:37 | 
        ВЫБРАТЬ Различные
  Накладная Как Накладная ПОМЕСТИТЬ ТаблицаНакладных ИЗ РегистрСведений.Погрузка ГДЕ ПризнакК = ЛОЖЬ ИНДЕКСИРОВАТЬ Накладная ; ВЫБРАТЬ ПЕРВЫЕ 50 ОстаткиГруза.Накладная КАК Накладная, ОстаткиГруза.Накладная.Номер Как Номер ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад И (НЕ Накладная В (ВЫБРАТЬ Накладная.ТаблицаНакладных ИЗ ТаблицаНакладных)) КАК ОстаткиГруза | |||
| 75
    
        cw014 30.10.12✎ 11:38 | 
        (74) Аналогично (0) получится. Запрос виснет именно на выборке из регистра сведений. Поэтому его то и нужно обрезать     | |||
| 76
    
        Нуф-Нуф 30.10.12✎ 11:38 | 
        горе оптимизаторы     | |||
| 77
    
        cw014 30.10.12✎ 11:38 | 
        (76) Ты просто условие поместил в новую временную таблицу, да и еще в ней заставил индексацию провести     | |||
| 78
    
        Нуф-Нуф 30.10.12✎ 11:38 | 
        (75) инфа достоверна?     | |||
| 79
    
        Hmster 30.10.12✎ 11:39 | 
        (66) как тестируется?     | |||
| 80
    
        dmpl 30.10.12✎ 11:39 | 
        А вообще вопрос. Вот показанный тут запрос - это полный запрос, или кусочек более крупного запроса?     | |||
| 81
    
        cw014 30.10.12✎ 11:40 | 
        (78) Мы то и пытаемся определить, будет ли выборка обрезанная на уровне ресурсов/реквизитов быстрее     | |||
| 82
    
        ic-kat 30.10.12✎ 11:41 | 
        (79) пока засекала, время выполнения моего и 35, до секунды одинаково по времени     | |||
| 83
    
        ic-kat 30.10.12✎ 11:42 | 
        это только кусочек, но виснет именно на нем.     | |||
| 84
    
        Hmster 30.10.12✎ 11:43 | 
        запрос из (73) выполняла?     | |||
| 85
    
        Bober 30.10.12✎ 11:43 | 
        (0) нужна структура таблиц     | |||
| 86
    
        dmpl 30.10.12✎ 11:45 | 
        (83) У меня такое было, и причина оказалась в одном из предыдущих запросов. Т.е., исправил предыдущий запрос - и проблемный залетал. Сложилось такое впечатление, что оптимизатор после определенного предела косяков просто не может оптимизировать запрос, и начинается тупая выборка.
  Если показанный запрос выполнять отдельно - он также медленно выполняется, или быстрее? | |||
| 87
    
        МишКа 30.10.12✎ 11:54 | 
        Абстрактная оптимизация не имеет смысла. 
  Сколько всего остатков в РН? Сколько записей в РС? Почему выбираются первые 50? | |||
| 88
    
        ic-kat 30.10.12✎ 11:56 | 
        (84) переделываю пока, он большой. и отвлекают по работе
  (86) в смысле сам кусочек запустить? он настолько долго, что терпения ни разу не хватила дождаться | |||
| 89
    
        Hmster 30.10.12✎ 12:02 | 
        ты пробовала куски сравнивать по скорости?     | |||
| 90
    
        dmpl 30.10.12✎ 12:03 | 
        (88) Вот те 5-10 строк, что тут приводят, если запустить отдельно - сколько идет? Если долго - то никакие оптимизации не помогут, надо менять структуру данных.     | |||
| 91
    
        ic-kat 30.10.12✎ 12:06 | 
        (73) мне из вт не только накладная нужна, но и еще поля.
  и при этом в выборку попадут только те, что есть в регистре погрузка. значит недобор. потому что есть такие, которые есть в остатках, но в погрузке нет | |||
| 92
    
        МишКа 30.10.12✎ 12:06 | 
        (90) Если в РН не очень много записей - оптимизировать можно.     | |||
| 93
    
        МишКа 30.10.12✎ 12:07 | 
        +(92) В остатках РН, я имел ввиду.     | |||
| 94
    
        hhhh 30.10.12✎ 12:14 | 
        (91) может к вас там галка "индексировать" не стоит в поле Накладная в регистре ОстаткиГруза?     | |||
| 95
    
        dmpl 30.10.12✎ 12:15 | 
        (91) Когда ты в ВТ берешь другие поля - ты неявно цепляешь к ВТ левым соединением всю таблицу накладных без отбора. Лучше эти поля добавлять уже после всех отборов - чтобы цеплялось с отбором.     | |||
| 96
    
        Axel2009 30.10.12✎ 12:17 | 
        (0) 
  1. индекс на реквизит Накладная в Регистре ГрузВЯчейках есть? 2. индекс на реквизит ПризнакК в регистре Погрузка есть? | |||
| 97
    
        ic-kat 30.10.12✎ 12:28 | 
        (96) 1. есть
  2.нет | |||
| 98
    
        Axel2009 30.10.12✎ 12:32 | 
        (97) что вернет запрос
  ВЫБРАТЬ ПризнакК, КОЛИЧЕСТВО(*) ИЗ РегистрСведений.Погрузка СГРУППИРОВАТЬ ПО ПризнакК ? | |||
| 99
    
        Hmster 30.10.12✎ 12:35 | 
        (91) выполняется долго или нет? тут не весь кусок запроса что тебе нужен. весь писать пока не стали...     | |||
| 100
    
        ic-kat 30.10.12✎ 12:37 | 
        (99) он обрезать результаты будет     | |||
| 101
    
        Hmster 30.10.12✎ 12:39 | 
        ВЫБРАТЬ
  ОстаткиГруза.Накладная ПОМЕСТИТЬ НакладныеОстатков ИЗ РегистрНакопления.ГрузВЯчейках.Остатки(, Склад = &Склад ) КАК ОстаткиГруза ; ВЫБРАТЬ Погрузка.Накладная ПОМЕСТИТЬ ПогрузкаПризнакК_Не ИЗ РегистрСведений.Погрузка КАК Погрузка ГДЕ НЕ Погрузка.ПризнакК И Погрузка.Накладная В (ВЫБРАТЬ НакладныеОстатков.Накладная ИЗ НакладныеОстатков) ; ВЫБРАТЬ НакладныеОстатков.Накладная ИЗ НакладныеОстатков КАК НакладныеОстатков ГДЕ (НЕ НакладныеОстатков.Накладная В (ВЫБРАТЬ ПогрузкаПризнакК_Не.Накладная ИЗ ПогрузкаПризнакК_Не КАК ПогрузкаПризнакК_Не)) | |||
| 102
    
        cw014 30.10.12✎ 12:39 | 
        (91) Нужно просто пока обкатать по скорости, запусти да проверь, как быстро выбираются     | |||
| 103
    
        Hmster 30.10.12✎ 12:40 | 
        сколько выполняется запрос из (101) ?     | |||
| 104
    
        hhhh 30.10.12✎ 12:57 | 
        (103) проиндексировать еще НакладныеОстатков     | |||
| 105
    
        dmpl 30.10.12✎ 13:48 | 
        (104) Не обязательно, платформа чаще всего сама строит нужный индекс. А неправильно проиндексировав можно запросто уронить производительность.     | |||
| 106
    
        Hmster 30.10.12✎ 14:05 | 
        похоже автор не вернулся с обеда или еще запрос не выполнился?
  (105) это еще очень сильно от субд зависит. МС СКЛ сам неплохо индексирует а вот в постгре думать надо, да и в файловой тоже. | |||
| 107
    
        dmpl 30.10.12✎ 15:14 | 
        (106) Насчет PostgreSQL не знаю, а вот что в файловом варианте, что на MS SQL явное индексирование временных таблиц в более чем 95% случаев не приносит сколько-нибудь заметного ускорения. А вот к заметному замедлению иногда приводит.     | |||
| 108
    
        ic-kat 30.10.12✎ 18:52 | 
        всем спасибо, сделала примерно как и в 101, только не в вт, а во вложенный ее, в итоге выполняется за несколько секунд     | |||
| 109
    
        Axel2009 30.10.12✎ 20:58 | 
        (106) нука нука поподробнее =) что он там "неплохо" делает "сам"? =)     | |||
| 110
    
        Axel2009 30.10.12✎ 20:59 | 
        (107) да у них там некоторая нестыковочка.. люди которые там работают не особо знают особенности скуль. лучше сначала вставить данные, потом индекснуть, чем наоборот. =)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |