Шпаргалки и дорожные карты
Шпаргалки и дорожные карты написаны не для того, чтобы узнать что-то новое, а чтобы не вспоминать и не гуглить.
RegExp шпаргалки
1. Генерация UPDATE\Field(форма) из SELECT
Подобный подход сохраняет много времени при работе с большими таблицами .
Допустим у нас есть запрос такого вида
Выделим блок между SELECT и FROM и вставим в любой редактор с поддержкой регулярных выражений или на сайт: https://regex101.com/
Регулярное выражение, которое мы будем использовать для поиска:
Заменяем всё на:
И получаем запрос вида:
Генерация <Field Name="BlaBlaId"/> выглядит так же. Вот выражение для замены:
2. Генерация переменных функции из DDL таблицы.
Допустим у нас есть таблица вида
и нам нужно написать для неё функции на update и insert. И если для 5 переменных всё просто, то уже при 20-30 переменных руки сами тянутся к простому способу.
Вставляем все столбцы, которые нас интересуют в регулярное выражение для получения имён переменных:
А в замене указываем
Получаем набор переменных вида
Если нужно написать update, то таким же способом пишем
Получаем поля для update
Регулярное выражение для выделения всего, включая тип переменной:
3. Чистка форм v2.
Раньше использовался аттрибут ObjectType="typeObject", который современный редактор воспринимает как ошибку. Используя регулярное выражение
С заменой на пустоту форма очищается моментально, что сильно облегчает работу с редактором.
4. Полезные регулярные выражения, которые экономят время
В разных ситуациях нужны разные регулярные выражения, список, что написался\собрался за годы:
На самом деле регулярные выражения экономят кучу времени и зачастую правильно написанная за полдня регулярка может сохранить очень много времени.
Дорожные карты работы с v3
Добавление печатной переменной
Добавить переменную в запрос SQL
Добавить переменную на форму
Проверить, что новая переменная работает при печати
Определить категорию переменной, после чего создать саму переменную в schema.document_template_variable, где в title указываем имя переменной, которое указывается в word(<#Variablename#>, например). name выбираем произвольно.
По name переменной создать перевод описания в public.strings дял всех языков, что используются в проекте
Если в проекте используются фильтры, то добавить эту переменную в таблицу schema.document_template_use_variable
Добавление отчета
INSERT INTO schema.report(title,name) values ('Отчет по бабкам', 'report_grand_mother');
Поправить collect.user_info
Добавить отчет в запросы для страницы UserEdit.xml и добавить её в запросы. Добавить переменную в массив для сохранения и в массив сверки.
Сделать ссылку на отчет в StartForm
Создать отчет
Добавление уведомлений в Carrent
Создать 2 поля в настройках: уведомлять о и значение через сколько уведомлять. Добавить изменения на форму CarrentSettings.
Сделать необходимые правки в основной базе(rent_save\смена логики\ исправление работы залогов\ добавление новых полей в аренду ит.п.)
Добавить новый тип уведомления INSERT INTO carrent.notification_type(title, name, template) VALUES ('Имя уведомления', 'NOTIFICATION_NAME', 'TEMPLATE_NAME');
Добавить в public.strings для каждого из языков шаблон для NOTIFICATION_NAME и TEMPLATE_NAME. Для NOTIFICATION_NAME короткое имя уведомления: возврат залога. Для TEMPLATE_NAME расширеная версия для частного случая: Пора вернуть залог в аренде {car_title} от {rent_date_start}.
Внести правки в функцию rent_add_notifications.
Внести правки во view carrent.active_notifications
В файле CarrentNotificationList.xml сделать условие на проверку по имени уведомления, в команду RentEditFormShowCommand при необходимости внести изменения на открытие нужной вкладки.
CarrentStart - проверить в настройках галочку об уведомлении. Сделать SecondaryConnection по имени уведомления, кондишн, что уведомлений больше 0, кондишн проверки галки, сделать элемент меню в меню уведомлений
В NotificationListCountVariable добавить счетчик с новым уведомлением
SQL шпаргалки
0. Мы все в большинстве своём не DBA, но это не отменяет того, что хорошим тоном будет изучение своих баз данных, чтобы привести их к человеческому виду.
На версиях до PostgreSQL 12 CTE очень плохо работают с оптимизатором. Из-за этого нужно обязательно проверять через EXPLAIN ANALYZE работу вашего запроса. Тем не менее не стоит создавать десять вложенных друг в друга подзапросов с именем T\M\PPC. Давайте им хотя бы какое-то время и если EXPLAIN analyze не уничтожает ваш запрос с CTE, то используйте CTE.
Постарйтесь не использовать рекурсивные CTE, они очень плохо реализованы на PostgreSQL, получаются слишком большие нагрузки на процессор при чтении. Если это не очень трудно закладывайте индексацию во время записи, если это не сильно нагрузит запись, или создавайте это на уровне языка.
Сложные функции на plpgsql очень плохо работают на дистанции, если есть возможность, то постарайтесь делать это либо чистым запросом, или на уровне языка. Как в очередной раз показывает практика. Если нужно сделать что-то сложнее 5-10 операций вычислительных, кроме CRUD, то лучше сделать это на языке.
Введите правило, добавляя Foreign key к чему - то большому, создавайте индекс по этому полю, если у вас есть частные запросы. Например, если мы делаем foreign_key на client_id в таблице phone, то лучше сразу создать на поле client_id в таблице phone индекс, если существует запрос вида
Получение кол-ва дней между двумя датами с округлением вверх
Чтобы не уродовать LATER JOIN нижнюю часть запроса и не усложнять работу оптимизатору, если фильтрация есть в верхней части, можно сделать запрос вида(отсылка к номеру 1, но тем не менее, LATERAL зачастую будет ещё хуже).
Чтобы получить то, что вы получали LATER JOIN.
Сбор дубликатов
Проверка нормально написанных настроек и запросов для базы:
На правильно настроенной и грамотно собранной БД ratio будет выше 0.9. Если вы читали статью про индексы, то знаете, что оптимизатор не всегда выбирает способ сбора запроса в оперативной памяти, эти значения как раз относятся к этой истории.
Запрос на использование индексов. Если у таблицы более 40-50 тысяч записей и низкий процент использования индекса, то это повод задуматься над тем, чтобы проанализировать запросы\базу и добавить нужные индексы
Поиск индексов, которые не использовались. Необязательно их удалять, но если создан большой индекс, который никак не используется уже несколько месяцев, то стоит задуматься об его пользе. Если же это редко используемый индекс для огромной таблицы, то может быть стоит подумать о сводных полях за какое-то время, чтобы не лезть каждый раз в таблицу, не сканировать её по 30 секунд, а просто получать все данные, до 1 января прошлого года? В частности это относится к таблице в carrent'ах снизу справа с прибылью
Список активных запросов
PgAdmin3 не поддерживает версии постгреса старше 13, а переход на PostgreSQL 15 кажется с каждым годом всё более важным и нужным. Чтобы не страдать потом муками отвыкания от устаревшего морально клиента для работы с базами данных, попробуйте найти для себя что-то более удобное:
psql - представлен больше как шутка, мало любителей работать в cmd
PgAdmin4 - просто привычный клиент, криво написанный, зато бесплатный. Как его использовать не очень ясно.
DataGrip - хороший клиент. Shareware
NaviCat - шикарный клиент, Shareware, причем дорогой
Dbeaver - FreeWare клиент, написанный на java. Редактор писался теми, кто очень любит Eclipse, поэтому и настройки, и работа с ним очень похожа. В целом один из лучших представителей бесплатных клиентов, при этом быстро развивающийся.
Если вы считаете, что есть что-то ещё, что нужно включить в этот список на сегодняшний день, пишите на почту crabiki4@gmail.com
Last updated