Этот вопрос относится к хранимым процедурам, написанным на SQL-92
то есть Oracle PL / SQL, SQL Server T-SQL или DB2 SQL
Я поддерживаю хранимую процедуру в 11000 строк.
Я обнаружил, что к концу хранимой процедуры мне нужно вывести 80 столбцов данных.
В этой хранимой процедуре есть 3 различных этапа.
- Сбор данных (копирование данных из живых таблиц в промежуточные таблицы хранимых процедур)
Мне нужно выполнить сбор данных для согласованности, потому что данные LIVE (т.е. в таблице элементов) в строке 30 могли бы измениться к тому времени, когда выполнение хранимой процедуры попадет в строку 10000
Здесь сохраняется атомарность состояния фиксации (нет фиксации, пока не скопированы все необходимые данные)
- Расчет (много SQL, достаточно сложный, чтобы Курсоры или Представления не выполняли свою работу)
- Обратная запись в постоянные таблицы (счета, AR, платежи)
Здесь сохраняется атомарность состояния фиксации (нет фиксации, пока не скопированы все необходимые данные)
«Промежуточные» таблицы используются только в хранимой процедуре.
Они индексируются для соединений по линии, но не имеют
Ограничения ссылочной целостности PK / FK или уникальные индексы
так как это значительно замедлит выполнение, кроме того
указывать обратно на данные в реальном времени (то есть в потоке)
Когда вы получаете до 80 столбцов данных, которые вам необходимо отчитаться к концу сохраненного
процедура, которую вы запускаете с учетом ограничений СУБД (ограничения индекса, ограничения памяти,
SQL присоединяются к ограничениям COST, неконтролируемой подкачки и данных, переходящих в виртуальные
память / своп, когда БД считает, что она должна использовать HASH вместо NESTED LOOPS)
Я нормализовал данные LIVE (которые записываются и читаются пользователями с 24/7)
Мне пришло в голову, что способ оптимизации пространства, занимаемого промежуточными таблицами
используется в хранимой процедуре (на шаге 2), чтобы найти составные первичные ключи и назначить
каждый уникальный идентификатор (суррогатный PK), тем самым ссылаясь на n столбцов с 1 столбцом. Тогда я
восстановит эти данные в конце шага 2 и будет готов к
отпишитесь в начале шага 3. Это добавит больше обработки к
шаг 2, но будет скопировано меньше данных. Также отладка заняла бы
больше шагов (отслеживание идентификаторов до фактических данных в промежуточном звене
данные таблицы после выполнения)
Кто-нибудь сталкивался с этим сценарием с длительными хранимыми процедурами?
Кто-нибудь создал суррогатный ключ (заменив составной PK на PK с одним столбцом) в
промежуточные таблицы, которые используются только в хранимых процедурах?
Окупается ли это с точки зрения времени выполнения и используемой памяти / пространства во время
исполнение?