powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обновить "пользовательский" кеш
25 сообщений из 32, страница 1 из 2
Как обновить "пользовательский" кеш
    #40042836
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Имею
Пользователь №1 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
Пользователь №2 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
(запрос реально не выполнился вернулись старые данные)
Пользователь №3 -> ввел другую дату -> выполнил запрос -> результат в таблицу
(запрос выполнился т.к. даты не совпали)
Пользователь №4 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
(запрос выполнился т.к. даты не совпали)
Т.е. - создается операционный пользовательский кеш для последней введенной даты

Реализация в коде (архитектуре не менять - это представление пользователя, пользователь
будет инициировать смену даты)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
-- create or replace view SV_AA as
with function ChangeData(pDrep Date) return Date 
     is 
       pragma autonomous_transaction;  -- пробывал ремировать результат тот же
     begin 
       declare 
         nMax Date; 
         nCount Integer:=0;
       begin
         select Count(*) into nCount from SV_A2 where DAY=pDrep;  
         if nCount=0 then 
           delete from SV_A2;
           insert into SV_A2
           select * from SV_A1 where DAY=pDrep;
           commit;
           select Max(DAY) into nMax from SV_A2 where DAY=pDrep;  
           dbms_output.put_line('Change '||nMax);
         end if;
         return pDrep;
       end;  
     end;
     PARAMETER as (select /*+ Materialize
                              No_Merge(P)
                          */
                          P.DREP
                     from (select
                                  To_Date('01-02-2021','DD-MM-YYYY') DREP
                             from DUAL
                          ) P
                    where Not ChangeData(P.DREP) is Null  
                  )
select A.*
  from SV_A2 A   -- наблюдаю старые данные в МОМЕНТ смены даты
 inner join PARAMETER B  
    on (    B.DREP=A.DAY
       )



Суть вопроса
Смена даты и загрузка данных из SV_A1 в SV_A2 проходит корректно,
но итоговая визуализация в МОМЕНТ изменение даты остается старой
только при повторном запуске данные обновляются.

Как и чем на это можно повлиять ?

Какими другими способами можно решить задачу, архитектуру не менять,
на два предложения НЕ разбивать (смотрю в сторону hint RESULT_CASHE.........)

Версия
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Заранее благодарен !
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40042858
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Задай себе 2 вопроса.
Что такое согласованность данных?
На какой момент согласуются данные в запросе?
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40042859
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,

Нет возражений - согласен !
Как можно обойти такую ситуацию ?
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40042869
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,

Или же в момент смены даты можно делать
1.визуализировать ОРИГИНАЛ запроса
2.операция сохранения этого запроса

В момент повтора
2. виза-ть сохраненную ранее копию
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40042992
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть ли возможность из with function сделать ссылку на with query
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with AAA111 as (select *
                      from DUAL  
                  )

select /*+ WITH_PLSQL */ 
        * 
 from (with
                  function add_fnc(p_id number) return number
                  is
                  begin
                    select Count(*) into ..... from AAA111;
                    return p_id + 1; 
                 end;
           select add_fnc(10) from DUAL
         )



спасибо
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043288
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Ну типа того - а в целом ФИГНЯ
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
create or replace type rcData as object(DAY date,RST numeric(18,2));
create or replace type rtData as table of rcData;

create or replace view SV_V1 as 
with function ChangeData(pField rtData,pDrep Date) return rtData
     is 
       pragma autonomous_transaction; 
     begin 
       declare 
         nExe Integer:=0;
       begin
         select Count(*) into nExe from SV_A2 where DAY=pDrep;
         if nExe=0 then
           delete from SV_A2;
           insert into SV_A2 select * from Table(pField);
           commit;
           dbms_output.put_line('Update');
         end if;
         return pField; 
       end; 
     end;
     PARAMETER as (select /*+ Materialize
                              No_Merge(P)
                          */
                          P.DREP
                     from (select
--                                To_Date('01-01-2021','DD-MM-YYYY') DREP
                                  Cast(To_Date(PARAMETERS.Srep,'DD-MM-YYYY') as Date) DREP
                             from DUAL
                          ) P
                  ),
        SCLIST as (select A.*
                     from SV_A1 A   
                    inner join PARAMETER B 
                       on (    B.DREP=A.DAY
                          ) 
                  )
select A.*
  from Table(ChangeData(Cast((select Collect(rcData(DAY,RST)) from SCLIST) as rtData),(select DREP from PARAMETER))) A
 where not Exists(select 1 from SV_A2 where DAY=(select DREP from PARAMETER)) 
 union all
select * from SV_A2              
 where     Exists(select 1 from SV_A2 where DAY=(select DREP from PARAMETER)) 


Вызов из параметризирован. представления со сменой даты
with PARAMETER as (
                   select /*+ qb_name(Refresh) 
                              no_unnest 
                              push_subq
                              Materialize
                          */ 
                          1 EXEC
                     from DUAL
                    where PARAMETERS.Refresh(
                                                       sDrep=>To_Date('01/02/2021','DD/MM/YYYY')
                                                      ) is Null 
                  )
select A.*
  from SV_V1 A
 where Exists(select 1 from PARAMETER) 
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043699
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Господа может есть еще какие-то идеи ?
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043726
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043787
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

Спасибо за Ваши ссылки

1. относительно мат. представления
Не совсем понимаю как Вы собираетесь инициализировать REFRESH
Своим кодом изменений в базовых объектах я не осуществляю
(SV_A1 = SV_A2 - изменяется контролируемо)
Детализируйте пожалуйста примером.

2. относительно функции c директивой RESULT_CACHE
Насколько понимаю сделать табельную функцию и эта выборка будет висеть в памяти
- как к этой памяти будут иметь доступ другие пользователи
- как долго будет висеть в памяти ? (перегружу кеш если будет массовое применение )


Спасибо за ответы
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043788
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не понимаю, что Вы пытаетесь "нагородить"

Пока для меня выглядит как полная ахинея. Т.к., хотите ручками сделать кэш - ну так и делайте его на PL/SQL. У Вас же какая-то помесь ф-ций и View, выглядящая как "50 метров колючей проволоки"

Если требование иметь View, то тогда не понятно "это представление пользователя, пользователь будет инициировать смену даты", КАК пользователь будет инициирать смену даты. Если же пользовать вызывает некий код, проще тогда все в коде и сделать, без всяких "представление пользователя".
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043790
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

мне нужно совместить две операции смену даты и "свежую" реализация данных и сделать это в виде представления
(с одним предложением)

У меня один пользовательский RecordSet на уровне клиента

Вот алгоритм
Пользователь №1 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
Пользователь №2 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
(запрос реально не выполнился вернулись старые данные)
Пользователь №3 -> ввел другую дату -> выполнил запрос -> результат в таблицу
(запрос выполнился т.к. даты не совпали)
Пользователь №4 -> ввел текущую дату -> выполнил запрос -> результат в таблицу
(запрос выполнился т.к. даты не совпали)
Т.е. - создается операционный пользовательский кеш для последней введенной даты

Как бы Вы это сделали c учетом Ваших предложений ?

Спасибо
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043791
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из фраз "и сделать это в виде представления (с одним предложением)", "у меня один пользовательский RecordSet на уровне клиента"

Лично мне ничего не понятно.

Но скорее всего:
1. Pipilened Function
https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm#CHDJEGHC
2. Сам так не делал
View и параметры
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043792
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XКак бы Вы это сделали c учетом Ваших предложений ?

С учётом предложений Леонида я бы вообще убрал из Вашей схемы часть "результат в таблицу".
Оракул с частью "запрос реально не выполнился" и "запрос выполнился т.к. даты не совпали"
справится совершенно самостоятельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043794
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Из фраз "и сделать это в виде представления (с одним предложением)", "у меня один пользовательский RecordSet на уровне клиента"

Лично мне ничего не понятно.

Но скорее всего:
1. Pipilened Function
https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm#CHDJEGHC
2. Сам так не делал
View и параметры



Если есть время и желание - детализирую
Leonid Kudryavtsev

Из фраз "и сделать это в виде представления (с одним предложением)", "у меня один пользовательский RecordSet на уровне клиента"
Лично мне ничего не понятно.



Архитектурно
У меня на стороне клиента стоит
- один объект ADORecordSet
в него я могу загрузить одно предложение SELECT которое должно сменить дату и визуализировать результат

Две команды последовательно выполнить нельзя

Что не ясно в данной постановке ?
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043795
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

HOME_XКак бы Вы это сделали c учетом Ваших предложений ?

С учётом предложений Леонида я бы вообще убрал из Вашей схемы часть "результат в таблицу".
Оракул с частью "запрос реально не выполнился" и "запрос выполнился т.к. даты не совпали"
справится совершенно самостоятельно.


Полагаю - ДА !
Не могу понять как инициировать REFRESH мат . представления
Если поняли уточните на пример пожалуйста
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043799
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

Pipelined - прием известен - спасибо
Но применить в конкретной ситуации не могу - это НЕ !!! представление
Могу использовать только таблицы и представления

Стараюсь обходиться без PL/SQL или минимизировать его участие
по ходу моего кода использую пакет....

Если это можно реализовать c мат представлением было бы совсем хорошо
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043800
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X

Pipelined - прием известен - спасибо
Но применить в конкретной ситуации не могу - это НЕ !!! представление
...

Вы же в любом случае TABLE( my_function.... ) и так использовали. Не PipeLined, но та же ф-ция только вид сбоку (точнее в памяти).
Зачем при этом сверху наворочено 100500 JOIN... - от меня полностью ускользает.
22277390
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043801
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XНе могу понять как инициировать REFRESH мат . представления

Никак. Потому что это не нужно. Как и само мат.представление скорее всего. Просто
посылаете свой SELECT с условием по дате, используя bind variable, и... "всё, телемаркет".
Дальше Оракул всё сделает самостоятельно.

