powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каким должен быть фукнц-ный индекс?
15 сообщений из 15, страница 1 из 1
Каким должен быть фукнц-ный индекс?
    #35520159
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
create table doc(id number primary key, ssum number, user_name varchar2( 20 ));

селект вида (full scan)
Код: plaintext
1.
  select count( 1 ) from doc d 
  where d.user_name = nvl('ttt',d.user_name)
;
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520171
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нефункциональным.
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520188
Фотография Серафимный Шестикрыл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobruселект вида (full scan)
Код: plaintext
1.
  select count( 1 ) from doc d 
  where d.user_name = nvl('ttt',d.user_name)
;

????????

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SQL> select nvl('ttt',null) from dual;

NVL
---
ttt

SQL> select nvl('ttt','aaa') from dual;

NVL
---
ttt
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520200
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicНефункциональным.

можно сказать нет ? :-)

т.к.:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create index doc_indx on doc(user_name);

truncate table plan_table;

explain plan for 
  select count( 1 ) from doc d 
  where d.user_name = nvl(null,d.user_name);

SELECT LPAD(' ', 4 *(LEVEL- 2 ))||
 operation||' '||
 options||' '||
 object_name "EXECUTION_PLAN"
 FROM plan_table
 START WITH id =  0 
 CONNECT BY PRIOR id = parent_id;

drop index doc_indx;

Результат:
EXECUTION_PLAN                                                                  
--------------------------------------------------------------------------------
SELECT STATEMENT                                                                
SORT AGGREGATE                                                                  
    TABLE ACCESS FULL DOC
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520201
Фотография Серафимный Шестикрыл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobru[src oracle]create index doc_indx on doc(user_name);
explain plan for
select count(1) from doc d
==> where d.user_name = nvl(null,d.user_name);


Ты вообще понимаешь, как работает NVL ?
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520213
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Серафимный Шестикрыл dobru[src oracle]create index doc_indx on doc(user_name);
explain plan for
select count(1) from doc d
==> where d.user_name = nvl(null,d.user_name);


Ты вообще понимаешь, как работает NVL ?

вроде да :-)

SQL> create index doc_indx on doc(user_name);

Индекс создан.

SQL>
SQL> truncate table plan_table;

Таблица усечена.

SQL>
SQL> explain plan for
2 select count(1) from doc d
3 where d.user_name = nvl('Petr',d.user_name);

Объяснено.

SQL>
SQL> SELECT LPAD(' ',4*(LEVEL-2))||
2 operation||' '||
3 options||' '||
4 object_name "EXECUTION_PLAN"
5 FROM plan_table
6 START WITH id = 0
7 CONNECT BY PRIOR id = parent_id;

EXECUTION_PLAN
--------------------------------------------------------------------------------
SELECT STATEMENT
SORT AGGREGATE
TABLE ACCESS FULL DOC

SQL>
SQL> drop index doc_indx;

Индекс удален.
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520225
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobruможно сказать нет ? :-)Нет. STFF индекс ага или не ага?
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520275
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic dobruможно сказать нет ? :-)Нет. STFF индекс ага или не ага?

