Промпт и код для админа, на все ушло с объяснениями 7 мин. — 23 апреля 2026 г. в 14:18:57.549
Промпт и код для админа, на все ушло с объяснениями 7 мин. -------------------------------------------------------------- ORACLE SQL PLSQL Собери статистику по таблицам схемы SCOTT Используй EXECUTE IMMEDIATE Статистику собирай по таблицам , где число измененных записей превысило 10% после последнего сбора статистик ----------------------------------------------------------------- DECLARE v_sql VARCHAR2(4000); v_total_rows NUMBER; v_num_updates NUMBER; v_threshold NUMBER; BEGIN -- Устанавливаем порог в 10% v_threshold := 0.1; -- Для каждой таблицы в схеме SCOTT FOR tab_rec IN ( SELECT table_name FROM all_tables WHERE owner = 'SCOTT' AND table_name NOT LIKE 'BIN$%' -- исключаем таблицы в корзине ) LOOP -- Получаем общее количество строк в таблице BEGIN EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SCOTT.' || tab_rec.table_name INTO v_total_rows; -- Если таблица пустая, пропускаем IF v_total_rows = 0 THEN CONTINUE; END IF; -- Проверяем количество изменений через представление USER_TAB_MODIFICATIONS -- (это представление доступно если включена статистика мониторинга) BEGIN EXECUTE IMMEDIATE 'SELECT inserts + updates + deletes FROM all_tab_modifications ' || 'WHERE table_owner = ''SCOTT'' AND table_name = :1' INTO v_num_updates USING tab_rec.table_name; -- Если количество изменений превышает порог, собираем статистику IF v_num_updates > (v_total_rows * v_threshold) THEN DBMS_OUTPUT.PUT_LINE('Собираем статистику для таблицы: ' || tab_rec.table_name || ', изменений: ' || v_num_updates || ', всего строк: ' || v_total_rows); v_sql := 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(' || 'ownname => ''SCOTT'', ' || 'tabname => ''' || tab_rec.table_name || ''', ' || 'estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, ' || 'method_opt => ''FOR ALL COLUMNS SIZE AUTO'', ' || 'cascade => TRUE); END;'; EXECUTE IMMEDIATE v_sql; DBMS_OUTPUT.PUT_LINE('Статистика собрана для: ' || tab_rec.table_name); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN -- Если нет записей в all_tab_modifications, таблица не изменялась CONTINUE; WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ошибка при проверке изменений для ' || tab_rec.table_name || ': ' || SQLERRM); END; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ошибка при обработке таблицы ' || tab_rec.table_name || ': ' || SQLERRM); END; END LOOP; END; ---------------------------------------------------

