Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Индексация поля   Найти похожие ветки 

 
Жук ©   (2005-07-05 13:34) [0]

Имеет ли смысл в большой(по количеству записей)таблице делать индекс по полю, которое может принимать всего 6 значений? Есть ряд запросов, где в условиях встречается это поля. В итоге я в плане получаю БОЛЬШАЯТАБЛИЦА NATURAL.


 
Anatoly Podgoretsky ©   (2005-07-05 13:38) [1]

Жук ©   (05.07.05 13:34)  
Теория говорит НЕТ, неэффективно, и вероятнее всего план не будет использовать этот индекс.


 
dolmat   (2005-07-05 13:40) [2]

Если оно фигурирует в операции выборки т.е. после where, group и т.п., то желательно это увеличит скорость выполнения запроса, а если только select, то нет необходимости.


 
Игорь Шевченко ©   (2005-07-05 14:00) [3]

Теория говорит, что в ряде случаев имеет смысл сделать bitmapped-индексы.


 
jack128 ©   (2005-07-05 14:41) [4]

Жук ©   (05.07.05 13:34)
Есть ряд запросов, где в условиях встречается это поля

встречается ТОЛЬКО  это поле ? то есть в результате этого запроса у нас выползет 1/6 БОЛЬШОЙ ТАБЛИЦЫ ? а зачем юзеру так нужны эти 100000 записей ???

Если же это не единственное условие, то просто перестрой запрос так, чтобы сначала обрабатывался наиболее жесткий индексированный критерий , коли оптимизатор не смог этого сделать за тебя..


 
Danilka ©   (2005-07-05 14:45) [5]

jack128 ©   (05.07.05 14:41)
Если же это не единственное условие, то просто перестрой запрос так


или использовать составные индексы по двум и более полям


 
Johnmen ©   (2005-07-05 14:51) [6]

>Жук ©   (05.07.05 13:34)  
>В итоге я в плане получаю БОЛЬШАЯТАБЛИЦА NATURAL.

Код давай.


 
Жук ©   (2005-07-05 16:03) [7]

select v.smena, sum(t.metrag)
from virabbr v, vir_bra b, vir_bra_tel t
where v.id=b.id_vir and b.id=t.id_vir_bra and
v.ondate between ?ondate1 and ?ondate2
and t.id_sort_enum=?sort
group by v.smena

Выбираем по сменам метражи определённого сорта за какой-то период. Сортов - 6 штук. t = БОЛЬШАЯТАБЛИЦА


 
alex_***   (2005-07-05 16:07) [8]

еще можно заморочиться по поводу кластеризованных/некластеризованных индексов...


 
Johnmen ©   (2005-07-05 16:23) [9]


> alex_***   (05.07.05 16:07) [8]
> еще можно заморочиться по поводу кластеризованных/некластеризованных
> индексов...


Не можно. И не нужно.

>Жук ©   (05.07.05 16:03) [7]

Почему не весь код ?
Приводи индексы, план запроса, др. на своё усмотрение...


 
Жук ©   (2005-07-05 16:52) [10]

Таблицы связаны по внешним ключам, по VIRABBR.ondate - индекс.

Plan:
PLAN SORT (JOIN (T NATURAL,B INDEX (RDB$PRIMARY40),V INDEX (RDB$PRIMARY39,VIRABBR_IDX1)))

Adapted plan:
PLAN SORT (JOIN (T NATURAL,B INDEX (PK_VIR_BRA),V INDEX (PK_VIRABBR,VIRABBR_IDX1)))


 
Johnmen ©   (2005-07-05 17:05) [11]

>Жук ©   (05.07.05 16:52) [10]

Связи, связи... Как связаны то ?
Почему тянуть из тебя надо ?


 
Жук ©   (2005-07-05 18:05) [12]

2 Johnmen ©
Блин, Евгений ! Я уж и не рад, что спросил :-)

3 таблицы связаны внешними ключами так, как прописано во where, соответственно и индексы есть по этим полям (примари кей и форейн кей) тут всё ясно. Далее: отбор идёт за период, в этой таблице VIRABBR - индекс по дате есть.
Но самая нижняя таблица vir_bra_tel грозит очень разрастись, а запросы, типа того, что я привёл, будут использоваться в отчётах.
Пока база пустая, не могу понять нужно мне рисовать индекс по полю сортности (6 штук) или не надо.
Можно, конечно сразу отсечь ненужную часть верхней таблицы по дате, а потом джойнами увязать, но и тогда всё будет зависеть от периода. Ведь, если он будет достаточно большим, то vir_bra_tel NATURAL всё равно будет напрягать.


 
Desdechado ©   (2005-07-05 18:31) [13]

[3]
битовые индексы в IB/FB, увы, пока недоступны
а так, самое для них место


 
Anatoly Podgoretsky ©   (2005-07-05 19:02) [14]

Жук ©   (05.07.05 18:05) [12]
В следующий раз будешь приходить подготовленым. Что то эта фраза мне напоминает. :-)


 
Johnmen ©   (2005-07-05 21:02) [15]

>Жук ©  (05.07.05 18:05) [12]

Поздно нерадоваться, ты уже попался :)

Итак.
Экспериментируй. Во-первых, порядок лог.выражений в where, потом - индекс на то самое поле, потом - явные JOIN"ы, потом - порядок джоинов...
Потом будем думать :)


 
Petr V. Abramov ©   (2005-07-05 22:11) [16]

> Игорь Шевченко ©   (05.07.05 14:00) [3]
> Теория говорит, что в ряде случаев имеет смысл сделать bitmapped-индексы.
 В "IB6.x"???

> Жук ©   (05.07.05 13:34)  
> В итоге я в плане получаю БОЛЬШАЯТАБЛИЦА NATURAL.
 Не совсем дурной оптимизатор...


 
ЮЮ ©   (2005-07-06 03:40) [17]

И все-таки, почему бы не писать явно, что хочешь получить:

select
 v.smena, sum(t.metrag)
from
 virabbr v
 JOIN vir_bra b ON v.id=b.id_vir
 JOIN vir_bra_tel t ON b.id=t.id_vir_bra
where
 (v.ondate between ?ondate1 and ?ondate2) and
 (t.id_sort_enum=?sort)
group by v.smena

Вместо того, чтобы оптимизатор приводил к виду

select
 v.smena, sum(t.metrag)
from
 vir_bra_tel t
 JOIN ON b.id=t.id_vir_bra
 JOIN virabbr v ON v.id=b.id_vir
where
 (t.id_sort_enum=?sort) and
 (v.ondate between ?ondate1 and ?ondate2)

Кстати, может быть запрос получается такой из-за того, что Пока база пустая?


 
Игорь Шевченко ©   (2005-07-06 11:36) [18]

Petr V. Abramov ©   (05.07.05 22:11) [16]

Теория ведь не только к IB относится, верно ? Хотя, признаюсь честно, упоминание об IB я не разглядел сразу.


 
Petr V. Abramov ©   (2005-07-06 13:17) [19]

> Теория ведь не только к IB относится, верно ?
 Почти :)
 Bitmap-индекс имеет смысл, если есть несколько полей, каждое из которых принимает малое количество различных значений.


 
Игорь Шевченко ©   (2005-07-06 13:23) [20]


> Bitmap-индекс имеет смысл, если есть несколько полей, каждое
> из которых принимает малое количество различных значений.


То есть, по одному полю делать битмап-индекс смысла нет ? :)
А пачему ?


 
Petr V. Abramov ©   (2005-07-06 13:38) [21]

> Игорь Шевченко ©   (06.07.05 13:23) [20]
> А пачему ?
 Ну как тебе сказать... :)
 Суть битмапа в том, что одно поле принимает мало разных значений, а комбинаций значений в нескольких полях уже имеющее смысл количество


 
Игорь Шевченко ©   (2005-07-06 13:52) [22]

Petr V. Abramov ©   (06.07.05 13:38) [21]


> Суть битмапа в том, что одно поле принимает мало разных
> значений, а комбинаций значений в нескольких полях уже имеющее
> смысл количество


А я-то дурак думал, что можно несколько значений одного поля указывать, и СУБД будет выполнять конъюнкцию или дизъюнкцию точно так же, как и в случае нескольких полей...


 
Petr V. Abramov ©   (2005-07-06 14:03) [23]

> Игорь Шевченко ©   (06.07.05 13:52) [22]
 Ну может, дурак я :). Тем более что давно этим не занимался.
 Но давай подойдем к этому так: ты в чудеса веришь? Если различных значений мало, какие ты конъюнкции с дизъюнкциями ни делай, это будет выгодней full table scan?

> и СУБД будет выполнять конъюнкцию или дизъюнкцию точно так же,
> как и в случае нескольких полей...
 чего с чем конъюнкцию или дизъюнкцию?


 
Игорь Шевченко ©   (2005-07-06 14:13) [24]


>  чего с чем конъюнкцию или дизъюнкцию?


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


 
Petr V. Abramov ©   (2005-07-06 14:24) [25]

> Игорь Шевченко ©   (06.07.05 14:13) [24]
> каждый бит в которой соответствует номеру записи для данного значения ключа.
 Как бит может соответствовать номеру??? Таблицу из двух записей не рассматириваем :)


 
Petr V. Abramov ©   (2005-07-06 14:36) [26]

Заставил-таки документацию посмотреть :)
 Но смысл битового индекса по одному полю-то все равно - где? Только в одном случае - если значения распределены очень неравномерно, иначе fts опять будет выгоднее, т.к. чудес не бывает. А в этом случае и битмап городить необязательно.
 А когда запрос идет по нескольким полям с малым количеством разных значений, вот тут и начинаются битовые операции.


 
Игорь Шевченко ©   (2005-07-06 14:54) [27]

