Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

правильное индексирование


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо