Переключение на Главную Страницу Страницы: 1 ... 47 48 [49] 50 51  ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 251270 )
Zhenya
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 37
Зарегистрирован: 18. Октября 2010
Пол: Женский
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #720 - 30. Октября 2015 :: 18:05
Печать  
Да, спасибо, мне уже и на Инфостарте подсказали, что в подзапросах типизация все ломает Улыбка
  
Наверх
 
IP записан
 
Simply1
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 17. Сентября 2016
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #721 - 21. Сентября 2016 :: 08:23
Печать  
Прошу помощи:
У регистра остатков есть Справочник.Товары.
У Товара есть Справочник.Артикулы.
У Артикула есть Справочник.Дивизионы.
Чтобы сделать отбор по Дивизионам мне нужно приджоинить к регистру каждый из этих справочников?

Это одноэсный запрос:
[code]"//{{ЗАПРОС(Сформировать)
|Товар=Регистр.Склад.Товар;
|Склад=Регистр.Склад.МестоХранения;
|Дивизион=Регистр.Склад.Товар.Артикул.Дивизион;
|Количество=Регистр.Склад.Количество;
|Группировка Товар Упорядочить По Товар.Артикул Без Групп;
|Группировка Склад;
|Функция КолВо=КонОст(Количество);
|Условие (Склад в Склад_);
|Условие (Дивизион в Дивизион_);
|"//}}ЗАПРОС;[/code]
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #722 - 21. Сентября 2016 :: 09:24
Печать  
[quote]Чтобы сделать отбор по Дивизионам мне нужно приджоинить к регистру каждый из этих справочников?[/quote]

Да, оба. А вот left или inner определишь по скорости. Результат будет одинаковый, а скорость может сильно отличаться.
  
Наверх
www  
IP записан
 
Simply1
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 17. Сентября 2016
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #723 - 27. Сентября 2016 :: 13:06
Печать  
[quote]Да, оба. А вот left или inner определишь по скорости. Результат будет одинаковый, а скорость может сильно отличаться.[/quote]
Спасибо!
А со скоростью действительно интересно:
Запрос 1С (см. выше) выполняется за 3:58, а прямой запрос:
[code]
     "ВЫБРАТЬ
     |       РегОст.Товар КАК [Товар $Справочник.Номенклатура]
     |      ,РегОст.МестоХранения КАК [Склад $Справочник.МестаХранения]
     |      ,РегОст.КоличествоОстаток КАК Колво
     |ИЗ
     |      $РегистрОстатки.Склад(
     |                                    ,
     |                                    ,(Товар,МестоХранения)
     |                                    ,(Количество)
     |                                    ,
     |       ) КАК РегОст $nolock
     |";
[/code]
выполняется за 3:52.
Выходит - шило на мыло. Опять не удалось перейти на Прямые и эСКьюЛайт ...

  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #724 - 27. Сентября 2016 :: 18:18
Печать  
Ага... судя по $nolock у тебя mssql
На таких примитивных запросах 1с тоже не дура Подмигивание
  
Наверх
www  
IP записан
 
Simply1
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 17. Сентября 2016
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #725 - 28. Сентября 2016 :: 07:33
Печать  
Djelf писал(а) 27. Сентября 2016 :: 18:18:
Ага... судя по $nolock у тебя mssql
На таких примитивных запросах 1с тоже не дура Подмигивание

у меня dbf, а $nolock остался от прошлого запроса. В доке написано, что он убирается автоматически, если dbf
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #726 - 28. Сентября 2016 :: 07:55
Печать  
Simply1 писал(а) 28. Сентября 2016 :: 07:33:
у меня dbf, а $nolock остался от прошлого запроса. В доке написано, что он убирается автоматически, если dbf

Ну тогда покажи во что разворачивается этот прямой запрос (отладка с каким то флагом, не помню уже), обычно sqlite работает быстрее.
Скорее всего ты просто не попадаешь ни в один индекс и считывается вообще вся таблица...
  
Наверх
www  
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #727 - 29. Сентября 2016 :: 00:57
Печать  
У тебя здесь нет отбора по Дивизионам. Я так понимаю ты где то потом уже фильтруешь. Т.е. ты получаешь полностью все остатки из регистра. Джоинить нужно в самом виртуальном регистре. Примерно так:

[code]
     "ВЫБРАТЬ
     |       РегОст.Товар КАК [Товар $Справочник.Номенклатура]
     |      ,РегОст.МестоХранения КАК [Склад $Справочник.МестаХранения]
     |      ,РегОст.КоличествоОстаток КАК Колво
     |ИЗ
     |      $РегистрОстатки.Склад(
     |                                    , (($Дивизионы.ТекущийЭлемент В #ФильтрДивизионов) и (МестоХранения В #ФильтрСкладов))
     |                                    ,(Товар,МестоХранения)
     |                                    ,(Количество)
     |                                    ,СОЕДИНЕНИЕ Справочник.Товары КАК Товары ПО Товар = $Товары.ТекущийЭлемент
     |                                    СОЕДИНЕНИЕ Справочник.Артикулы КАК Артикулы ПО $Товары.Артикул = $Артикулы.ТекущийЭлемент
     |                                    СОЕДИНЕНИЕ Справочник.Дивизионы КАК Дивизионы ПО $Артикулы.Дивизион = $Дивизионы.ТекущийЭлемент
     |       ) КАК РегОст $nolock
     |";
     
     Запрос.УложитьСписокЗначений(Дивизион_, "#ФильтрДивизионов", "Дивизионы");
     Запрос.УложитьСписокЗначений(Склад_, "#ФильтрСкладов", "МестаХранения");
[code]
     Ну и еще предуспомтреть ситуацию когда списки Дивизион_ и Склад_ окажутся пустыми, в таком случае в отличии от стандартного 1С запроса это вернет не все значения а наоборот ни одного.
  
Наверх
 
IP записан
 
Simply1
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 17. Сентября 2016
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #728 - 29. Сентября 2016 :: 18:34
Печать  
[quote author=446A656C66000 link=1285352210/726#726 date=1475049344]Ну тогда покажи во что разворачивается этот прямой запрос (отладка с каким то флагом, не помню уже), обычно sqlite работает быстрее.
Скорее всего ты просто не попадаешь ни в один индекс и считывается вообще вся таблица...[/quote]

Да, я тоже подозреваю, что что-то не так.
[code]SELECT
      РегОст.Товар AS [Товар $Справочник.Номенклатура]
     ,РегОст.МестоХранения AS [Склад $Справочник.МестаХранения]
     ,РегОст.КоличествоОстаток AS [Колво $Число]
FROM
     (
     SELECT
           Товар
           ,МестоХранения
           ,SUM(КоличествоОстаток) AS КоличествоОстаток
           
     FROM
           (SELECT
                 rg_324.Товар AS Товар
                 ,rg_324.МестоХранения AS МестоХранения
                 ,rg_324.Количество AS КоличествоОстаток
                 
           FROM
                 [РегистрИтоги.Склад] AS rg_324
           WHERE
                 rg_324.PERIOD = '20160901'
           ) AS vt_ra_324
     GROUP BY
           Товар
           ,МестоХранения
     HAVING (SUM(КоличествоОстаток) <> 0)
     
) AS РегОст
create table x(
[PERIOD] char(8) not null
,[Товар] char(9) collate _1C not null
,[МестоХранения] char(9) collate _1C not null
,[Количество] numeric(20, 3) not null
,[Сумма] numeric(20, 2) not null
,[СуммаЗакупки] numeric(20, 2) not null
, idx_PERIOD_Товар_МестоХранения char(26) collate _1C default null
, idx_PERIOD_МестоХранения char(17) collate _1C default null
)[/code]
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #729 - 29. Сентября 2016 :: 19:12
Печать  
А это что? оО
,$СпрДив.Наименование AS [Дивизион $Справочник.Дивизионы]
Где они джойнятся то?

2 раза select from select, а в этом запросе такое не требуется! Ну давайте 10 раз сделаем select from select - будет быстрее.

Я пас, эти "прямые" с такими штучками я не понимаю и понимать не хочу!


  
Наверх
www  
IP записан
 
Simply1
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 5
Зарегистрирован: 17. Сентября 2016
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #730 - 29. Сентября 2016 :: 19:17
Печать  
[quote author=2709060F05630 link=1285352210/729#729 date=1475176368]А это что? оО
,$СпрДив.Наименование AS [Дивизион $Справочник.Дивизионы]
Где они джойнятся то?
Я пасс, эти "прямые" с такими штучками я не понимаю и понимать не хочу!
[/quote]
:) сори, это лишнее - эксперименты ставил и не почистил.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #731 - 29. Сентября 2016 :: 19:28
Печать  
Выкинь все и проверь ядро запроса без "прямых запросов", если у тебя время выполнения не изменится я буду очень удивлен!
Типизацию можно добавить, она не сильно влияет

SELECT
rg_324.Товар AS Товар
,rg_324.МестоХранения AS МестоХранения
,rg_324.Количество AS КоличествоОстаток
FROM  [РегистрИтоги.Склад] AS rg_324
WHERE
rg_324.PERIOD = '20160901'
GROUP BY  Товар,МестоХранения
HAVING (SUM(КоличествоОстаток) <> 0)
  
Наверх
www  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #732 - 17. Ноября 2016 :: 06:50
Печать  
[quote author=517F707973150 link=1285352210/729#729 date=1475176368]2 раза select from select, а в этом запросе такое не требуется! Ну давайте 10 раз сделаем select from select - будет быстрее.[/quote]

Ну в данном случае, автор вопроса не виноват что класс сделал два select-а внутри, кроме его первого select.
Возможно один селект то и можно сократить без потери для результата, но один вложенный все равно останется.

Всем здрасьте, кстати. Давненько не виделись.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 634
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #733 - 17. Ноября 2016 :: 11:16
Печать  
Можно и не клеить вложенный rg_324 в 1 селект... sqlite вложенный без группировки разворачивает как будто вложенного и не было.
Все тормоза от IN - ненавижу его Подмигивание

Про 10 вложенных извиняюсь, просто сложновато в ПрямомЗапросе понять где именно тормоз ;(
  
Наверх
www  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #734 - 18. Ноября 2016 :: 05:35
Печать  
2 Djelf
Ну, сложность - это плата за универсальность и определенный уровень абстракции. Я как старался так и реализовывал возможность увидеть как работает сам класс.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 47 48 [49] 50 51 
ОтправитьПечать