Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать много делетов / 9 сообщений из 9, страница 1 из 1
19.09.2002, 10:44:24
    #32051551
Zenon74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
Имеется таблица примерно 1 200 000 записей. Она пополняется данными с периодичностью 10 инсертов за 1 мин. В табле имеется поля Datetime и Integer, которые образуют первичный ключ. Запрос типа "delete from my_table where column_datetime < DateAdd(mm,-3,GetDate())" (т.е. чищу таблицу от старых значений) выполняется весьма долго и иногда даже вешает сервер :( . Существует ли какой иной способ подрезать таблицу?
ЗЫ: таблица должно существовать всегда. SQL Server 7.0
...
Рейтинг: 0 / 0
19.09.2002, 10:49:21
    #32051558
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
а поле c datetime является первым полем в индексе-первичном ключе?
...
Рейтинг: 0 / 0
19.09.2002, 10:52:08
    #32051559
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
Судя по тому что "Datetime и Integer, которые образуют первичный ключ" и при этом "where column_datetime < DateAdd(mm,-3,GetDate())" я думаю что первичный ключ при удалении не работает... поэтому и долго, сделайте кластерный индекс по column_datetime, должно убыстрится. Плюс к этому еще такая мысль, оптимизатор наверно один раз вычисляет DateAdd(mm,-3,GetDate()), но вдруг... посчитайте эту дату один раз а потом используйте переменную...
...
Рейтинг: 0 / 0
19.09.2002, 11:10:09
    #32051572
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
2 fima
При таком подходе, когда создаются кластерные индексы по равномерно увеличивающимся полям, возникают потенциальные проблемы со вставкой, т.к. все новые записи будут добавляться в конец таблицы, что объясняется природой кластерного индекса. Отсюда - возможные конфликты при доступе к последней странице данных во время интенсивной вставки. А скорость удаления действительно возрастет.

2 Zenon74
Если нет индекса, в котором поле column_datetime является первым в ключе - радикальной оптимизации не будет вообще.
Хотя можно и так попробовать, если первичный ключ имеет такой вид: int_field,column_datetime и поле типа int - IDENTITY:
Код: plaintext
1.
2.
delete from my_table 
where int_field < (select max(int_field) from my_table where
column_datetime < DateAdd(mm,- 3 ,GetDate()) ) 
...
Рейтинг: 0 / 0
19.09.2002, 11:14:45
    #32051574
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
Прошу прощения, мой запрос скорее всего - "те же яйца - вид сбоку". Ну разве что вычисление MAX() требует существенно меньших ресурсов сервера.
...
Рейтинг: 0 / 0
19.09.2002, 11:20:39
    #32051580
Zenon74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
Dankov: да, поле Datetime - первое, сразу за ним - Integer.

fima: а серверу плохо не станет, если на одном поле будет висеть и примари кей, и клустерный индекс? как там насчет перестройки индексов при delete/update?

Jimmy: Integer не есть IDENTITY, а просто неявный foregn key (но не объявленный) - ссыла на другую таблицу.
...
Рейтинг: 0 / 0
19.09.2002, 11:20:49
    #32051581
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
2Jimmy помимо указанных Вами минусов, я вижу и еще, по умолчанию первичный это кластерный, значит нужно пересобрать первичный на некластерный (кластерный ведь один) а потом сделать кластерным column_datetime. Соответственно после этих перетурбаций операции селекта по первичному станут медленнее... Но текущая проблема, это очень медленное удаление, её и решаем :)

2Zenon74 Может быть имеет смысл удалять не нужные записи не когда их много набирается, а по триггеру вставки? Может это оптимальней?
...
Рейтинг: 0 / 0
19.09.2002, 11:38:59
    #32051597
Zenon74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
еще маленькое дополнение - 10 инсертов/минуту идут пачкой , причем дата одинаковая, а вот интегеры - разные. Поэтому примари кей - составной. Далее - раз в сутки работает хранимка, которая делает всякие селекты и проч. над данными, которые лежат не в примари кей :) , при этом активно используется связка, указанная в первичном ключе.
...
Рейтинг: 0 / 0
19.09.2002, 11:59:22
    #32051612
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать много делетов
делим данные на четыре таблицы.....
t1, t2,t3,t4.... в этом месяце пишем в t1 в следующем в t2
и тд.... по кольцу..... в конце месяца перед использованием следующей таблицы - truncate....
работает быстро ....
на счет вью думаю и так понятно.....
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать много делетов / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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