Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
таблица: 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 и сколько там времени будет уходить на чтение при миллиарде записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 14:50 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
вообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-) Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 15:06 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
_bobвообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-) Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему а как вы прикидываете, что именно 80%? Может есть какая-то логика подбора этого параметра? и еще: реиндекс - это когда drop index а затем create index? а зачем это делать? Что именно так лечится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 15:17 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
чтобы услышать ответ на такой вопрос для начала надо хотябы указывать что за база данных в каждой субд свои методы того как "убыстрить" выборку из таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 15:18 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
Simonчтобы услышать ответ на такой вопрос для начала надо хотябы указывать что за база данных в каждой субд свои методы того как "убыстрить" выборку из таблицы mssql2000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 15:23 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
Кластерный индекс, как известно, подразумевает физическое упорядочивание записей в таблице. Следовательно, в кластерном индексе достаточно указать один столбец. Я-бы в данном случае сделал кластерный индекс по user_id и некластерный по adate. В любом случае, смотри план выполения, там написано, какие индексы используются в запросе. Fillfactor отвечает за заполненность страницы, т.е. при fillfactor=100 % страницы заполняются полностью, что замедляет вставку новых записей. Определи, сколько в процентном отношении происходит вставок новых записей в день, вот тебе и будет нужный fillfactor (т.е. если в таблицу в течении дня будет добавлено 10 % новых записей, то fillfactor нужен в районе 90 - 85 %) В конце дня можно провести обновление индекса командой dbcc dbreindex. И вообще, если число строк огромное (как у тебя), имеет смысл секционирование таблицы, т.е. разбиение ее на несколько более мелких. Это увеличит производительность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 20:26 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
небольшое дополнение насчет кластерных индексов. При создании составного кластерного индекса [user_id + adate] значения в adate упорядочаться (по умолчанию по возрастанию) внутри каждой группы значений user_id . Так что при использовании только одного кластерного индекса имеет смысл делать его составным. Однако если делать два индекса, то кластерный не надо делать составным, т.к. это увеличит размер некластерного индекса. Тебе стоит проверить оба варианта, и посмотреть их планы выполнения запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2004, 23:13 |
|
||
|
Построение индексов
|
|||
|---|---|---|---|
|
#18+
Basch _bobвообще-то индекс строится не для того, чтобы ему можно было ставить 100% заполнение :-) Думаю, кластерный индекс (iser_id, adate desc) для выборки будет оптимальным, fillfactor...здорово зависит от активности вставки в таблицу, но, думаю, 80% с еженочным реиндексом вполне решат Вашу проблему а как вы прикидываете, что именно 80%? Может есть какая-то логика подбора этого параметра? и еще: реиндекс - это когда drop index а затем create index? а зачем это делать? Что именно так лечится? реиндекс - переиндексация, перестройка индексных страниц (в джобе в ночной maintenance plan включишь и забудешь) как получил 80? :-) да попробовал, если ставить немного больше (85-90), интенсивная вставка замедляется, если немного меньше - без заметных изменений ИМХО: то что написано про кластерный по одному полю, по второму некластерный.....сравни планы и выскажи все что по этому поводу думаешь, а то на MSSQL уже индексы секционировать советуют ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2004, 11:02 |
|
||
|
|

start [/forum/topic.php?fid=32&gotonew=1&tid=1546163]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
132ms |
get topic data: |
10ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
3ms |
| others: | 232ms |
| total: | 457ms |

| 0 / 0 |