Код: plaintext
SQL> -- Однако\nSQL> create index doc_indx on doc(user_name);\n\nИндекс создан.\n\nSQL> \nSQL> truncate table plan_table;\n\nТаблица усечена.\n\nSQL> \nSQL> explain plan for\n   2     select /*+ index(doc doc_indx) */ * from doc d\n   3     where d.user_name = nvl(\'Petr\',d.user_name);\n\nОбъяснено.\n\nSQL> \nSQL> SELECT LPAD(\' \', 4 *(LEVEL- 2 ))||\n   2    operation||\' \'||\n   3    options||\' \'||\n   4    object_name "EXECUTION_PLAN"\n   5    FROM plan_table\n   6    START WITH id =  0 \n   7    CONNECT BY PRIOR id = parent_id;\n\nEXECUTION_PLAN                                                                  \n--------------------------------------------------------------------------------\nSELECT STATEMENT                                                                \nTABLE ACCESS FULL DOC                                                           \n\nSQL> \nSQL> drop index doc_indx;\n
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520280
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobru TABLE ACCESS FULL DOC Про руки намекнуть?
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520285
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic dobru TABLE ACCESS FULL DOC Про руки намекнуть?

намекните причину, ведь я еще не такой умный.....
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520320
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobruнамекните причину, ведь я еще не такой умный.....Напиши test-case, а мы исправим, если ты сам по ходу не поймёшь.
+ http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520328
dobru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic dobruнамекните причину, ведь я еще не такой умный.....Напиши test-case, а мы исправим, если ты сам по ходу не поймёшь.
+ http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM

я же создаю индекс обычный, затем хинтом его использую в результате если без NVL то index range scan а если с NVL то full scan.

отсюда вопрос каким должен быть индекс чтобы при использовании NVL не было фулскана?
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520675
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobru Elic dobruнамекните причину, ведь я еще не такой умный.....Напиши test-case, а мы исправим, если ты сам по ходу не поймёшь.
+ http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM

я же создаю индекс обычный, затем хинтом его использую в результате если без NVL то index range scan а если с NVL то full scan.

отсюда вопрос каким должен быть индекс чтобы при использовании NVL не было фулскана?

вопрос, а что по вашему значит это

Код: plaintext
d.user_name = nvl('Petr',d.user_name)

Например на данных
Vasya
Petr
Ivan
?

И скажите, какая вам разница, будет ли FTS, или FFS по индексу а-ля nvl(user_name, 'нетузначения')?
...
Рейтинг: 0 / 0
Каким должен быть фукнц-ный индекс?
    #35520720
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dobruотсюда вопрос каким должен быть индексВот же упёртый.
Код: 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.
create table tmp as select rownum as i, rpad(rownum,  20 , rownum) as s from dual connect by level <=  1000 ;
create index tmp$i$s on tmp(s);
exec dbms_stats.gather_table_stats(user, 'TMP', cascade=>true)
explain plan for
  select * from tmp where s = nvl(:s, s);
select * from table(dbms_xplan.display);

-----------------------------------------------------------------------------
| Id  | Operation                     |  Name       | Rows  | Bytes | Cost  |
-----------------------------------------------------------------------------
|    0  | SELECT STATEMENT              |             |   1001  |  24024  |      4  |
|    1  |  CONCATENATION                |             |       |       |       |
|*   2  |   FILTER                      |             |       |       |       |
|*   3  |    TABLE ACCESS FULL          | TMP         |      1  |     24  |      2  |
|*   4  |   FILTER                      |             |       |       |       |
|    5  |    TABLE ACCESS BY INDEX ROWID| TMP         |      1  |     24  |      2  |
|*   6  |     INDEX RANGE SCAN          | TMP$I$S     |      1  |       |      1  |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

    2  - filter(:Z IS NULL)
    3  - filter("TMP"."S" IS NOT NULL)
    4  - filter(:Z IS NOT NULL)
    6  - access("TMP"."S"=:Z)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Каким должен быть фукнц-ный индекс?
    #36988523
under_controlled.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый..!
Решил не заводить новую тему, вырыл "погребенную".

Вопрос: когда в where ставим
Код: plaintext
 where id = nvl(:s,id) 
, все ОК , получаем "NVL or EXPANSION" )),
а как сделать чтобы этот же принцип работал , в случае не бинда, а селекта ?
Как не веретел, результат - FTS, индекс не в цензе :(
если хинтом подсунуть, то IndexFullScan, и еще дороже получается.

оч надо разобраться
(З.Ы. в целевой таблице несколько млн. записей , колонка для фильтра так же - Primary Key. FBI крайне не желателен)


Код: 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.
create table ttt as
   2   select level id,rpad(level, 17 ,level) val from dual
   3   connect by level <= 1000 
   4   /

Таблица создана.

df> alter table ttt add constraint ttt_pk$ primary key (id)
   2   /

Таблица изменена.

df> explain plan for
   2   select id from ttt
   3   where id = nvl (:s,id)
   4   /

Объяснено.

df> select * from table(dbms_xplan.display)
   2   /

Plan hash value:  1472440250 

----------------------------------------------------------------------------------
| Id  | Operation              | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|    0  | SELECT STATEMENT       |         |     17  |    221  |      3    ( 0 )|  00 : 00 : 01  |
|    1  |  CONCATENATION         |         |       |       |            |          |
|*   2  |   FILTER               |         |       |       |            |          |
|*   3  |    INDEX FAST FULL SCAN| TTT_PK$ |     16  |    208  |      2    ( 0 )|  00 : 00 : 01  |
|*   4  |   FILTER               |         |       |       |            |          |
|*   5  |    INDEX UNIQUE SCAN   | TTT_PK$ |      1  |     13  |      1    ( 0 )|  00 : 00 : 01  |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

    2  - filter(:S IS NULL)
    3  - filter("ID" IS NOT NULL)
    4  - filter(:S IS NOT NULL)
    5  - access("ID"=:S)

Note
-----
   - dynamic sampling used for this statement

 24  строк выбрано.

df> explain plan for
   2   select id from ttt
   3   where id = nvl (
   4   (select :s from dual where  1 = 1 )
   5   ,id)
   6   /

Объяснено.

df> select * from table(dbms_xplan.display)
   2   /

Plan hash value:  105446568 

--------------------------------------------------------------------------------
| Id  | Operation            | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|    0  | SELECT STATEMENT     |         |     10  |    130  |      5    ( 0 )|  00 : 00 : 01  |
|*   1  |  INDEX FAST FULL SCAN| TTT_PK$ |     10  |    130  |      3    ( 0 )|  00 : 00 : 01  |
|    2  |   FAST DUAL          |         |      1  |       |      2    ( 0 )|  00 : 00 : 01  |
--------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

    1  - filter("ID"=NVL( (SELECT /*+ */ :S FROM "SYS"."DUAL"
              "DUAL"),"ID"))

Note
-----
   - dynamic sampling used for this statement

 19  строк выбрано.

df> 

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


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