Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каким должен быть фукнц-ный индекс? / 15 сообщений из 15, страница 1 из 1
03.09.2008, 13:16
    #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
03.09.2008, 13:19
    #35520171
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каким должен быть фукнц-ный индекс?
Нефункциональным.
...
Рейтинг: 0 / 0
03.09.2008, 13:25
    #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
03.09.2008, 13:28
    #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
03.09.2008, 13:29
    #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
03.09.2008, 13:35
    #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
03.09.2008, 13:41
    #35520225
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каким должен быть фукнц-ный индекс?
dobruможно сказать нет ? :-)Нет. STFF индекс ага или не ага?
...
Рейтинг: 0 / 0
03.09.2008, 13:58
    #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
03.09.2008, 14:00
    #35520280
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каким должен быть фукнц-ный индекс?
dobru TABLE ACCESS FULL DOC Про руки намекнуть?
...
Рейтинг: 0 / 0
03.09.2008, 14:01
    #35520285
dobru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каким должен быть фукнц-ный индекс?
Elic dobru TABLE ACCESS FULL DOC Про руки намекнуть?

намекните причину, ведь я еще не такой умный.....
...
Рейтинг: 0 / 0
03.09.2008, 14:09
    #35520320
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Каким должен быть фукнц-ный индекс?
dobruнамекните причину, ведь я еще не такой умный.....Напиши test-case, а мы исправим, если ты сам по ходу не поймёшь.
+ http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
03.09.2008, 14:11
    #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
03.09.2008, 15:48
    #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
03.09.2008, 16:01
    #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
Период между сообщениями больше года.
01.12.2010, 13:10
    #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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каким должен быть фукнц-ный индекс? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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