powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / самодельный rewrite query
10 сообщений из 10, страница 1 из 1
самодельный rewrite query
    #36464342
_Nikotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующая задача, есть таблица по которой происходит поиск вида
Код: plaintext
1.
2.
select t.product_id 
from t_product t
where t.information like '%something%'
на столбце information построен context индекс, хочется автоматически переписывать эти запросы к виду
Код: plaintext
1.
2.
select t.product_id 
from t_product t
where contains(t.information, 'something') >  0 
Понятно что эти запросы не равносильны, но в данном случае достаточно использовать второй вариант запроса. Изменять приложение генерирующие эти запросы - сложно. Можно ли на лету изменять текст запроса?
Думал о RLS, но это всё равно потребует действий со стороны приложения. Ещё подумал о использовании FGA + возможности запускать PLSQL код при операциях select, что можно использовать для анализирования select и выставления контекста.
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464393
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри DBMS_ADVANCED_REWRITE.
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464487
_Nikotin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, посмотрел, даже такое не проходит:
Код: plaintext
1.
2.
3.
4.
5.
6.
  SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
     name             => 'test_rewrite',
     source_stmt      => 'SELECT * FROM t where information like :1',
     destination_stmt => 'SELECT * FROM t where contains(information, :1) > 0',
     validate         => FALSE,
     rewrite_mode     => 'TEXT_MATCH');
ORA-30353 expression not supported for query rewrite :(
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464502
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

а по какому принципу оно решает применять трансформацию? такое ощущение, что зависит от фазы луны, база 10.2.0.4:

Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
SQL> exec  SYS.DBMS_ADVANCED_REWRITE.drop_rewrite_equivalence(name => 'wf_agent_1');
BEGIN SYS.DBMS_ADVANCED_REWRITE.drop_rewrite_equivalence(name => 'wf_agent_1'); END;

*
ERROR at line  1 :
ORA- 30391 : the specified rewrite equivalence does not exist 
ORA- 06512 : at "SYS.DBMS_ADVANCED_REWRITE", line  256  
ORA- 06512 : at line  1  


SQL> 
SQL> BEGIN
   2      SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
   3         name               => 'wf_agent_1',
   4         source_stmt        => 'SELECT /*+ CARDINALITY(1) */ wis.r_object_id AS r_object_id FROM  dmi_workitem_s wis WHERE wis.r_runtime_state >= 0 AND wis.r_runtime_state <= 1 AND wis.r_auto_method_id > ''0000000000000000'' AND wis.a_wq_name = '' ''',
   5         destination_stmt   => 'SELECT /*+ CARDINALITY(1) */ wis.r_object_id AS r_object_id FROM  dmi_workitem_s wis WHERE CASE  WHEN wis.r_runtime_state IN(0,1) AND wis.r_auto_method_id > ''0000000000000000'' THEN 1 END IS NOT NULL AND wis.a_wq_name = '' ''',
   6         VALIDATE           => FALSE,
   7         rewrite_mode       => 'recursive');
   8   END;
   9   /

PL/SQL procedure successfully completed.

SQL> 
SQL> SELECT                                                   /*+ CARDINALITY(1) */
   2         wis2.r_object_id
   3     FROM (SELECT wis3.r_object_id AS r_object_id
   4             FROM (SELECT                                   /*+ CARDINALITY(1) */
   5                         wis.r_object_id AS r_object_id
   6                     FROM dmi_workitem_s wis
   7                    WHERE     wis.r_runtime_state >=  0 
   8                          AND wis.r_runtime_state <=  1 
   9                          AND wis.r_auto_method_id > '0000000000000000'
  10                          AND wis.a_wq_name = ' ') wis3
  11            WHERE ROWNUM <=  100 ) wis2;

no rows selected


Execution Plan
----------------------------------------------------------                                                                                                                                                                                                                                                  
Plan hash value:  1126945702                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                            
------------------------------------------------------------------------------------------------------                                                                                                                                                                                                      
| Id  | Operation                     | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                      
------------------------------------------------------------------------------------------------------                                                                                                                                                                                                      
|    0  | SELECT STATEMENT              |                      |      1  |     10  |      1    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                      
|    1  |  VIEW                         |                      |      1  |     10  |      1    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                      
|*   2  |   COUNT STOPKEY               |                      |       |       |            |          |                                                                                                                                                                                                      
|*   3  |    TABLE ACCESS BY INDEX ROWID| DMI_WORKITEM_S       |      1  |     41  |      1    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                      
|*   4  |     INDEX FULL SCAN           | X_DMI_WORKITEM_AGNT1 |     22  |       |      1    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                      
------------------------------------------------------------------------------------------------------                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                            
Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                            
    2  - filter(ROWNUM<= 100 )                                                                                                                                                                                                                                                                                  
    3  - filter("WIS"."A_WQ_NAME"=' ')                                                                                                                                                                                                                                                                        
    4  - filter(CASE  WHEN (("R_RUNTIME_STATE"= 0  OR "R_RUNTIME_STATE"= 1 ) AND                                                                                                                                                                                                                                  
              "R_AUTO_METHOD_ID">'0000000000000000') THEN  1  END  IS NOT NULL)                                                                                                                                                                                                                               


