powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сага об индексном покрытии. Ещё одна.
15 сообщений из 15, страница 1 из 1
Сага об индексном покрытии. Ещё одна.
    #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
Сага об индексном покрытии. Ещё одна.
    #38505578
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

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

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

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

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

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

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

а ну в принципе да. Просто индекс будет читаться целиком
ну там еще кляуза Fast Full Scan. тоесть индекс будет читаться целиком, но в произвольном порядке, как он лежит на диске, а потом отдельно сортировать результат.
...
Рейтинг: 0 / 0
Сага об индексном покрытии. Ещё одна.
    #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
Сага об индексном покрытии. Ещё одна.
    #38506131
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

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

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


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