Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / самодельный rewrite query / 10 сообщений из 10, страница 1 из 1
11.02.2010, 19:46
    #36464342
_Nikotin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
Следующая задача, есть таблица по которой происходит поиск вида
Код: 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
11.02.2010, 20:17
    #36464393
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
Посмотри DBMS_ADVANCED_REWRITE.
...
Рейтинг: 0 / 0
11.02.2010, 22:15
    #36464487
_Nikotin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
Спасибо, посмотрел, даже такое не проходит:
Код: 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
11.02.2010, 22:36
    #36464502
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
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
11.02.2010, 23:14
    #36464523
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
все понял, оно dml ни в каком виде не переваривает
...
Рейтинг: 0 / 0
12.02.2010, 00:49
    #36464586
rewrite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
самодельный rewrite query
_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
12.02.2010, 00:51
    #36464588
самодельный rewrite query
rewrite,

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

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

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


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

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


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