Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Нужно повысить скорость данного запроса  [new]
vikips
Member

Откуда:
Сообщений: 103
База на 10g. вопрос следующий: какой индекс создать для данного запроса, чтобы повысить скорость или есть другие возможности для повышения скорости его, таблица на 12 млн. записей
стандартный индекс по каждой колонке не дает ничего

select a.* from compound a
where bitand(a.screens1, :SCREENS1 )= :SCREENS1
and bitand(a.screens2, :SCREENS2 )= :SCREENS2
and bitand(a.screens3, :SCREENS3 )= :SCREENS3
and bitand(a.screens4, :SCREENS4 )= :SCREENS4
and bitand(a.screens5, :SCREENS5 )= :SCREENS5


CREATE TABLE COMPOUND
(
COMPOUNDID NUMBER(12),
SCREENS1 NUMBER,
SCREENS2 NUMBER,
SCREENS3 NUMBER,
SCREENS4 NUMBER,
SCREENS5 NUMBER,
STRUCTURE BLOB
)
9 июн 10, 14:06    [8915642]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6700
vikips,

Какую цель вы преследуете использованием bitand для сравнения?
9 июн 10, 14:51    [8916173]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
vikips
База на 10g. вопрос следующий: какой индекс создать для данного запроса, чтобы повысить скорость или есть другие возможности для повышения скорости его, таблица на 12 млн. записей
стандартный индекс по каждой колонке не дает ничего

select a.* from compound a
where bitand(a.screens1, :SCREENS1 )= :SCREENS1
             and bitand(a.screens2,  :SCREENS2 )= :SCREENS2
             and bitand(a.screens3,  :SCREENS3 )= :SCREENS3
             and bitand(a.screens4,  :SCREENS4 )= :SCREENS4
             and bitand(a.screens5,  :SCREENS5 )= :SCREENS5


CREATE TABLE COMPOUND
(
  COMPOUNDID  NUMBER(12),
  SCREENS1    NUMBER,
  SCREENS2    NUMBER,
  SCREENS3    NUMBER,
  SCREENS4    NUMBER,
  SCREENS5    NUMBER,
  STRUCTURE   BLOB
)

При оформлении кода используйте, пожалуйста, тег SRC данного форума.
Этим вы повысите свои шансы на получение ответа.
9 июн 10, 15:04    [8916332]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
vikips
Member

Откуда:
Сообщений: 103
env,

в таблице хранятся бинарные скрины, в котором каждый бит отвечает за какой-то признак, каким образом ищутся объекты имеющие нужный фрагмент
9 июн 10, 15:04    [8916336]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
qwazer
Member

Откуда:
Сообщений: 11
1) на SCREENS1 есть какие-нибудь ограничения
минимальное и максимальное значение? Может ли он измениться со временем?

2)
хорошо бы построить фнукциональный индекс по нескольким столбцам, но в таком виде, как это используется сейчас,
bitand(a.screens5, :SCREENS5 )= :SCREENS5
конечно ничего не получится.

можно сравнивать посимвольно самому (брать остаток от деления на 2, 4, 8 и т.д) , запрос немерено разрастется, но зато можно будет функциональный индекс построить
9 июн 10, 16:15    [8917043]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Что-то типа
Если конечно масок не ограниченное количество. :)
9 июн 10, 16:25    [8917152]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
vikips
Member

Откуда:
Сообщений: 103
qwazer
1) на SCREENS1 есть какие-нибудь ограничения
минимальное и максимальное значение? Может ли он измениться со временем?

2)
хорошо бы построить фнукциональный индекс по нескольким столбцам, но в таком виде, как это используется сейчас,
bitand(a.screens5, :SCREENS5 )= :SCREENS5
конечно ничего не получится.

можно сравнивать посимвольно самому (брать остаток от деления на 2, 4, 8 и т.д) , запрос немерено разрастется, но зато можно будет функциональный индекс построить


