Если бы все ваши пользователи были в 11g Enterprise Edition, я бы порекомендовал вам использовать встроенное в Oracle кэширование набора результатов вместо того, чтобы пытаться свернуть свое собственное.Но это не так, поэтому давайте двигаться дальше.
Еще одним привлекательным вариантом может быть использование коллекций PL / SQL, а не таблиц.Находясь в памяти, они быстрее извлекаются и требуют меньше обслуживания.Они также поддерживаются во всех нужных вам версиях.Тем не менее, они являются переменными сеанса, поэтому, если у вас много пользователей с большими наборами результатов, которые могут повлиять на распределение PGA.Также их данные будут потеряны, когда сетевое соединение обрывается.Так что это, вероятно, не то решение, которое вы ищете.
Суть вашей проблемы заключается в следующем утверждении:
DELETE FROM per_user_result_set WHERE user_login = :x;
Само по себе это не проблема, но у вас очень большие различия в распределении данных.Грубо говоря, удаление одной строки будет иметь совсем другой профиль производительности, чем удаление полумиллиона строк.А поскольку ваши пользователи постоянно обновляют свои данные, вы никак не можете справиться с этим, кроме как путем предоставления своим пользователям собственных таблиц.
Вы говорите, что не хотите иметь таблицу для каждого пользователя, потому что
«[это] было бы интересным повышением производительности для пользователей, но не для нас, сопровождающих системы», *
Системы существуют в интересах наших пользователей.Удобство для нас - это здорово, если оно помогает нам предоставлять им лучший сервис.Но их потребность в хорошем рабочем опыте превосходит нашу: они оплачивают счета.
Но я сомневаюсь, действительно ли наличие индивидуальных таблиц для каждого пользователя увеличивает рабочую нагрузку.Я предполагаю, что каждый пользователь имеет свою учетную запись и, следовательно, схему.
Я предлагаю вам придерживаться упорядоченных таблиц.Вам нужны только столбцы, которые находятся в первичном ключе, и поддержание отдельного индекса не требует дополнительных затрат (как для вставки, так и для удаления).Большим преимуществом наличия таблицы для каждого пользователя является то, что вы можете использовать TRUNCATE TABLE в процессе обновления, который намного быстрее, чем удаление.
Таким образом, ваша процедура обновления будет выглядеть следующим образом:
BEGIN
TRUNCATE TABLE per_user_result_set REUSE STORAGE;
INSERT INTO per_user_result_set(...)
SELECT ... FROM ...;
DBMS_STATS.GATHER_TABLE_STATS(user
, 'PER_USER_RESULT_SET'
, estimate_percent=>10);
COMMIT;
END;
/
Обратите внимание, что вам больше не нужно включать столбец USER, поэтому в таблице yur будет только один столбец result_set_item_id
(еще один признак пригодности IOT.
Сбор статистики по таблицене является обязательным, но это целесообразно. У вас есть широкий разброс в размере наборов результатов, и вы не хотите использовать план выполнения, разработанный для 500000 строк, когда таблица имеет только одну строку, или наоборот.
Единственные накладные расходы - это необходимость создания таблицы в схеме пользователя, но, вероятно, у вас уже есть некоторые настройки для нового пользователя - создание учетной записи, предоставление привилегий и т. Д., Так что это не должно бытьбольшие трудности.