Чти: https://logicalread.com/huge-performance-gains-using-oracle-11g-result-cache-dr01/
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043803
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
HOME_X

Pipelined - прием известен - спасибо
Но применить в конкретной ситуации не могу - это НЕ !!! представление
...

Вы же в любом случае TABLE( my_function.... ) и так использовали. Не PipeLined, но та же ф-ция только вид сбоку (точнее в памяти).
Зачем при этом сверху наворочено 100500 JOIN... - от меня полностью ускользает.
22277390



Согласен TABLE используется - но нет явного PL/SQL
(предложение "with function" - Oracle внес в ядро - это не внешний объект)
Мне НЕ нравиться использование COLLECT - отсюда ищу Вашей помощи

Суть SV_V1 следующая

- если дата есть в кэше - визуализируем КЭШ (SV_A2)
union
select * from SV_A2
where Exists(select 1 from SV_A2 where DAY=(select DREP from PARAMETER))


- если дата НЕТ в кэше - выполняем основной запрос
SCLIST as (select A.*
from SV_A1 A
inner join PARAMETER B
on ( B.DREP=A.DAY
)
)

преобразуем его в тип. коллекцию (array - table) - этот момент мне совсем не Нравиться !!!!!!!!!!!

Cast((select Collect(rcData(DAY,RST)) from SCLIST) as rtData )

и передаем его в функцию DateChange, которая ,без изменений возвращает в основной запрос
- предварительно записав в КЭШ-таблицу (основная цель функции запись в автономной транзакции)

возвращенный массив визуализируем через Table

Преобразование в COLLECT - не знаю как передать SCLIST в явном виду (REF CURSOR ?????)

Такие манипуляции нужны - так как есть проблема в СОГЛАСОВАНОСТИ между транзакциями основной и автономной при записи

"
Суть вопроса
Смена даты и загрузка данных из SV_A1 в SV_A2 проходит корректно,
но итоговая визуализация в МОМЕНТ изменение даты остается старой
только при повторном запуске данные обновляются.
"
Все ли ясно ?

Давайте поговорим о Вашим предложениях в свете

"
Архитектурно
У меня на стороне клиента стоит
- один объект ADORecordSet
в него я могу загрузить одно предложение SELECT которое должно сменить дату и визуализировать результат

Две команды последовательно выполнить нельзя
"
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043807
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
HOME_XНе могу понять как инициировать REFRESH мат . представления

Никак. Потому что это не нужно. Как и само мат.представление скорее всего. Просто
посылаете свой SELECT с условием по дате, используя bind variable, и... "всё, телемаркет".
Дальше Оракул всё сделает самостоятельно.

Чти: https://logicalread.com/huge-performance-gains-using-oracle-11g-result-cache-dr01/


Вот этот момент мне интересен и не совсем ясен !
2. относительно директивы RESULT_CACHE
Насколько понимаю сделать табельную функцию и эта выборка будет висеть в памяти
- как к этой памяти будут иметь доступ другие пользователи
- как долго будет висеть в памяти ? (перегружу кеш если будет массовое применение )
- как проверить реально ли выполняется запрос или очередной вызов идет из кэш

Спасибо
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043814
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XНасколько понимаю сделать табельную функцию и эта выборка будет висеть в памяти

Нет, ты ничего не понимаешь. Функция не нужна. Внимательно читай как текст по ссылке так и
документацию Оракула. https://docs.oracle.com/database/121/TGDBA/tune_result_cache.htm
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043856
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Спасибо - работаю - вроде то что хотел видеть

Еще вопрос
Включение кеша наблюдаю в плане запроса, в соответствии с инструкцией

Запрос первично во времени работает 1-3 минуты - результат 10 записей по 5 полей

Запрос ВТОРИЧНО должен работать секунды - т.е. простое считывание 10 записей
Но по прежнему работает 1-3 минуты (параметры как Вы поняли не менял)

При это в разделе Result Cash плана оптимизации присутствуют название полей оригинала
таблицы, в запросе меняю названия на более созвучные по функционалу

Поясните пожалуйста - спасибо
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043857
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
HOME_X,

если произошли хоть какие-то изменения в любой из таблиц, от которых зависит конкретный result_cache (смотреть v$result_cache_dependency + v$result_cache_objects), то он инвалидируется и его снова надо собирать.

еще раз до просветления:
AlexFF__|
Что такое согласованность данных?
На какой момент согласуются данные в запросе?


зы. имхо, бред какой-то изначально. не с того конца к задаче подошли
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043861
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
HOME_X,

И выше уже показали: 22276112
Тупо вместо запроса такой анонимный блок выставляйте - ваша версия позволяет.

Зы. Но за несогласованные данные у вас хороший шанс получить по шаловливым ручкам...
...
Рейтинг: 0 / 0
Как обновить "пользовательский" кеш
    #40043975
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_Xв запросе меняю названия на более созвучные по функционалу

Что вы там меняете? Запрос должен быть одним и тем же. С точностью до байта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обновить "пользовательский" кеш
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]