записи во времени не изменяются, ограничений особых нет 0..4294967295
9 июн 10, 16:38    [8917336]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Если уж совсем ничего не помогает. А на что-нибудь типа денег не хватает, то используем последнюю соломинку. Врядли конечно сильно поможет:
create or replace function svertka(inVal number)
 return number deterministic is
 n number;
 m number;
 result_val number;
begin
 result_val :=0;
 n:=1;
 if inVal is not null then
  LOOP
   m:=n+n*2+n*4+n*8;
   if (bitand(inVal, m )<>0) then
    result_val := result_val + n;
   end if;
   EXIT WHEN n>inval;
   n:=n*16;
  END LOOP;
  return result_val;
 else
  return null;
 end if; 
end;
/
Добавляем функциональных индексов
И в условие добавляем фразы на их использование:
and svertka(a.screens2)= svertka(:SCREENS2)
может быть повезет.
P.S. Вид функции конечно сделан максимально простым и понятным, для конкретно размазанных данных ее конечно нужно проектировать отдельно.
P.P.S. Если будет фордыбачить оптимизатор, можно попытаться сделать воложенный запрос по индексам а внешний по правильным проверкам.
P.P.P.S Да и индекс лучше сделать один по всем полям и сравнивать его целиком
9 июн 10, 17:09    [8917669]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
bitmap
Guest
Можно попробовать пожертвовать объемом и развернуть 32 бита в 32 столбца и построить на них bitmap индексы.
9 июн 10, 17:53    [8918200]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Сергей Арсеньев
...используем последнюю соломинку. Врядли конечно сильно поможет:
create or replace function svertka(inVal number)
 return number deterministic is
...
Поясните, пожалуйста, идею.
(Математику изучал давно и многое забыл...)
9 июн 10, 18:17    [8918402]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
vikips,

Попытайся пересоздать таблицу вот так, может быть поможет уменьшить нагрузку при FULL TABLE SCAN
CREATE TABLE COMPOUND
(
COMPOUNDID NUMBER(12),
SCREENS1 NUMBER,
SCREENS2 NUMBER,
SCREENS3 NUMBER,
SCREENS4 NUMBER,
SCREENS5 NUMBER,
STRUCTURE BLOB
)
lob(STRUCTURE) store as (disable storage in row)
9 июн 10, 18:34    [8918521]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
SQL*Plus
Поясните, пожалуйста, идею.
(Математику изучал давно и многое забыл...)

Да ошибся я там. Ложная была идея. Торопливость она как известно нужна только в двух случаях.
В принципе если есть высоко релевантные биты (группы), т.е. те которые часто установлены в маске и редко в наборе, то можно сделать функцию на проверку конкертного бита, по ней индекс и включать в условие если в маске утановлен.

Но в общем случае не поможет. Вообще ваш путь ускорение fullscan.
Для этого либо дорогой способ - Exadata либо простое распараллеливание - т.е. несколько каналов ввода-вывода и на каждый свою партицию по ядру процессора и два потока исполнения на канал. Ну может еще кеш результатов можно задействовать (если маски повторяются).
10 июн 10, 07:50    [8920502]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
vikips,

