![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
правильное индексирование
snake1977 © (2004-08-24 08:43:00)Здравствуйте! подскажите пожалуйста ,может быть ссылкой может советом :). Каким образом лучше всего раставлять индексы если к таблицам используются только SQL запросы.
т.е. есть запрос select t.*,r.* from table1 t, table2 r where r.id=t.id and t.name='ВАСЯ' and r.Deti=2
какие индексы болбы правилным, установить на эти две таблицы?
по какому принципцу сделать это оптимально?
Petr V. Abramov (2004-08-24 16:05:00) [1]>> Отдельная песня. В 90% случаев мастер-таблицы меняются оень редко.
> А оставшиеся 10%?
В 90% из оставшихся 10 :) изменение мастер-таблиц можно поставить непосредственно перед commit
>> Тут вроде индексы для выборки.
> Ну добавь в выборку Order by 8-)
Если в выборке 100 записей, а в таблице - миллион - дешевле в памяти отсортировать. Выборки на миллион записей пользователю не нужны.
>>Работа с индексами это слегка искусство, или, уж во всяком случае, очень индивидуальная работа.
(с) Я 8-)
>Надеюсь с этим ты согласен?
Согласен :) Надо очень индивидуально смотреть распределение, кластеризацию и запросы :)
Sergey13 (2004-08-24 15:52:00) [2]2[11] Petr V. Abramov © (24.08.04 15:46)
> А если 100 на миллион? :)
А я прикину заранее в голове, что к чему. 8-)
> Отдельная песня. В 90% случаев мастер-таблицы меняются оень редко.
А оставшиеся 10%?
> Тут вроде индексы для выборки.
Ну добавь в выборку Order by 8-)
А вообще я уже писал
>Работа с индексами это слегка искусство, или, уж во всяком случае, очень индивидуальная работа.
(с) Я 8-)
Надеюсь с этим ты согласен?
Petr V. Abramov (2004-08-24 15:46:00) [3]> Т.е. ты советуешь индексы только на первичные ключи сажать?
Не только
> Ты сам то этими выкладками пользуешься в реале?
Иногда.
>>Даже если там три значения на миллион записей???
>Я на такие поля обычно просто не вешаю ключ например. Т.е. не создаю справочника.
А если 100 на миллион? :)
> А для неблокировки дочерних таблиц по FK?
Отдельная песня. В 90% случаев мастер-таблицы меняются оень редко.
> А как например с индексами для сортировки?
Тут вроде индексы для выборки.
Sergey13 (2004-08-24 15:37:00) [4][9] Petr V. Abramov © (24.08.04 13:56)
> Надеюсь, за сумбурностью идея не потерялась
Потерялась. 8-) Т.е. ты советуешь индексы только на первичные ключи сажать? Ты сам то этими выкладками пользуешься в реале?
>Даже если там три значения на миллион записей???
Я на такие поля обычно просто не вешаю ключ например. Т.е. не создаю справочника.
А как например с индексами для сортировки? А для неблокировки дочерних таблиц по FK?
Petr V. Abramov (2004-08-24 13:56:00) [5]> По всем полям в условии where
> На поля внешних ключей.
Даже если там три значения на миллион записей???
Индекс надо ставить на те поля, у (которых кол-во различных значений)/(общее кол-во значений) близко к 1 (общее кол-во значений) велико. "Близкость" и "великость" можно оценить след образом:
Если значение поля - уникальное (которых кол-во различных значений)/(общее кол-во значений)) = 1), при безындексном доступе потребуется в среднемn/2 чтений, из которых n/2-1 - "бесполезные" (n число записей в таблице)
Если неуникальное и условию удовлетворяет m записей - потребуется n чтений, из которых n-m - "бесполезные" (то есть, если мы выбирам всю таблицу, n-m = 0 и прямой (безындексный) доступ является самым выгодным.
При индексном поиске уникального значения понадобится log(n) + 1 чтение.
При индексном поиске неуникального значения понадобится log(n) + sizeof(тип значения)*m+ m чтений.
Также надо учитывать, что при безындексном доступе блоки читаются последовательно через большой буфер, а при индесном - вразбивку.
Надеюсь, за сумбурностью идея не потерялась
Sergey13 (2004-08-24 12:29:00) [6]2[7] snake1977 (24.08.04 12:26)
План, вроде доступен только в серверных БД. Хотя может я и ошибаюсь, но с другими не работал давно.
snake1977 (2004-08-24 12:26:00) [7]а как посмотреть план?
если я использую парадокс-таблицы
Sergey13 (2004-08-24 12:18:00) [8]Смотреть план выполнения, если таковой имеется.
snake1977 (2004-08-24 11:58:00) [9]а как можно в принципе узнать , какие именно идексы использовались для выполнения запроса?
Sergey13 (2004-08-24 11:08:00) [10]2[3] snake1977 (24.08.04 10:59)
Работа с индексами это слегка искусство, или, уж во всяком случае, очень индивидуальная работа. На одну и ту же таблицу можно сделать несколько "правильных" наборов индексов, которые при смене каких либо условий в момент становятся "неправильными" или неоптимальными или ненужными. Так что пробуй.
snake1977 (2004-08-24 10:59:00) [11]>>Anatoly Podgoretsky
т.е. я так понял
в данном примере два индекса, один на table1, один на table2?
а если в запросе стоит условие
where exists (select p.* from table2 p where p.id=t.id and p.Deti=2)
в этом случае что то меняется??
или остается таким же??
Sergey13 (2004-08-24 09:06:00) [12]На поля внешних ключей.
Anatoly Podgoretsky (2004-08-24 09:03:00) [13]По всем полям в условии where