|
|
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
Имеется таблица примерно 1 200 000 записей. Она пополняется данными с периодичностью 10 инсертов за 1 мин. В табле имеется поля Datetime и Integer, которые образуют первичный ключ. Запрос типа "delete from my_table where column_datetime < DateAdd(mm,-3,GetDate())" (т.е. чищу таблицу от старых значений) выполняется весьма долго и иногда даже вешает сервер :( . Существует ли какой иной способ подрезать таблицу? ЗЫ: таблица должно существовать всегда. SQL Server 7.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 10:44:24 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
а поле c datetime является первым полем в индексе-первичном ключе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 10:49:21 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
Судя по тому что "Datetime и Integer, которые образуют первичный ключ" и при этом "where column_datetime < DateAdd(mm,-3,GetDate())" я думаю что первичный ключ при удалении не работает... поэтому и долго, сделайте кластерный индекс по column_datetime, должно убыстрится. Плюс к этому еще такая мысль, оптимизатор наверно один раз вычисляет DateAdd(mm,-3,GetDate()), но вдруг... посчитайте эту дату один раз а потом используйте переменную... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 10:52:08 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
2 fima При таком подходе, когда создаются кластерные индексы по равномерно увеличивающимся полям, возникают потенциальные проблемы со вставкой, т.к. все новые записи будут добавляться в конец таблицы, что объясняется природой кластерного индекса. Отсюда - возможные конфликты при доступе к последней странице данных во время интенсивной вставки. А скорость удаления действительно возрастет. 2 Zenon74 Если нет индекса, в котором поле column_datetime является первым в ключе - радикальной оптимизации не будет вообще. Хотя можно и так попробовать, если первичный ключ имеет такой вид: int_field,column_datetime и поле типа int - IDENTITY: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:10:09 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, мой запрос скорее всего - "те же яйца - вид сбоку". Ну разве что вычисление MAX() требует существенно меньших ресурсов сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:14:45 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
Dankov: да, поле Datetime - первое, сразу за ним - Integer. fima: а серверу плохо не станет, если на одном поле будет висеть и примари кей, и клустерный индекс? как там насчет перестройки индексов при delete/update? Jimmy: Integer не есть IDENTITY, а просто неявный foregn key (но не объявленный) - ссыла на другую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:20:39 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
2Jimmy помимо указанных Вами минусов, я вижу и еще, по умолчанию первичный это кластерный, значит нужно пересобрать первичный на некластерный (кластерный ведь один) а потом сделать кластерным column_datetime. Соответственно после этих перетурбаций операции селекта по первичному станут медленнее... Но текущая проблема, это очень медленное удаление, её и решаем :) 2Zenon74 Может быть имеет смысл удалять не нужные записи не когда их много набирается, а по триггеру вставки? Может это оптимальней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:20:49 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
еще маленькое дополнение - 10 инсертов/минуту идут пачкой , причем дата одинаковая, а вот интегеры - разные. Поэтому примари кей - составной. Далее - раз в сутки работает хранимка, которая делает всякие селекты и проч. над данными, которые лежат не в примари кей :) , при этом активно используется связка, указанная в первичном ключе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:38:59 |
|
||
|
Как сделать много делетов
|
|||
|---|---|---|---|
|
#18+
делим данные на четыре таблицы..... t1, t2,t3,t4.... в этом месяце пишем в t1 в следующем в t2 и тд.... по кольцу..... в конце месяца перед использованием следующей таблицы - truncate.... работает быстро .... на счет вью думаю и так понятно..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2002, 11:59:22 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32051612&tid=1820229]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 328ms |

| 0 / 0 |