Petr V. Abramov ©   (06.07.05 14:36) [26]


>  А когда запрос идет по нескольким полям с малым количеством
> разных значений


Да без разницы, что несколько полей с низкой селективностью, что одно поле. Про преимущество индекса по одному полю с низкой селективностью я уже писал - в запросах выборки количества записей с одним значением, или в выборке множества записей, удовлетворяющих критерию "одно значение" или "другое значение"


 
Petr V. Abramov ©   (2005-07-06 14:55) [28]

Хотя может иметь смысл при ситуации типа 1000 значений на 50 миллионов записей.


 
Petr V. Abramov ©   (2005-07-06 14:58) [29]

> Игорь Шевченко ©   (06.07.05 14:54) [27]
> в запросах выборки количества записей с одним значением
 тогда да

> или в выборке множества записей, удовлетворяющих
> критерию "одно значение" или "другое значение"
 А в этом случае смысл какой??? кроме ситуации [28]


 
Игорь Шевченко ©   (2005-07-06 15:18) [30]

Petr V. Abramov ©   (06.07.05 14:58) [29]


>  А в этом случае смысл какой???


Вот у тебя есть таблица с миллионом записей. В таблице поля "имя", "должность", "зарплата".

Должность распределена более или менее равномерна, допустим 8 значений. По этому полю сделан битовый индекс. Тебе надо найти среднюю зарплату для сотрудников, у которых должность "должность один" или "должность два". В этом случае индекс тебе выберет все нужные записи всяко быстрее, чем полный просмотр.


 
Petr V. Abramov ©   (2005-07-06 15:25) [31]

> Игорь Шевченко ©   (06.07.05 15:18) [30]
> В этом случае индекс тебе выберет все нужные записи всяко
> быстрее, чем полный просмотр.
 Или медленнее :) Манипуляции с индексом + выборка сравнимы с последовательным чтением 3/4 таблицы, да еще в обход кэша.


 
Игорь Шевченко ©   (2005-07-06 15:29) [32]

Petr V. Abramov ©   (06.07.05 15:25) [31]


> Манипуляции с индексом + выборка сравнимы с последовательным
> чтением 3/4 таблицы, да еще в обход кэша


Во всех случаях ? :) В данном вопросе индекс выберет четверть содержимого таблицы.


 
Petr V. Abramov ©   (2005-07-06 16:39) [33]

По результатам эксперимента на выборке одной пятой с кривым расперделением по даже локальному партиционированному битмапу разницы просто нет: +- 2%
 Соотношение 6зн/4млн записей, партиционированная таблица (ессно, по другому полю).


 
Игорь Шевченко ©   (2005-07-06 16:56) [34]

Petr V. Abramov ©   (06.07.05 16:39) [33]

"Как физик доказывает, что все нечетные числа простые? Возьмем любое нечетное число. Единицу можно считать простым числом, 3, 5, 7 – простые. Досадно, что 9 – не простое число. Однако 11 и 13 – снова простые. Вернемся к числу 9, говорит физик. Я заключаю, что оно является ошибкой эксперимента."

А эта...Том Кайт кстати весьма подробно пишет, для чего и как нужны эти индексы...


 
Petr V. Abramov ©   (2005-07-06 17:04) [35]

Может, он немного не про то пишет, что ты пытаешься доказать? :)
 "Оно, конечно, Александр Македонский герой, но зачем же стулья ломать?" :)
 Хорошо, давай какую-нить базу и init-файл от нее, я тебе сделаю хоть битмап быстрее, хоть fts, во столько раз, сколько бутылок пива  поставишь :)


 
Игорь Шевченко ©   (2005-07-06 17:07) [36]

Petr V. Abramov ©   (06.07.05 17:04) [35]


> Может, он немного не про то пишет, что ты пытаешься доказать


Я пытаюсь доказать, что битмап-индекс может быть полезен даже по одному полю. Ты с этим споришь ?


 
Petr V. Abramov ©   (2005-07-06 17:22) [37]

> Игорь Шевченко ©   (06.07.05 17:07) [36]
> Я пытаюсь доказать, что битмап-индекс может быть полезен даже
> по одному полю. Ты с этим споришь ?

- Является ли ваучер ценной бумагой?
- В жизни каждого человека хоть раз возникает такой момент, когда любая бумага является ценной!



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.031 c
14-1121863306
Ega23
2005-07-20 16:41
2005.08.14
Выходя из дома, выдёргивай сетевой кабель из компа!


14-1121840436
BiN
2005-07-20 10:20
2005.08.14
За державу обидно


14-1121844334
msguns
2005-07-20 11:25
2005.08.14
Барабашка ?


14-1121673736
Vlad Oshin
2005-07-18 12:02
2005.08.14
Ув. жители Пензы! Как лучше добраться


1-1122426473
Vasian
2005-07-27 05:07
2005.08.14
Проблема с работой с канвой объекта TPrinter