Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сага об индексном покрытии. Ещё одна. / 15 сообщений из 15, страница 1 из 1
18.12.2013, 17:45:40
    #38505558
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
hi all

Продолжение дебатов, внезапно вспыхнувших тут :dimitrопиши свое видение джойна со справочником и получении из него чёрт-знает-как-поименованного контрагента через покрывающий индекс.Допустим, надо найти все изделия, содержащие в себе слова "фиг" + "знает" +"что" (в любом порядке следования), проданные контрагентам, в названиях которых сорежится "хрен" + "знает" + "кто".
Сразу говорю: это *не* выдуманная задача. Наше ководство не один раз уже вопрошало: "а скока мы резины отпускаем всяким там аффилиантам нашим ?". А эти самые "аффилианты" - их далеко не всегда снабжают соотв. маркером-признаком, так что остается только по названию ловить.

Сейчас делается так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select d.*, h.*, a.agent_name, p.part_name
from doc_data d
    join doc_heads h on d.doc_id = h.doc_id
    join ref_agents a on h.agent_id = a.id
    join ref_parts p on d.table_ref = :const_parts_table_id and d.ref_id = p.id
where 
   a.agent_name like '%хрен%' 
   and a.agent_name like '%знает%' 
   and a.agent_name like '%кто%' 
   and p.part_name like '%фиг%'
   and a.part_name like '%поймёт%' 
   and a.part_name like '%что%' ;



А хотелось бы вот так:
Код: sql
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.
with
agent_smart_filter as(
    select /*+ index_ffs(agents_agent_name) */
        a.id, a.agent_name 
    from ref_agents a
    where
        a.agent_name like '%хрен%' 
        and a.agent_name like '%знает%' 
        and a.agent_name like '%кто%' 
)
,part_smart_filter as(
    select /*+ index_ffs(parts_part_name) */
        p.id, p.part_name
    from ref_parts p
    where
        and p.part_name like '%фиг%'
        and a.part_name like '%поймёт%' 
        and a.part_name like '%что%'
)

select d.*, h.*, a.agent_name
from doc_data d
    join doc_heads h on d.doc_id = h.doc_id
    join agent_smart_filter af  on h.agent_id = af.id
    join part_smart_filter pf on d.table_ref = :const_parts_table_id and d.ref_id = pf.id
;


То есть, чтобы для поиска ИДшников внутри СТЕшек использовались соотв. индексы по полям agent_name, part_name. И чтобы я подсказок ему не делал при этом (это из ораклового царства взято: /* +index_ffs(трататата) */)
...
Рейтинг: 0 / 0
18.12.2013, 17:55:59
    #38505578
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоид,

здесь индексное покрытие возможно только если у тебя индекс сразу по id и agent_name. Ты опять путаешь OIT в оракле и индексное покрытие. Там это специальная таблица
...
Рейтинг: 0 / 0
18.12.2013, 17:57:10
    #38505580
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоидиспользовались соотв. индексы по полям agent_name, part_name
или все-таки по полям {id, agent_name} и {id, part_name}?
...
Рейтинг: 0 / 0
18.12.2013, 18:02:11
    #38505589
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоид,

чего то я не врублюсь, а что оракля способна использовать индекс вот так
a.agent_name like '%хрен%'
...
Рейтинг: 0 / 0
18.12.2013, 18:02:19
    #38505590
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
dimitrТаблоидиспользовались соотв. индексы по полям agent_name, part_name
или все-таки по полям {id, agent_name} и {id, part_name}?тьфу... да, по ним, конечно.

Симонов Денисопять путаешь OIT в оракле и индексное покрытие.ты про IOT (Index Organized Table) ? я знаю про них, но не собирался приплетать их сюда.
...
Рейтинг: 0 / 0
18.12.2013, 18:05:12
    #38505599
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Симонов Денис,

индексным фуллсканом - почему бы и нет? Если покрытие работает, конечно же.
...
Рейтинг: 0 / 0
18.12.2013, 18:06:53
    #38505603
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
dimitr,

а ну в принципе да. Просто индекс будет читаться целиком
...
Рейтинг: 0 / 0
18.12.2013, 18:07:27
    #38505604
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоидdimitrили все-таки по полям {id, agent_name} и {id, part_name}?тьфу... да, по ним, конечно.
т.е. у тебя будет PK по {id} плюс индекс для покрытия по {id, name}? Как-то кривовато...
...
Рейтинг: 0 / 0
18.12.2013, 18:09:59
    #38505612
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Симонов Денисчего то я не врублюсь, а что оракля способна использовать индекс вот так
a.agent_name like '%хрен%'Дык это я для примера там привёл. Проверять надо, чё он там может и чего нет.
...
Рейтинг: 0 / 0
18.12.2013, 18:11:19
    #38505613
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
dimitrТаблоидпропущено...
тьфу... да, по ним, конечно.т.е. у тебя будет PK по {id} плюс индекс для покрытия по {id, name}? Как-то кривовато...А это ещё измерить надо, насколько кривовато! :-)
Если там будет в два раза рост скорости, то пофигу, криво это выглядит или нет.
...
Рейтинг: 0 / 0
18.12.2013, 18:16:22
    #38505623
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоид,

ну у тебя же Оракл установленный есть. Вот и проверь.
...
Рейтинг: 0 / 0
18.12.2013, 18:27:46
    #38505648
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Симонов Денисdimitr,

а ну в принципе да. Просто индекс будет читаться целиком
ну там еще кляуза Fast Full Scan. тоесть индекс будет читаться целиком, но в произвольном порядке, как он лежит на диске, а потом отдельно сортировать результат.
...
Рейтинг: 0 / 0
18.12.2013, 18:31:51
    #38505659
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Симонов Денисну у тебя же Оракл установленный есть. Вот и проверь.
Код: sql
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.
create table aaa(id number, name varchar(50));
insert into aaa select level+1 id, dbms_random.string('u', 50) from dual connect by level<=1000000;
commit;
create index aaa_name on aaa(name);

set timing on
set autot on

select count(*) from aaa where name like '%ABC%' and name like '%QWE%' and name like '%RTY%';

  COUNT(*)
----------
         0

Elapsed: 00:00:00.20

Execution Plan
----------------------------------------------------------
Plan hash value: 3069757864

----------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |     1 |    27 |  1282   (2)| 00:00:06 |
|   1 |  SORT AGGREGATE       |          |     1 |    27 |            |          |
|*  2 |   INDEX FAST FULL SCAN| AAA_NAME |     1 |    27 |  1282   (2)| 00:00:06 |
----------------------------------------------------------------------------------

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

   2 - filter("NAME" IS NOT NULL AND "NAME" IS NOT NULL AND "NAME" IS NOT
              NULL AND "NAME" LIKE '%ABC%' AND "NAME" LIKE '%QWE%' AND "NAME" LIKE
              '%RTY%')

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          5  recursive calls
          1  db block gets
       8932  consistent gets
          0  physical reads
          0  redo size
        345  bytes sent via SQL*Net to client
        360  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
...
Рейтинг: 0 / 0
19.12.2013, 09:38:55
    #38506131
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Таблоид,

этот пример демонстрирует не совсем то. Он конечно использует индексное покрытие, но собственно данные из индекса тут не нужны, раз ты считаешь count.
...
Рейтинг: 0 / 0
19.12.2013, 10:30:19
    #38506197
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сага об индексном покрытии. Ещё одна.
Симонов Денис,

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


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