powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Построение индексов
8 сообщений из 8, страница 1 из 1
Построение индексов
    #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
Построение индексов
    #32798168
Фотография _bob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-)

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

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

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

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

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

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

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

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

И вообще, если число строк огромное (как у тебя), имеет смысл секционирование таблицы, т.е. разбиение
ее на несколько более мелких. Это увеличит производительность
...
Рейтинг: 0 / 0
Построение индексов
    #32798803
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
небольшое дополнение насчет кластерных индексов. При создании составного кластерного индекса [user_id + adate] значения в adate упорядочаться (по умолчанию по возрастанию) внутри каждой группы значений user_id . Так что при использовании только одного кластерного индекса имеет смысл делать его составным. Однако если делать два индекса, то кластерный не надо делать составным, т.к. это увеличит размер некластерного индекса.
Тебе стоит проверить оба варианта, и посмотреть их планы выполнения запроса
...
Рейтинг: 0 / 0
Построение индексов
    #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]