Что вернет данный запрос?
select count(*), sum(cnt)
  from (select SCREENS1, SCREENS2, SCREENS3, SCREENS4, SCREENS5, count(*) as cnt
            from COMPOUND
            group by SCREENS1, SCREENS2, SCREENS3, SCREENS4, SCREENS5
10 июн 10, 09:58    [8920849]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
vikips
Member

Откуда:
Сообщений: 103
Andrey.L
vikips,

Что вернет данный запрос?
select count(*), sum(cnt)
  from (select SCREENS1, SCREENS2, SCREENS3, SCREENS4, SCREENS5, count(*) as cnt
            from COMPOUND
            group by SCREENS1, SCREENS2, SCREENS3, SCREENS4, SCREENS5


COUNT(*) SUM(CNT)
1 474 199 12 574 581
10 июн 10, 10:20    [8921055]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
vikips
База на 10g. вопрос следующий: какой индекс создать для данного запроса, чтобы повысить скорость или есть другие возможности для повышения скорости его, таблица на 12 млн. записей
12 млн. строк - это не так уж много...
Сколько это в мегабайтах? (без учета BLOB)
Как часто выполняются приведенные вами запросы?
10 июн 10, 11:11    [8921597]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
vikips
Member

Откуда:
Сообщений: 103
SQL*Plus
vikips
База на 10g. вопрос следующий: какой индекс создать для данного запроса, чтобы повысить скорость или есть другие возможности для повышения скорости его, таблица на 12 млн. записей
12 млн. строк - это не так уж много...
Сколько это в мегабайтах? (без учета BLOB)
Как часто выполняются приведенные вами запросы?


COMPOUND 16gb, 2gb blob

запросы выполняются не часто до 10 раз в час, он выполняется 3 минуты, а другие запросы можно сказать мгновенно для пользователей, поэтому хотелось эту разницу сократить
10 июн 10, 11:35    [8921918]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Вопрос ребром
Guest
vikips
эту разницу сократить


Ты сисадмин, который не имеет право переписывать запросы или кодер, который не умеет программировать?
10 июн 10, 11:50    [8922132]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
Вопрос ребром
vikips
эту разницу сократить

Ты сисадмин, который не имеет право переписывать запросы или кодер, который не умеет программировать?

Ты так умен, ребристый наш камрад, что можешь предложить решение етой проблемы?
10 июн 10, 18:55    [8926692]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
vikips,

select count(distinct SCREENS1) as cnt1, count(distinct SCREENS2) as cnt2, count(distinct SCREENS3) as cnt3, count(distinct SCREENS4) as cnt4, count(distinct SCREENS5) as cnt5, count(*) as cnt
            from COMPOUND
?
Все ли колонки NOT NULL?
10 июн 10, 19:05    [8926739]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9241
Структура COMPOUND в первом письме показана полностью?

vikips
SQL*Plus
12 млн. строк - это не так уж много...
Сколько это в мегабайтах? (без учета BLOB)


COMPOUND 16gb, 2gb blob


16 - 2 = 14 Gb / 12 M = 1,16 Kb на строчку. Как-то много, для 6 полей типа NUMBER. IMHO
10 июн 10, 19:20    [8926818]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Вопрос ребром
Guest
Изя Кацман
Вопрос ребром
vikips
эту разницу сократить

Ты сисадмин, который не имеет право переписывать запросы или кодер, который не умеет программировать?

Ты так умен, ребристый наш камрад, что можешь предложить решение етой проблемы?


Да, более чем. А ты нет?
10 июн 10, 19:26    [8926835]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
vikips
SQL*Plus
12 млн. строк - это не так уж много...
Сколько это в мегабайтах? (без учета BLOB)
COMPOUND 16gb, 2gb blob

Покажите результат выполнения
SELECT ROUND(SUM(NVL(VSIZE(COMPOUNDID), 0)
               + NVL(VSIZE(SCREENS1), 0)
               + NVL(VSIZE(SCREENS2), 0)
               + NVL(VSIZE(SCREENS3), 0)
               + NVL(VSIZE(SCREENS4), 0)
               + NVL(VSIZE(SCREENS5), 0)) / 1024 / 1024) AS data_size_mb 
FROM COMPOUND;
10 июн 10, 19:35    [8926880]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
Изя Кацман
Member

Откуда: Великий Эксперимент
Сообщений: 2019
Вопрос ребром
Изя Кацман
Ты так умен, ребристый наш камрад, что можешь предложить решение етой проблемы?

Да, более чем. А ты нет?

А почему тебя это беспокоит?
Есть решение - предлагай. Нет - не умничай пустомельно - пустышку видно.
10 июн 10, 19:41    [8926899]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18337
Чтобы перевести разговор в конструктивное русло:
create table ANE_COMPOUND
(
  COMPOUNDID,
  SCREENS1,
  SCREENS2,
  payload
)
as
select level,level,level, cast(' ' as char(300))
from dual connect by level < 100000;
 
Table created

-- DDL индексов и запросы генерируются.
-- Предполагается Enterprise Edition.
create index ane_compound_idx1 on ane_compound(
 bitand(SCREENS1,1),bitand(SCREENS1,2),bitand(SCREENS1,4),bitand(SCREENS1,8),bitand(SCREENS1,16),bitand(SCREENS1,32),bitand(SCREENS1,64),bitand(SCREENS1,128)
,bitand(SCREENS1,256),bitand(SCREENS1,512),bitand(SCREENS1,1024),bitand(SCREENS1,2048),bitand(SCREENS1,4096),bitand(SCREENS1,8192),bitand(SCREENS1,16384),bitand(SCREENS1,32768)
,bitand(SCREENS1,65536),bitand(SCREENS1,131072),bitand(SCREENS1,262144),bitand(SCREENS1,524288),bitand(SCREENS1,1048576),bitand(SCREENS1,2097152),bitand(SCREENS1,4194304),bitand(SCREENS1,8388608)
,bitand(SCREENS1,16777216),bitand(SCREENS1,33554432),bitand(SCREENS1,67108864),bitand(SCREENS1,134217728),bitand(SCREENS1,268435456),bitand(SCREENS1,536870912)
,bitand(SCREENS1,1073741824),bitand(SCREENS1,2147483648)
);
 
Index created
create index ane_compound_idx2 on ane_compound(
 bitand(SCREENS2,1),bitand(SCREENS2,2),bitand(SCREENS2,4),bitand(SCREENS2,8),bitand(SCREENS2,16),bitand(SCREENS2,32),bitand(SCREENS2,64),bitand(SCREENS2,128)
,bitand(SCREENS2,256),bitand(SCREENS2,512),bitand(SCREENS2,1024),bitand(SCREENS2,2048),bitand(SCREENS2,4096),bitand(SCREENS2,8192),bitand(SCREENS2,16384),bitand(SCREENS2,32768)
,bitand(SCREENS2,65536),bitand(SCREENS2,131072),bitand(SCREENS2,262144),bitand(SCREENS2,524288),bitand(SCREENS2,1048576),bitand(SCREENS2,2097152),bitand(SCREENS2,4194304),bitand(SCREENS2,8388608)
,bitand(SCREENS2,16777216),bitand(SCREENS2,33554432),bitand(SCREENS2,67108864),bitand(SCREENS2,134217728),bitand(SCREENS2,268435456),bitand(SCREENS2,536870912)
,bitand(SCREENS2,1073741824),bitand(SCREENS2,2147483648)
);
 
Index created

explain plan for
select /*+ index_combine(a)*/
 a.*
from ane_compound a
where bitand(screens1,1) >= bitand(:scr1,1) and bitand(screens1,2) >= bitand(:scr1,2)
  and bitand(screens1,4) >= bitand(:scr1,4) and bitand(screens1,8) >= bitand(:scr1,8)
  and bitand(screens1,16) >= bitand(:scr1,16) and bitand(screens1,32) >= bitand(:scr1,32)
  and bitand(screens1,64) >= bitand(:scr1,64) and bitand(screens1,128) >= bitand(:scr1,128)
  and bitand(screens1,256) >= bitand(:scr1,256) and bitand(screens1,512) >= bitand(:scr1,512)
  and bitand(screens1,1024) >= bitand(:scr1,1024) and bitand(screens1,2048) >= bitand(:scr1,2048)
  and bitand(screens1,4096) >= bitand(:scr1,4096) and bitand(screens1,8192) >= bitand(:scr1,8192)
  and bitand(screens1,16384) >= bitand(:scr1,16384) and bitand(screens1,32768) >= bitand(:scr1,32768)
  and bitand(screens1,65536) >= bitand(:scr1,65536) and bitand(screens1,131072) >= bitand(:scr1,131072)
  and bitand(screens1,262144) >= bitand(:scr1,262144) and bitand(screens1,524288) >= bitand(:scr1,524288)
  and bitand(screens1,1048576) >= bitand(:scr1,1048576) and bitand(screens1,2097152) >= bitand(:scr1,2097152)
  and bitand(screens1,4194304) >= bitand(:scr1,4194304) and bitand(screens1,8388608) >= bitand(:scr1,8388608)
  and bitand(screens1,16777216) >= bitand(:scr1,16777216) and bitand(screens1,33554432) >= bitand(:scr1,33554432)
  and bitand(screens1,67108864) >= bitand(:scr1,67108864) and bitand(screens1,134217728) >= bitand(:scr1,134217728)
  and bitand(screens1,268435456) >= bitand(:scr1,268435456) and bitand(screens1,536870912) >= bitand(:scr1,536870912)
  and bitand(screens1,1073741824) >= bitand(:scr1,1073741824) and bitand(screens1,2147483648) >= bitand(:scr1,2147483648)
  ------------------
  and bitand(screens2,1) >= bitand(:scr2,1) and bitand(screens2,2) >= bitand(:scr2,2)
  and bitand(screens2,4) >= bitand(:scr2,4) and bitand(screens2,8) >= bitand(:scr2,8)
  and bitand(screens2,16) >= bitand(:scr2,16) and bitand(screens2,32) >= bitand(:scr2,32)
  and bitand(screens2,64) >= bitand(:scr2,64) and bitand(screens2,128) >= bitand(:scr2,128)
  and bitand(screens2,256) >= bitand(:scr2,256) and bitand(screens2,512) >= bitand(:scr2,512)
  and bitand(screens2,1024) >= bitand(:scr2,1024) and bitand(screens2,2048) >= bitand(:scr2,2048)
  and bitand(screens2,4096) >= bitand(:scr2,4096) and bitand(screens2,8192) >= bitand(:scr2,8192)
  and bitand(screens2,16384) >= bitand(:scr2,16384) and bitand(screens2,32768) >= bitand(:scr2,32768)
  and bitand(screens2,65536) >= bitand(:scr2,65536) and bitand(screens2,131072) >= bitand(:scr2,131072)
  and bitand(screens2,262144) >= bitand(:scr2,262144) and bitand(screens2,524288) >= bitand(:scr2,524288)
  and bitand(screens2,1048576) >= bitand(:scr2,1048576) and bitand(screens2,2097152) >= bitand(:scr2,2097152)
  and bitand(screens2,4194304) >= bitand(:scr2,4194304) and bitand(screens2,8388608) >= bitand(:scr2,8388608)
  and bitand(screens2,16777216) >= bitand(:scr2,16777216) and bitand(screens2,33554432) >= bitand(:scr2,33554432)
  and bitand(screens2,67108864) >= bitand(:scr2,67108864) and bitand(screens2,134217728) >= bitand(:scr2,134217728)
  and bitand(screens2,268435456) >= bitand(:scr2,268435456) and bitand(screens2,536870912) >= bitand(:scr2,536870912)
  and bitand(screens2,1073741824) >= bitand(:scr2,1073741824) and bitand(screens2,2147483648) >= bitand(:scr2,2147483648)
;
 
Explained
select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4140348966
--------------------------------------------------------------------------------
| Id  | Operation                        | Name              | Rows  | Bytes | C
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                   |     1 |   316 |
|   1 |  TABLE ACCESS BY INDEX ROWID     | ANE_COMPOUND      |     1 |   316 |
|   2 |   BITMAP CONVERSION TO ROWIDS    |                   |       |       |
|   3 |    BITMAP AND                    |                   |       |       |
|   4 |     BITMAP CONVERSION FROM ROWIDS|                   |       |       |
|   5 |      SORT ORDER BY               |                   |       |       |
|*  6 |       INDEX RANGE SCAN           | ANE_COMPOUND_IDX1 |       |       |
|   7 |     BITMAP CONVERSION FROM ROWIDS|                   |       |       |
|   8 |      SORT ORDER BY               |                   |       |       |
|*  9 |       INDEX RANGE SCAN           | ANE_COMPOUND_IDX2 |       |       |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
   6 - access(BITAND("SCREENS1",1)>=BITAND(TO_NUMBER(:SCR1),1) AND
              BITAND("SCREENS1",2)>=BITAND(TO_NUMBER(:SCR1),2) AND
              BITAND("SCREENS1",4)>=BITAND(TO_NUMBER(:SCR1),4) AND
              BITAND("SCREENS1",8)>=BITAND(TO_NUMBER(:SCR1),8) AND
 ...
              BITAND("SCREENS1",1073741824)>=BITAND(TO_NUMBER(:SCR1),1073741824)
              BITAND("SCREENS1",2147483648)>=BITAND(TO_NUMBER(:SCR1),2147483648)
       filter(BITAND("SCREENS1",2147483648)>=BITAND(TO_NUMBER(:SCR1),2147483648)
              BITAND("SCREENS1",1073741824)>=BITAND(TO_NUMBER(:SCR1),1073741824)
...
              BITAND("SCREENS1",2)>=BITAND(TO_NUMBER(:SCR1),2) AND
              BITAND("SCREENS1",1)>=BITAND(TO_NUMBER(:SCR1),1))
   9 - access(BITAND("SCREENS2",1)>=BITAND(TO_NUMBER(:SCR2),1) AND
              BITAND("SCREENS2",2)>=BITAND(TO_NUMBER(:SCR2),2) AND
...
              BITAND("SCREENS2",1073741824)>=BITAND(TO_NUMBER(:SCR2),1073741824)
              BITAND("SCREENS2",2147483648)>=BITAND(TO_NUMBER(:SCR2),2147483648)
       filter(BITAND("SCREENS2",2147483648)>=BITAND(TO_NUMBER(:SCR2),2147483648)
              BITAND("SCREENS2",1073741824)>=BITAND(TO_NUMBER(:SCR2),1073741824)
...
              BITAND("SCREENS2",2)>=BITAND(TO_NUMBER(:SCR2),2) AND
              BITAND("SCREENS2",1)>=BITAND(TO_NUMBER(:SCR2),1))
10 июн 10, 21:06    [8927271]     Ответить | Цитировать Сообщить модератору
 Re: Нужно повысить скорость данного запроса  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
vikips
База на 10g. вопрос следующий: какой индекс создать для данного запроса, чтобы повысить скорость или есть другие возможности для повышения скорости его, таблица на 12 млн. записей
стандартный индекс по каждой колонке не дает ничего


Я знаю два варианта:
1. один уже назвали - куча bitmap индексов на каждый бит. Если битов много и они неравноценны, можно немного раскидать их по хеш-группам и использовать меньшее количество битовых индексов для предварительной фильтрации.
2. вытянуть таблиицу в таблицу из двух столбцов comp_bits(compound, bit_id), где хранить для каждого компаунда набор его битов и выполнять запросы по вкусу:

(если есть статистика по битам, выбрать несколько самых избирательных для предварительной фильтрации)

select compound
from comp_bits
where bit_id in (:bit_id1, ... ,:bit_idn)
group by compound
having count(*) = n

или
select compound
from comp_bits
where bit_id = :bit_id1
...
intersect 
...
select compound
from comp_bits
where bit_id = :bit_idn

этот подход проигрывает первому подходу с фингерпринтами в случае если биты сами по себе обладают примерно одинаковой избирательностью, а комбинации битов почти всегда не встречаются :)

P.S. химиков здесь не так много :) если интересно есть готовые индексы для молекулярного поиска, или тот же blast для био-данных
11 июн 10, 01:09    [8927987]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить