Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / FBI не помечается как DISABLED после изменения используемой функции / 11 сообщений из 11, страница 1 из 1
10.08.2011, 03:53
    #37388182
Flok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Суть проблемы приведена в теме. Ход действий в листинге:

Код: 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.
Connected to Oracle Database 11g Release  11 . 2 . 0 . 2 . 0  
Connected as IFSAPP
 
SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Release  11 . 2 . 0 . 2 . 0  - 64bit Production
PL/SQL Release  11 . 2 . 0 . 2 . 0  - Production
CORE	 11 . 2 . 0 . 2 . 0 	Production
TNS for  64 -bit Windows: Version  11 . 2 . 0 . 2 . 0  - Production
NLSRTL Version  11 . 2 . 0 . 2 . 0  - Production
 
SQL> 
SQL> CREATE TABLE test_x (
   2   ID NUMBER PRIMARY KEY,
   3   NAME VARCHAR2( 30 ),
   4   TYPE VARCHAR2( 30 )
   5   )
   6   /
 
Table created
 
SQL> 
SQL> INSERT INTO test_x
   2   SELECT ROWNUM, object_name,object_type
   3   FROM user_objects;
 
 19635  rows inserted
 
SQL> commit;
 
Commit complete
 
SQL> 
SQL> CREATE OR REPLACE FUNCTION is_customized(name_ IN VARCHAR2) RETURN NUMBER DETERMINISTIC
   2   IS
   3   BEGIN
   4      IF SUBSTR(name_, 1 , 3 ) = 'CF_' THEN
   5         RETURN  1 ;
   6      ELSE
   7         RETURN  0 ;
   8      END IF;
   9   END is_customized;
  10   /
 
Function created
 
SQL> CREATE INDEX test_x_fbi ON test_x( is_customized(NAME) );
 
Index created
 
SQL> BEGIN dbms_stats.gather_table_stats(ownname => USER, tabname => 'TEST_X', CASCADE => TRUE); END;
   2   /
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> SELECT status, funcidx_status FROM user_indexes ui
   2   WHERE ui.INDEX_NAME = 'TEST_X_FBI';
 
STATUS   FUNCIDX_STATUS
-------- --------------
VALID    ENABLED
 
SQL> 
SQL> CREATE OR REPLACE FUNCTION is_customized(name_ IN VARCHAR2) RETURN NUMBER DETERMINISTIC
   2   IS
   3   BEGIN
   4      IF SUBSTR(name_, 1 , 3 ) = 'CF_' THEN
   5         RETURN  1 ;
   6      ELSE
   7         RETURN - 1 ;
   8      END IF;
   9   END is_customized;
  10   /
 
Function created
 
SQL> 
SQL> SELECT status, funcidx_status FROM user_indexes ui
   2   WHERE ui.INDEX_NAME = 'TEST_X_FBI';
 
STATUS   FUNCIDX_STATUS
-------- --------------
VALID    ENABLED
 
SQL> explain plan for
   2   
   2   SELECT COUNT(*) FROM test_x
   3   WHERE is_customized(NAME) =  0  AND TYPE != 'PACKAGE BODY';
 
Explained
 
 
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value:  213106679 
--------------------------------------------------------------------------------
| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------------
|    0  | SELECT STATEMENT             |            |      1  |     10  |     15    ( 0 )|
|    1  |  SORT AGGREGATE              |            |      1  |     10  |            |
|*   2  |   TABLE ACCESS BY INDEX ROWID| TEST_X     |  17999  |   175K|     15    ( 0 )|
|*   3  |    INDEX RANGE SCAN          | TEST_X_FBI |  19635  |       |      4    ( 0 )|
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
    2  - filter("TYPE"<>'PACKAGE BODY')
    3  - access("IFSAPP"."IS_CUSTOMIZED"("NAME")= 0 )
 
 16  rows selected
 
SQL> 
Та же проблема и на 10g
На 9i работает так как и ожидалось (FUNCIDX_STATUS меняется на DISABLED и запрос с FBI-индексом, естественно падает по ошибке)
...
Рейтинг: 0 / 0
10.08.2011, 04:46
    #37388185
Dimka9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
PL/SQL Language Reference
11g Release 2 (11.2)CREATE FUNCTION Statement
...
DETERMINISTIC

Indicates that the function returns the same result value whenever it is called with the same values for its parameters.

You must specify this keyword if you intend to invoke the function in the expression of a function-based index or from the query of a materialized view that is marked REFRESH FAST or ENABLE QUERY REWRITE. When the database encounters a deterministic function in one of these contexts, it attempts to use previously calculated results when possible rather than reexecuting the function. If you subsequently change the semantics of the function, then you must manually rebuild all dependent function-based indexes and materialized views.

авторНа 9i работает так как и ожидалось
и вроде даже на форуме было что детерменистик работает как надо только с 10.2, хотя мож и не на этом форуме :)
...
Рейтинг: 0 / 0
10.08.2011, 09:11
    #37388298
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Dimka9PL/SQL Language Reference
11g Release 2 (11.2)CREATE FUNCTION Statement
...
DETERMINISTIC

Indicates that the function returns the same result value whenever it is called with the same values for its parameters.

You must specify this keyword if you intend to invoke the function in the expression of a function-based index or from the query of a materialized view that is marked REFRESH FAST or ENABLE QUERY REWRITE. When the database encounters a deterministic function in one of these contexts, it attempts to use previously calculated results when possible rather than reexecuting the function. If you subsequently change the semantics of the function, then you must manually rebuild all dependent function-based indexes and materialized views.

авторНа 9i работает так как и ожидалось
и вроде даже на форуме было что детерменистик работает как надо только с 10.2, хотя мож и не на этом форуме :)
тут скорее вопрос не о детерменистик, а почему идекс остается enabled?
имхо, ето неправильно

.....
stax
...
Рейтинг: 0 / 0
10.08.2011, 09:23
    #37388313
Dimka9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
stax..имхо, ето неправильно

Прокатит за ответ? И это кстати не единственное упоминание такого поведения на данном форуме.
...
Рейтинг: 0 / 0
10.08.2011, 10:11
    #37388410
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Dimka9stax..имхо, ето неправильно

Прокатит за ответ? И это кстати не единственное упоминание такого поведения на данном форуме.
імхо
НЕТ!

я не говорю чтоб индекс перестраивался, он ДОЛЖЕН стать инвалид
согласен на you must manually rebuild

оставив втихаря индекс валидным, у нас молча "упоплывут" данные с is_customized(NAME) = 0

давайте тогда и зависимые пакеты будем оставлять в валид при изменениии dependent функции

кстати если ф-ция не детерменистик (наш случай) update слетит
тоесть проверяется и старое (взятое из индекса) значение с ф-цией

попробуйте
SQL> update TEST_X set name='x'||name where is_customized(NAME) = 0;
update TEST_X set name='x'||name where is_customized(NAME) = 0
*
ERROR at line 1:
ORA-08102: index key not found, obj# 137933, file 4, block 3266491 (2)

и ето ПРАВИЛЬНО!

select * from TEST_X where is_customized(NAME) = 0
не слетает и ето НЕПРАВИЛЬНО!

.....
stax
...
Рейтинг: 0 / 0
10.08.2011, 10:28
    #37388449
Dimka9
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
stax..я не говорю чтоб индекс перестраивался, он ДОЛЖЕН стать инвалид
согласен на you must manually rebuild

автор удивлялся поведению, я показал что это документировано.

почему так сделано? - как один из вариантов объяснения была ссылка. Объяснение не прокатывает - можете открыть SR.

Лично у меня есть куча претензий, вдобавок не[до]документированных, которые более существенны чем эта и ничего, живем :)
...
Рейтинг: 0 / 0
10.08.2011, 10:35
    #37388467
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Dimka9stax..я не говорю чтоб индекс перестраивался, он ДОЛЖЕН стать инвалид
согласен на you must manually rebuild

автор удивлялся поведению, я показал что это документировано.

почему так сделано? - как один из вариантов объяснения была ссылка. Объяснение не прокатывает - можете открыть SR.

Лично у меня есть куча претензий, вдобавок не[до]документированных, которые более существенны чем эта и ничего, живем :)
я так и не понял, где задокументировано что индекс останется валидным?

имхо ето баг

в древних версиях при создании FBI обекты зависящие от таблицы становились в инвалид, мож убирая ету "фичу" зацепили индекс

ps
аглиский со словарем

.....
stax
...
Рейтинг: 0 / 0
10.08.2011, 12:04
    #37388748
Flok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Dimka9,

спасибо! надо внимательнее смотреть документацию. У меня этот баг еще на 10ке проявился, вот я и полез в доку по 10g и вот что откопал:

автор Dependencies of Function-Based Indexes

Function-based indexes depend on the function used in the expression that defines the index. If the function is a PL/SQL function or package function, the index is disabled by any changes to the function specification.

To create a function-based index, the user must be granted CREATE INDEX or CREATE ANY INDEX.

To use a function-based index:

The table must be analyzed after the index is created.

The query must be guaranteed not to need any NULL values from the indexed expression, because NULL values are not stored in indexes.

The following sections describe additional requirements.

DETERMINISTIC Functions
Any user-written function used in a function-based index must have been declared with the DETERMINISTIC keyword to indicate that the function will always return the same output return value for any given set of input argument values, now and in the future.

Вот это-то меня и ставило в ступор. После вашего совета, покопался в доке 11gRelease2 и обнаружил следующее - раздел Dependencies of Function-Based Indexes был благополучно удален, но появился новый Disadvantages of Function-Based Indexes , в котором как раз и говорится о том, что:

авторIf you change the semantics of a DETERMINISTIC function and recompile it, then you must manually rebuild any dependent function-based indexes and materialized views. Otherwise, they report results for the prior version of the function.
...
Рейтинг: 0 / 0
10.08.2011, 12:13
    #37388770
Flok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
и получается что, начиная с 10ки при вместе с созданием FBI создавать еще ddl-триггер на create
...
Рейтинг: 0 / 0
10.08.2011, 12:20
    #37388793
indx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
Да дураку понятно, что он должен быть вручную перестроен.
Вопрос в другом, в том, что он обязательно должен стать unusable после изменения функции.
...
Рейтинг: 0 / 0
10.08.2011, 12:50
    #37388881
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI не помечается как DISABLED после изменения используемой функции
indxДа дураку понятно, что он должен быть вручную перестроен.
Вопрос в другом, в том, что он обязательно должен стать unusable после изменения функции.
дык, и я о том же

но видать новая фича

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


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