Имя: Пароль:
IT
Админ
Почему виснет запрос?
0 Koala
 
23.07.13
21:19
Есть вот такой запрос:

ВЫБРАТЬ
   ХозрасчетныйОбороты.Регистратор КАК Регистратор,
   ХозрасчетныйОбороты.Период КАК Период,
   ХозрасчетныйОбороты.Субконто1 КАК Субконто1,
   ХозрасчетныйОбороты.Субконто2 КАК Субконто2
ИЗ
   РегистрБухгалтерии.Хозрасчетный.Обороты(&НачДата, &КонДата, Регистратор, Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты
ГДЕ
   ВЫБОР
           КОГДА &ВидЗадолженности = 0
               ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
                       ИЛИ ХозрасчетныйОбороты.СуммаОборотКт > 0
           КОГДА &ВидЗадолженности = 1
               ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
           ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотКт > 0
       КОНЕЦ
   И ВЫБОР
           КОГДА &КонтрагентПараметр <> 0
               ТОГДА ХозрасчетныйОбороты.Субконто1 = &КонтрагентПараметр
           ИНАЧЕ ИСТИНА
       КОНЕЦ
   И ВЫБОР
           КОГДА &ДоговорПараметр <> 0
               ТОГДА ХозрасчетныйОбороты.Субконто2 = &ДоговорПараметр
           ИНАЧЕ ИСТИНА
       КОНЕЦ
   И ХозрасчетныйОбороты.Регистратор В
           (ВЫБРАТЬ ПЕРВЫЕ 1
               ХозрасчетныйОбороты2.Регистратор КАК Регистратор
           ИЗ
               РегистрБухгалтерии.Хозрасчетный.Обороты(&НачДата, &КонДата, Регистратор, Счет В ИЕРАРХИИ (&Счет), , , , ) КАК ХозрасчетныйОбороты2
           ГДЕ
               ВЫБОР
                   КОГДА &ВидЗадолженности = 0
                       ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
                               ИЛИ ХозрасчетныйОбороты.СуммаОборотКт > 0
                   КОГДА &ВидЗадолженности = 1
                       ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
                   ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотКт > 0
               КОНЕЦ
               И ВЫБОР
                   КОГДА &КонтрагентПараметр <> 0
                       ТОГДА ХозрасчетныйОбороты.Субконто1 = &КонтрагентПараметр
                   ИНАЧЕ ИСТИНА
               КОНЕЦ
               И ВЫБОР
                   КОГДА &ДоговорПараметр <> 0
                       ТОГДА ХозрасчетныйОбороты.Субконто2 = &ДоговорПараметр
                   ИНАЧЕ ИСТИНА
               КОНЕЦ
               И ХозрасчетныйОбороты2.Субконто1 = ХозрасчетныйОбороты.Субконто1
               И ХозрасчетныйОбороты2.Субконто2 = ХозрасчетныйОбороты.Субконто2
           УПОРЯДОЧИТЬ ПО
               Регистратор УБЫВ)

УПОРЯДОЧИТЬ ПО
   Регистратор УБЫВ

Выполняется он уже минут 40. В чем может быть дело, подскажите!
1 Лефмихалыч
 
23.07.13
21:30
потому что он ужасен. В нем нечего чинить, выкинь его целиком
2 Koala
 
23.07.13
21:33
Можешь что-то лучшее предложить?
3 RomanYS
 
23.07.13
21:34
(1) согласен

(0) условия на субконто в параметры виртуальной таблицы
и как-нибудь избавиться от коррелированного запроса
4 Koala
 
23.07.13
21:35
И кстати, сам-то запрос отрабатывается за секунду (точнее не измерял, да и не надо). Тормозит только вывод результатов.
А их не так много: за месяц всего-лишь считаю.
Так вот я и думаю - почему оно так?
5 Славен
 
23.07.13
21:37
а это вот что: "ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0"
6 Славен
 
23.07.13
21:39
я пилять вот этого как то не понял, может вечер переработал конечно, объясните мне что это означает в условии:
КОГДА &ВидЗадолженности = 0
               ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
                       ИЛИ ХозрасчетныйОбороты.СуммаОборотКт > 0
           КОГДА &ВидЗадолженности = 1
               ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
           ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотКт > 0
       КОНЕЦ
7 Koala
 
23.07.13
21:39
(5) Вообще-то один из вариантов отбора в секции "ГДЕ". Что тебя смущает?
8 Славен
 
23.07.13
21:41
все уже врубился, дощло
9 Славен
 
23.07.13
21:41
переклинило меня что-то
10 Koala
 
23.07.13
21:42
(3) засунуть условия в параметры виртуалки - согласен, попробую. А почему от коррелированного запроса надо отказываться?
11 RomanYS
 
23.07.13
21:47
(10) я думаю именно он тормозит, а "top 1" можно и группировкой с функцией максимум получить
12 RomanYS
 
23.07.13
21:50
КОГДА &ВидЗадолженности = 0
              ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
                      ИЛИ ХозрасчетныйОбороты.СуммаОборотКт > 0
          КОГДА &ВидЗадолженности = 1
              ТОГДА ХозрасчетныйОбороты.СуммаОборотДт > 0
          ИНАЧЕ ХозрасчетныйОбороты.СуммаОборотКт > 0
      КОНЕЦ

вроде можно упростить:

(&ВидЗадолженности = 0 И ХозрасчетныйОбороты.СуммаОборот > 0) или (&ВидЗадолженности = 1 И ХозрасчетныйОбороты.СуммаОборот < 0)
13 Koala
 
23.07.13
21:57
(12) попробую. (11) ф-ей МАКСИМУМ? Ето как?
Просто коррелированный запрос я здесь замутил, чтоб получить дату задолженности, т.е. _первый_ док, у к-рого дебиторка >кредиторки (ну или наоборот).
А МАКСИМУМ-то здесь при чем?
14 RomanYS
 
23.07.13
22:06
(13) выбираешь данные во временную таблицу, индексируешь;
вторым запросом группируешь по всем измерениям и Минимум(регистратор), индексируешь;
третим запросом соединяешь первый и второй
15 RomanYS
 
23.07.13
22:13
обязательно указать параметр субконто виртуальной таблицы, одно это в разы может ускорить
16 Koala
 
23.07.13
22:34
(15) Дык _не знаю я заранее_, какие у меня будут субконто, а в параметр "Субконто" виртуальной таблицы нельзя засовывать конструкцию из запроса, можно только СписокЗначений.
17 RomanYS
 
23.07.13
22:48
(16) субконто - это массив видов субконто, в твоем случае: контрагенты, договоры