Statistics
----------------------------------------------------------                                                                                                                                                                                                                                                  
         127   recursive calls                                                                                                                                                                                                                                                                                
           0   db block gets                                                                                                                                                                                                                                                                                  
          53   consistent gets                                                                                                                                                                                                                                                                                
           0   physical reads                                                                                                                                                                                                                                                                                 
           0   redo size                                                                                                                                                                                                                                                                                      
         246   bytes sent via SQL*Net to client                                                                                                                                                                                                                                                               
         381   bytes received via SQL*Net from client                                                                                                                                                                                                                                                         
           2   SQL*Net roundtrips to/from client                                                                                                                                                                                                                                                              
           0   sorts (memory)                                                                                                                                                                                                                                                                                 
           0   sorts (disk)                                                                                                                                                                                                                                                                                   
           0   rows processed                                                                                                                                                                                                                                                                                 

SQL> 
SQL> UPDATE                                           /*+ USE_NL(dmi_workitem_s) */
   2         dmi_workitem_s
   3      SET a_wq_name = ' '
   4    WHERE r_object_id = ANY (SELECT                         /*+ CARDINALITY(1) */
   5                                   wis2.r_object_id
   6                               FROM (SELECT wis3.r_object_id AS r_object_id
   7                                       FROM (SELECT         /*+ CARDINALITY(1) */
   8                                                   wis.r_object_id
   9                                                       AS r_object_id
  10                                               FROM dmi_workitem_s wis
  11                                              WHERE wis.r_runtime_state >=  0 
  12                                                    AND wis.r_runtime_state <=  1 
  13                                                    AND wis.r_auto_method_id >
  14                                                          '0000000000000000'
  15                                                    AND wis.a_wq_name = ' ')
  16                                            wis3
  17                                      WHERE ROWNUM <=  100 ) wis2);

 0  rows updated.


Execution Plan
----------------------------------------------------------                                                                                                                                                                                                                                                  
Plan hash value:  464588227                                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                            
-----------------------------------------------------------------------------------------------------------                                                                                                                                                                                                 
| Id  | Operation                       | Name                    | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                 
-----------------------------------------------------------------------------------------------------------                                                                                                                                                                                                 
|    0  | UPDATE STATEMENT                |                         |      1  |     51  |    507    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                 
|    1  |  UPDATE                         | DMI_WORKITEM_S          |       |       |            |          |                                                                                                                                                                                                 
|    2  |   NESTED LOOPS                  |                         |      1  |     51  |    507    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                 
|    3  |    VIEW                         |                         |      1  |     10  |    506    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                 
|*   4  |     COUNT STOPKEY               |                         |       |       |            |          |                                                                                                                                                                                                 
|    5  |      TABLE ACCESS BY INDEX ROWID| DMI_WORKITEM_S          |  33123  |  1326K|    506    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                 
|*   6  |       INDEX SKIP SCAN           | X_DMI_WORKITEM_WF_AGENT |  33123  |       |      8    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                 
|*   7  |    INDEX UNIQUE SCAN            | D_1F00004180000184      |      1  |     41  |      1    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                 
-----------------------------------------------------------------------------------------------------------                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                            
Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                            
    4  - filter(ROWNUM<= 100 )                                                                                                                                                                                                                                                                                  
    6  - access("WIS"."A_WQ_NAME"=' ' AND "WIS"."R_AUTO_METHOD_ID">'0000000000000000' AND                                                                                                                                                                                                                     
              "WIS"."R_RUNTIME_STATE">= 0  AND "WIS"."R_RUNTIME_STATE"<= 1 )                                                                                                                                                                                                                                    
       filter("WIS"."R_RUNTIME_STATE"<= 1  AND "WIS"."R_RUNTIME_STATE">= 0 )                                                                                                                                                                                                                                    
    7  - access("R_OBJECT_ID"="WIS2"."R_OBJECT_ID")                                                                                                                                                                                                                                                           


Statistics
----------------------------------------------------------                                                                                                                                                                                                                                                  
         155   recursive calls                                                                                                                                                                                                                                                                                
           0   db block gets                                                                                                                                                                                                                                                                                  
          61   consistent gets                                                                                                                                                                                                                                                                                
           0   physical reads                                                                                                                                                                                                                                                                                 
           0   redo size                                                                                                                                                                                                                                                                                      
         544   bytes sent via SQL*Net to client                                                                                                                                                                                                                                                               
        1628   bytes received via SQL*Net from client                                                                                                                                                                                                                                                         
           6   SQL*Net roundtrips to/from client                                                                                                                                                                                                                                                              
           1   sorts (memory)                                                                                                                                                                                                                                                                                 
           0   sorts (disk)                                                                                                                                                                                                                                                                                   
           0   rows processed                                                                                                                                                                                                                                                                                 

SQL> 
SQL> 
SQL> SELECT                                                   /*+ CARDINALITY(1) */
   2         wis2.r_object_id
   3     FROM (SELECT wis3.r_object_id AS r_object_id
   4             FROM (SELECT                                   /*+ CARDINALITY(1) */
   5                         wis.r_object_id AS r_object_id
   6                     FROM dmi_workitem_s wis
   7                    WHERE     wis.r_runtime_state >=  0 
   8                          AND wis.r_runtime_state <=  1 
   9                          AND wis.r_auto_method_id > '0000000000000000'
  10                          AND wis.a_wq_name = ' ') wis3
  11            WHERE ROWNUM <=  100 ) wis2;

no rows selected


Execution Plan
----------------------------------------------------------                                                                                                                                                                                                                                                  
Plan hash value:  1433855928                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                                                                                            
---------------------------------------------------------------------------------------------------------                                                                                                                                                                                                   
| Id  | Operation                     | Name                    | Rows  | Bytes | Cost (%CPU)| Time     |                                                                                                                                                                                                   
---------------------------------------------------------------------------------------------------------                                                                                                                                                                                                   
|    0  | SELECT STATEMENT              |                         |      1  |     10  |    506    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                   
|    1  |  VIEW                         |                         |      1  |     10  |    506    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                   
|*   2  |   COUNT STOPKEY               |                         |       |       |            |          |                                                                                                                                                                                                   
|    3  |    TABLE ACCESS BY INDEX ROWID| DMI_WORKITEM_S          |  33123  |  1326K|    506    ( 0 )|  00 : 00 : 07  |                                                                                                                                                                                                   
|*   4  |     INDEX SKIP SCAN           | X_DMI_WORKITEM_WF_AGENT |  33123  |       |      8    ( 0 )|  00 : 00 : 01  |                                                                                                                                                                                                   
---------------------------------------------------------------------------------------------------------                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                                                            
Predicate Information (identified by operation id):                                                                                                                                                                                                                                                         
---------------------------------------------------                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                            
    2  - filter(ROWNUM<= 100 )                                                                                                                                                                                                                                                                                  
    4  - access("WIS"."A_WQ_NAME"=' ' AND "WIS"."R_AUTO_METHOD_ID">'0000000000000000' AND                                                                                                                                                                                                                     
              "WIS"."R_RUNTIME_STATE">= 0  AND "WIS"."R_RUNTIME_STATE"<= 1 )                                                                                                                                                                                                                                    
       filter("WIS"."R_RUNTIME_STATE"<= 1  AND "WIS"."R_RUNTIME_STATE">= 0 )                                                                                                                                                                                                                                    


Statistics
----------------------------------------------------------                                                                                                                                                                                                                                                  
         155   recursive calls                                                                                                                                                                                                                                                                                
           0   db block gets                                                                                                                                                                                                                                                                                  
          65   consistent gets                                                                                                                                                                                                                                                                                
           0   physical reads                                                                                                                                                                                                                                                                                 
           0   redo size                                                                                                                                                                                                                                                                                      
         246   bytes sent via SQL*Net to client                                                                                                                                                                                                                                                               
         381   bytes received via SQL*Net from client                                                                                                                                                                                                                                                         
           2   SQL*Net roundtrips to/from client                                                                                                                                                                                                                                                              
           0   sorts (memory)                                                                                                                                                                                                                                                                                 
           0   sorts (disk)                                                                                                                                                                                                                                                                                   
           0   rows processed                                                                                                                                                                                                                                                                                 

SQL> spool off;
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464523
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все понял, оно dml ни в каком виде не переваривает
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464586
rewrite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_NikotinСпасибо, посмотрел, даже такое не проходит:
Код: plaintext
1.
2.
3.
4.
5.
6.
  SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (
     name             => 'test_rewrite',
     source_stmt      => 'SELECT * FROM t where information like :1',
     destination_stmt => 'SELECT * FROM t where contains(information, :1) > 0',
     validate         => FALSE,
     rewrite_mode     => 'TEXT_MATCH');
ORA-30353 expression not supported for query rewrite :(

Потому что:

Using DBMS_ADVANCED_REWRITE When Binds Are Present (Avoiding ORA-30353) [ID 392214.1]
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464588
rewrite,

а там совсем никак, или есть способы обхода?
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464595
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
страждущий реврайтер,

там кое-как. Вот кто-то у Тома обмолвился об содержании этой ноты, а ниже и пример идёт. Вкратце - при создании правила переписывания source_stmt и destination_stmt идут без части WHERE, используется метод GENERAL.
...
Рейтинг: 0 / 0
самодельный rewrite query
    #36464621
rewrite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
страждущий реврайтерrewrite,

а там совсем никак, или есть способы обхода?


Насколько я знаю, есть специальный софт (не от компании Oracle) который работает как супер-лисенер и пропускает через себя все запросы и может находу переписывать их. Стоит денюх :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
самодельный rewrite query
    #39381503
DBAshnik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewrite Насколько я знаю, есть специальный софт (не от компании Oracle) который работает как супер-лисенер и пропускает через себя все запросы и может находу переписывать их. Стоит денюх :)

как называется софт?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / самодельный rewrite query
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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