Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Построение индексов / 8 сообщений из 8, страница 1 из 1
24.11.2004, 14:50
    #32798111
Basch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
таблица:
unique_id автоинкремент
adate - дата
user_id - id абонента
user_data - данные абонента
----------
каждому абоненту (их сотни тысяч) в день поступает в среднем 20 новых user_data. При записи в БД adate вычисляется и равна текущему моменту времени.
Т.е. имеет место много инзертов, скорость выполнения которых в принципе некритична
и есть селекты вида: SELECT ALL * FROM tbl WHERE user_id=xxx AND adate BETWEEN ... AND ...
Вот эти селекты должны работать максимально быстро.

Вопрос в построении индексов.
Сейчас я сделал кластерный составной индекс (adate DESC, user_id).
но мне кажется, что это неэффективно, т.к. основная селективность на user_id, а первое поле в индексе adate. Т.е. для выборки всех user_data за какой-то период времени для user_id=222 требуется просмотреть весь набор записей, принадлежащих к adate between...and... что вроде бы избыточно.? Но при таком подхоже можно задать fillfactor=100, что хорошо.
Есть варианты:
1 - добавить еще некластерный индекс по полю user_id
или 2 - в кластерном, приведенном выше, поменять поля местами, т.е. сделать (user_id, adate DESC). Вот такая структура мне бы очень подошла, но не будет ли тогда со временем таблица превращаться в монстра? Ведь все вставки идут "в середину таблицы" и fillfactor =1 и сколько там времени будет уходить на чтение при миллиарде записей?
...
Рейтинг: 0 / 0
24.11.2004, 15:06
    #32798168
_bob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
вообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-)

Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему
...
Рейтинг: 0 / 0
24.11.2004, 15:17
    #32798212
Basch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
_bobвообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-)

Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему

а как вы прикидываете, что именно 80%? Может есть какая-то логика подбора этого параметра?
и еще: реиндекс - это когда drop index а затем create index?
а зачем это делать? Что именно так лечится?
...
Рейтинг: 0 / 0
24.11.2004, 15:18
    #32798217
Simon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
чтобы услышать ответ на такой вопрос для начала надо хотябы указывать что за база данных

в каждой субд свои методы того как "убыстрить" выборку из таблицы
...
Рейтинг: 0 / 0
24.11.2004, 15:23
    #32798234
Basch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
Simonчтобы услышать ответ на такой вопрос для начала надо хотябы указывать что за база данных

в каждой субд свои методы того как "убыстрить" выборку из таблицы

mssql2000
...
Рейтинг: 0 / 0
24.11.2004, 20:26
    #32798760
StalkerS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
Кластерный индекс, как известно, подразумевает физическое упорядочивание записей в таблице. Следовательно,
в кластерном индексе достаточно указать один столбец.
Я-бы в данном случае сделал кластерный индекс по user_id и некластерный по adate.

В любом случае, смотри план выполения, там написано, какие индексы используются в запросе.

Fillfactor отвечает за заполненность страницы, т.е. при fillfactor=100 % страницы заполняются полностью,
что замедляет вставку новых записей.
Определи, сколько в процентном отношении происходит вставок новых записей в день, вот тебе и будет
нужный fillfactor (т.е. если в таблицу в течении дня будет добавлено 10 % новых записей, то fillfactor
нужен в районе 90 - 85 %)
В конце дня можно провести обновление индекса командой dbcc dbreindex.

И вообще, если число строк огромное (как у тебя), имеет смысл секционирование таблицы, т.е. разбиение
ее на несколько более мелких. Это увеличит производительность
...
Рейтинг: 0 / 0
24.11.2004, 23:13
    #32798803
StalkerS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
небольшое дополнение насчет кластерных индексов. При создании составного кластерного индекса [user_id + adate] значения в adate упорядочаться (по умолчанию по возрастанию) внутри каждой группы значений user_id . Так что при использовании только одного кластерного индекса имеет смысл делать его составным. Однако если делать два индекса, то кластерный не надо делать составным, т.к. это увеличит размер некластерного индекса.
Тебе стоит проверить оба варианта, и посмотреть их планы выполнения запроса
...
Рейтинг: 0 / 0
25.11.2004, 11:02
    #32799184
_bob
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение индексов
Basch _bobвообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-)

Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему

а как вы прикидываете, что именно 80%? Может есть какая-то логика подбора этого параметра?
и еще: реиндекс - это когда drop index а затем create index?
а зачем это делать? Что именно так лечится?

реиндекс - переиндексация, перестройка индексных страниц (в джобе в ночной maintenance plan включишь и забудешь)

как получил 80? :-)
да попробовал, если ставить немного больше (85-90), интенсивная вставка замедляется, если немного меньше - без заметных изменений

ИМХО: то что написано про кластерный по одному полю, по второму некластерный.....сравни планы и выскажи все что по этому поводу думаешь, а то на MSSQL уже индексы секционировать советуют
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Построение индексов / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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