Имя: Пароль:
1C
 
postgesql долго выполняет запрос срез последних
, ,
0 Rokstedi
 
15.09.20
12:11
Добрый день, подскажите может кто сталкивался, конфигурация УПП, запрос к регистру цены нмоенклатуры(срез последних) с отбором по типу цен, в результате 15к записей, запрос выполняется 4минуты.
1 mikecool
 
15.09.20
12:12
админ нужен грамотный
2 Salimbek
 
15.09.20
12:36
(0) В случае с постгре - очень многое зависит и от версии УПП и от версии Платформы 1С и от версии самого постгре
3 Cyberhawk
 
15.09.20
12:38
А теперь попробуй выполнить этот же запрос без использования среза последних
4 Rokstedi
 
15.09.20
12:47
(3) хм, моментально выполняется
5 Rokstedi
 
15.09.20
12:47
(3) в чем прикол?
6 timurhv
 
15.09.20
12:54
(0) регистратор чтоли вытаскиваете?
7 alkorolev
 
15.09.20
13:02
(0) левое соединение со СрезомПоследних?
8 Rokstedi
 
15.09.20
13:03
(6) нет (7) нет. Просто срез последних одного регистра
9 Cyberhawk
 
15.09.20
13:04
(4) Покажи текст моментально выполнившегося запроса
10 Rokstedi
 
15.09.20
13:07
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПервых.Номенклатура,
    ЦеныНоменклатурыСрезПервых.ТипЦен,
    ЦеныНоменклатурыСрезПервых.ХарактеристикаНоменклатуры,
    ЦеныНоменклатурыСрезПервых.Валюта,
    ЦеныНоменклатурыСрезПервых.Цена,
    ЦеныНоменклатурыСрезПервых.ЕдиницаИзмерения,
    ЦеныНоменклатурыСрезПервых.ПроцентСкидкиНаценки,
    ЦеныНоменклатурыСрезПервых.СпособРасчетаЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатурыСрезПервых
ГДЕ
    ЦеныНоменклатурыСрезПервых.ТипЦен = &ТипЦен
11 Seriy_Volk
 
15.09.20
13:09
(4) была похожая проблема на старых релизах в процедуре
ПроверитьДопустимостьЦенОтпуска(ДокументОбъект, ИмяТабличнойЧасти, Отказ) Экспорт

на тот момент выкрутились изменением условия в запросе
вместо
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен" + НомерТипаЦен + ") КАК ЦеныКомпании" + НомерТипаЦен + "
нужно
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен" + НомерТипаЦен +  " и Номенклатура в (&списокНоменклатуры)) КАК ЦеныКомпании" + НомерТипаЦен + "
12 Rokstedi
 
15.09.20
13:17
ТТИ со всеми галочками ситуацию не исправило
13 Rokstedi
 
15.09.20
13:18
* тестирование и исправление
14 Rokstedi
 
15.09.20
13:20
как вариант попробую еще платформу обновить вечером
15 ansh15
 
15.09.20
13:21
(12) И не исправит. https://its.1c.ru/db/metod8dev/content/4208/hdoc
Теме 10 лет уже.
16 palsergeich
 
15.09.20
13:21
судя по симптомам - стоит попробовать это
http://catalog.mista.ru/1c/articles/1023353/
17 palsergeich
 
15.09.20
13:22
(15) Там речь о соединении.
а в старте просто о получении.
18 Надо работать
 
15.09.20
13:24
Обычный срез последних регистра сведений - вычисляемая штука, если не поставить нужную галочку в конфигураторе
19 palsergeich
 
15.09.20
13:26
(18) Это если не нужен срез на указанную дату
20 Voronve
 
15.09.20
13:43
(0) Пользуйся временными таблицами
Будет быстро и пофигу на на чем там БД крутиться и на галки в конфигураторах

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
    МАКСИМУМ(ЦеныНоменклатуры.Период)
ПОМЕСТИТЬ втПериоды
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ТипЦен = &ТипЦен
СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ХарактеристикаНоменклатуры
;

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    втПериоды.Номенклатура,
    втПериоды.ХарактеристикаНоменклатуры,
    втПериоды.Период,
    втПериоды.Цена
ИЗ
    втПериоды КАК втПериоды
    
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    ПО ЦеныНоменклатуры.Номенклатура= втПериоды.Номенклатура
        И ЦеныНоменклатуры.ХарактеристикаНоменклатуры= втПериоды.ХарактеристикаНоменклатуры
        И ЦеныНоменклатуры.Период = втПериоды.Период
21 Rokstedi
 
15.09.20
13:50
(17) Почитал, у меня random_page_cost=1.1 seq_page_cost=1, попробую вечером поиграться с этими параметрами
22 Rokstedi
 
15.09.20
13:50
(20) да, так норм работает
23 DEVIce
 
15.09.20
14:02
(22) Тебе еще в (7) написали, а ты ответил что нет, а оказывается что да. PG не любит соединения с вложенными запросами, а виртуальные функции именно их и генерируют, особенно срезы РС. Ты напиши реализацию среза сам и подивись на этого монстра.
24 Rokstedi
 
15.09.20
14:05
(23) так вот человек в (20) и написал свою реализацию среза последних, немного поправил и работает норм
25 DEVIce
 
15.09.20
14:06
(24) Можно было и не писать свою реализацию. Достаточно во временную таблицу помесить именно срез последних и соединяться уже с ней.
26 DEVIce
 
15.09.20
14:08
+(25) Короче, срезы использовать можно, но не надо с ними соединяться в запросе - получаем результат среза во временную таблицу и с ней соединяемся.
27 nicxxx
 
15.09.20
15:30
PREDICATE PUSHDOWN
Постгрес не проталкивает условия с "верхнего" запроса "вниз", поэтому срез строится по всем ценам.
В MSSQL все ОК, запрос выполяется моментально.
http://catalog.mista.ru/1c/articles/880836/
комментарий 94
28 alkorolev
 
15.09.20
18:29
(10) очевидно же, что в индекс не попадаете. Условие по номенклатуре наложить нельзя?
29 Rokstedi
 
27.10.20
17:05
(16) попробовал, не помогло. Утомился уже городить трехметровые запросы, наверное вернемся на MSSQL
30 ansh15
 
28.10.20
01:11
Люди и для MS SQL это делают http://catalog.mista.ru/1c/articles/980323/
Также некоторая формализация предлагается.
31 ansh15
 
28.10.20
01:36
(30) - как дополнение к тому, что было сказано здесь ранее, а то у автора темы уже капитулянтское настроение, MS SQL...
32 zaki
 
17.11.20
14:51
(0) Решается PostgreSQL 12 версии от postgrespro и исполнении кода в базе:

DO
$$ DECLARE txt text;
BEGIN
  FOR txt IN SELECT 'DROP INDEX ' || relname || '; ' || pg_get_indexdef(relname::regclass)||';' as ddl
        FROM pg_catalog.pg_class WHERE relkind = 'i' and relname like '_inforg%_bydims'
  LOOP EXECUTE txt;
  END LOOP;
END;
$$
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший