|
Долго думает Postgre | ☑ | ||
---|---|---|---|---|
0
MistaEr
03.07.17
✎
09:27
|
Доброго времени суток! Есть конфигурация 1С Совместимо. Объем базы доходит до 10 ГБ, следовательно, чем то нужно заменить SQL Express. Установил Postgre SQL, скачал самый новый дистрибутив из users. Разница в скорости работы, конечно же, большая. Сделал настройки, как советуют на http://kb.stspp.ru/software/postgresql_and_1c. Стало лучше, быстрее. НО! У меня есть динамический список клиентов, формируется на основании произвольного запроса. Список сам формируется достаточно быстро, но когда устанавливаю там отбор, ждать приходится очень долго. Пример отбора:
ЭлементОтбора = ЭтаФорма.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Возраст"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно; ЭлементОтбора.ПравоеЗначение = ОтборВозрастДо; ЭлементОтбора.Использование = Истина; |
|||
1
ermola
03.07.17
✎
09:30
|
Разница в скорости работы, конечно же, большая.
ждать приходится очень долго А если в оценить количественно? В секундах например. |
|||
2
Timon1405
03.07.17
✎
09:32
|
(0)проверить запрос на полное соединение
https://its.1c.ru/db/metod8dev#content:1556:hdoc:_top |
|||
3
MistaEr
03.07.17
✎
09:34
|
(1) После установки некоторых отборов вышеуказанным образом, просто зависает, минут 5 пробовал ждать. Некоторые отборы срабатывают, но раз в 20 дольше.
|
|||
4
MistaEr
03.07.17
✎
09:35
|
(2) ПОЛНЫХ соединений в запросе нет, только ЛЕВЫЕ
|
|||
5
Fedor-1971
03.07.17
✎
09:39
|
(3) попробуй рулить не отборами, а параметрами запроса ДС. Возможно, что так будет эффективнее для Postgre.
|
|||
6
ermola
03.07.17
✎
09:39
|
(3) Ставлю проц на сервере слабый или памяти мало.
|
|||
7
Cyberhawk
03.07.17
✎
09:39
|
(4) Речь о результирующем запросе дин. списка
|
|||
8
MistaEr
03.07.17
✎
09:42
|
(6) Память и проц не съедаются даже наполовину. В настройках указал 8 из 32Гб.
|
|||
9
MistaEr
03.07.17
✎
09:43
|
(7) Нигде в запросе нет ПОЛНЫХ СОЕДИНЕНИЙ
|
|||
10
MistaEr
03.07.17
✎
09:44
|
(5) Это же СКД, там и отборы должны работать как параметр. Ну хорошо, я попробую
|
|||
11
Fedor-1971
03.07.17
✎
09:46
|
(6) список формируется быстро - т.е. памяти для одного большого запроса с соединениями хватает.
Тут скорее всего дело в отборах, они больше рассчитаны на MS SQL (10) Должны, но в результате в запросе неявно может появиться Полное Соединение как сказано в (7) |
|||
12
MistaEr
03.07.17
✎
09:46
|
(10) С другой стороны, этот параметр всегда нужно будет заполнять или проверять на незаполненность
|
|||
13
Cyberhawk
03.07.17
✎
09:48
|
(9) Убеди меня (покажи на картинке)
|
|||
14
Fedor-1971
03.07.17
✎
09:51
|
(12) зачем?
делаешь текстовый параметр формы, например, ИсходныйЗапрос в котором есть конструкция ГДЕ Истина (ну или те условия что есть) дальше просто динамически в запрос добавляешь и устанавливаешь параметр (параметры) - и запрос остаётся с минимальной фильтрацией и пользователь получает возможность наложить некие фильтры на ДС. Один недостаток - наложить можно только запрограммированные фильтры |
|||
15
MistaEr
03.07.17
✎
09:55
|
(13) Запроса нет под рукой, пока нет возможности подключиться к ним, админ забрал сервак
|
|||
16
MistaEr
03.07.17
✎
10:00
|
(14) в котором есть конструкция ГДЕ Истина (ну или те условия что есть) означает что в тексте будет Подстрока "#УсловиеВозраст", и при установке отборов, я эту подстроку заменяю на "РазностьДат(Клиент.ДатаРождения, &ТекущаяДата, ГОД) < &Возраст или на "Истина"
Вы это имели ввиду? |
|||
17
MistaEr
03.07.17
✎
10:09
|
Там порядка 20 разных отборов. Наверное при изменении любого отбора, текст запроса формировать по новому и передаватьв динамический список?
|
|||
18
Fedor-1971
03.07.17
✎
10:10
|
(16) не совсем так. Пример: твой исходный запрос:
Выбрать таб.ФИО из Справочник.Сотрудники как таб преобразовываем в Выбрать таб.ФИО из Справочник.Сотрудники как таб Где Истина // или оставляем те условия которые были дальше ИсходныйЗапрос=ДС.ТекстЗапроса и фильтры ДС.ТекстЗапроса=ИсходныйЗапрос+" И таб.Код < &Знач" ДС.УстановитьЗначениеПараметра("Знач", 15); Схематично как-то так |
|||
19
Fedor-1971
03.07.17
✎
10:11
|
(17) да, заново формируем текст запроса и устанавливаем параметры
|
|||
20
MistaEr
03.07.17
✎
10:16
|
(18) Я думаю, "И таб.Код < &Знач" добавлять уже во вложенных таблицах, не все условия будут добавляться в конец запроса, поэтому не обойтись без замены подстрок
|
|||
21
Вафель
03.07.17
✎
10:18
|
При установке отбора все индексы идут лесом
|
|||
22
Вафель
03.07.17
✎
10:19
|
Ну и конечно лучше
Клиент.ДатаРождения < &ВычисленнаяДата |
|||
23
MistaEr
03.07.17
✎
10:27
|
(22) Да согласен)
|
|||
24
MistaEr
03.07.17
✎
10:28
|
Получается, замечаний по настройке Postgre ко мне нет. Буду работать по оптимизации самого запроса. Всем Спасибо! Отпишусь.
|
|||
25
MistaEr
04.07.17
✎
08:50
|
Снова здравствуйте! В продолжение вчерашней темы хочу написать следующее: Упростил я запрос ДС, для тестирования, вот до такого уровня:
ВЫБРАТЬ РАЗЛИЧНЫЕ Контрагенты.Наименование КАК Наименование, Контрагенты.Менеджер КАК Менеджер, Контрагенты.Телефон КАК Телефон, ДАТАВРЕМЯ(1, 1, 1) КАК ДатаАктивации, ДАТАВРЕМЯ(1, 1, 1) КАК ДатаОкончанияСрокаДействия, Контрагенты.ЭтоГруппа КАК ЭтоГруппа, ВЫРАЗИТЬ(Контрагенты.Комментарий КАК СТРОКА(300)) КАК Комментарий, Контрагенты.Ссылка КАК Ссылка, ЗНАЧЕНИЕ(Справочник.Абонементы.ПустаяСсылка) КАК Абонемент, ВЫБОР КОГДА Контрагенты.ДатаРожденияКлиента <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) ТОГДА РАЗНОСТЬДАТ(Контрагенты.ДатаРожденияКлиента, &ТекущаяДата, ГОД) ИНАЧЕ 0 КОНЕЦ КАК Возраст, ДАТАВРЕМЯ(1, 1, 1) КАК ОсталосьДней, ЗНАЧЕНИЕ(Перечисление.СтатусыКонтрагентов.Потенциальный) КАК Потенциальный, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК АбонементНоменклатура, Контрагенты.ДатаРегистрации КАК ДатаРегистрации, ДАТАВРЕМЯ(1, 1, 1) КАК ДатаИзменения, ДАТАВРЕМЯ(1, 1, 1) КАК ДатаПриобретения, 1 КАК КоличествоАбонементов, ДАТАВРЕМЯ(1, 1, 1) КАК ПериодПотенциальности ИЗ Справочник.Контрагенты КАК Контрагенты ГДЕ НЕ Контрагенты.ЭтоГруппа И &УсловиеТекДатаМинусГоды Отбор устанавливаю таким образом: &НаСервере Процедура ОтборВозрастДоНаСервере() Если ОтборВозрастДо > 0 Тогда ЭтаФорма.Список.ТекстЗапроса = СтрЗаменить(ИсходныйТекстЗапроса, "&УсловиеТекДатаМинусГоды", "Контрагенты.ДатаРожденияКлиента > &ТекДатаМинусГоды"); ЭтаФорма.Список.Параметры.Элементы.Найти("ТекДатаМинусГоды").Значение = ДобавитьМесяц(ТекущаяДата(), -ОтборВозрастДо*12); ЭтаФорма.Список.Параметры.Элементы.Найти("ТекДатаМинусГоды").Использование = Истина; ИначеЕсли ОтборВозрастДо = 0 Тогда ЭтаФорма.Список.ТекстЗапроса = СтрЗаменить(ИсходныйТекстЗапроса, "&УсловиеТекДатаМинусГоды", "Истина"); КонецЕсли; КонецПроцедуры И этот отбор применяется ооочень долго. Даже в файловом варианте базы быстрее отрабатывает |
|||
26
MistaEr
04.07.17
✎
08:56
|
При этом Postgre съедает всего 80MB памяти(тогда когда SQL Express параллельно употребляет 4ГБ), но больше всех кушает процессор (5%)
|
|||
27
Fragster
гуру
04.07.17
✎
09:22
|
вместо отбора по возрасту лучше ставить отбор по дате рождения "больше или равно". Ну, по крайней мере проверить.
|
|||
28
MistaEr
04.07.17
✎
09:32
|
(27) Я так и делаю в (25)
|
|||
29
arsik
гуру
04.07.17
✎
09:42
|
(28) Ограничение прав доступа на уровне записей в базе включено?
|
|||
30
arsik
гуру
04.07.17
✎
09:42
|
+ (29) RLS
|
|||
31
MistaEr
04.07.17
✎
09:45
|
(29) Нет
|
|||
32
MistaEr
04.07.17
✎
09:46
|
Но это все работает прекрасно на SQL Express, как будто не хватает какой то одной галочки в Postgre. Сервер 1С 32, Postgre 64, может здесь какая нестыковка? Касперский стоит, может из-за этого?
|
|||
33
Фрэнки
04.07.17
✎
10:16
|
(32) разве религия запрещает отключить каспера на несколько минут для тестирования?
|
|||
34
Cyberhawk
04.07.17
✎
10:32
|
(33) Зачастую понимание того, что мешал Касперский, приходит только если его удалить (а не отключить). Если просто отключить, положительного эффекта не наблюдается, а если удалить - наблюдается. Ну это так, поделился опытом.
|
|||
35
dmrjan
04.07.17
✎
10:37
|
Может это фрагмент можно через функцию организовать при начальном отборе?
КОГДА Контрагенты.ДатаРожденияКлиента <> ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) ТОГДА РАЗНОСТЬДАТ(Контрагенты.ДатаРожденияКлиента, &ТекущаяДата, ГОД) |
|||
36
MistaEr
04.07.17
✎
10:42
|
(35) Только не говорите что именно здесь постгре зависает)
|
|||
37
dmrjan
04.07.17
✎
10:46
|
(36) Единственно, что могу сказать, что PostgreSQL не любить перебора данных. Несмотря на то, что чтение работает на ура, но когда его заставляют в одной единственной таблице производить проверку условия методом перебора, то тогда будет тупить.
|
|||
38
MistaEr
04.07.17
✎
10:51
|
(37) А как через функцию?
|
|||
39
ildary
04.07.17
✎
10:58
|
(32) Мне интересно, что делает Касперский на служебных серверах, куда простым юзерам доступа нет? Пожирает излишние гигагерцы и мегабайты?
|
|||
40
dmrjan
04.07.17
✎
10:59
|
(38) Я через СКД запрос делаю. Там же добавляю функции в запросе, а потом просто накладываю условия.
|
|||
41
arsik
гуру
04.07.17
✎
11:02
|
(26) Значит у тебя в постгре кэш неверно настроен. Он должен туда горячие данные сваливать.
|
|||
42
dmrjan
04.07.17
✎
11:03
|
(38) Прайс делается одинаково быстро и на MSSQL и на PostgreSQL примерно за 3 сек.
ВЫБРАТЬ ЦеныНоменклатурыСрезПоследних.ТипЦен, ЦеныНоменклатурыСрезПоследних.Номенклатура, ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры КАК Характеристика, ЦеныНоменклатурыСрезПоследних.Валюта, ЦеныНоменклатурыСрезПоследних.Цена, ТоварыНаСкладахОстатки.Склад, ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток, ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.лКоэффициент КАК К, ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.лКоэффициент = 1 И ТоварыНаСкладахОстатки.КоличествоОстаток < &ОстатокДляНефасованного ИЛИ ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.лКоэффициент <> 1 И ТоварыНаСкладахОстатки.КоличествоОстаток < &ОстатокДляФасованного * ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.лКоэффициент ТОГДА "<" ИНАЧЕ ">" КОНЕЦ КАК ОстатокС, ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.Код КАК Код, ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.Цена > 0 ТОГДА "" ИНАЧЕ "-" КОНЕЦ КАК Заказ ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних( , Цена > 0 И Номенклатура.ВидНоменклатуры <> "Услуга") КАК ЦеныНоменклатурыСрезПоследних ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура ГДЕ ТоварыНаСкладахОстатки.КоличествоОстаток > 0 |
|||
43
arsik
гуру
04.07.17
✎
11:04
|
+ (41) Выложи конфиг постгри на пастебин. Посмотрим
|
|||
44
MistaEr
04.07.17
✎
11:06
|
(39) Админ
|
|||
45
MistaEr
04.07.17
✎
11:08
|
(41) А как настроить кэш?
|
|||
46
dmrjan
04.07.17
✎
11:13
|
(26) А действительно - почему PostgreSQL так мало памяти ест?
https://postgrespro.ru/products/1c_build Если ставить отсюда, то под Windows при установке предлагает оптимизировать начальную конфигурацию. Потом можно тюнинг наводить. |
|||
47
Lama12
04.07.17
✎
11:13
|
(26) Постгри на Винде?
|
|||
48
MistaEr
04.07.17
✎
11:19
|
(47) Да Винда
|
|||
49
Hmster
04.07.17
✎
11:19
|
а действительно ли вы правильно настроили постгре? статья по настройке не совсем корректная. насколько я помню effective_cache_size это файловый кеш а не озу. если его поставить большим у тебя винт будет работать и больше ничего.
|
|||
50
MistaEr
04.07.17
✎
11:27
|
А использование ВТ в ДС все еще нельзя да?
|
|||
51
arsik
гуру
04.07.17
✎
11:33
|
(50) давно вроде можно
|
|||
52
Lama12
04.07.17
✎
11:34
|
(48) Забудь что сможешь увидеть сколько Постгри использует. Часть настроек работы с кэш не работают. Часть будут работать так, как решит винда. Если винда больше чем 2008 там в мониторе ресурсов есть память в режиме ожидания это и есть кэш Постгри.
|
|||
53
Lama12
04.07.17
✎
11:34
|
(52) Ну... Примерно.
|
|||
54
MistaEr
04.07.17
✎
12:44
|
И еще, что я заметил, когда перезапускаешь отладчик, старый сеанс не закрывается
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |