Как удаление строк из таблицы влияет на ее индексы?

Лучше ли для индексации в долгосрочной перспективе удалять или «деактивировать» строки или при каких обстоятельствах?

Я заметил накладные расходы, возникающие после удаления значительного количества строк из таблицы. Почему это происходит и что можно сделать 1) чтобы предотвратить это и 2) исправить?


person reformed    schedule 22.10.2013    source источник
comment
на самом деле это не вопрос SQL, и он вполне может зависеть от БД. Возможно ли, что это просто временное замедление при перестроении индекса?   -  person Brad Allred    schedule 22.10.2013
comment
Я не думаю, что здесь уместно использовать термин «накладные расходы».   -  person jchevali    schedule 14.12.2018


Ответы (2)


Если большие объемы/старая или заархивированная история будут удалены – удалите их сразу.

В ближайшем будущем для ручного удаления на уровне пользователя обычно предпочтительнее «обратимое удаление». Ручное удаление, вероятно, будет составлять не более 10% записей, поэтому эффективность индекса останется высокой.

«Мягкое удаление» также имеет важные преимущества, заключающиеся в том, что администратор может отменить ошибочное удаление, а ссылочная целостность и указанные детали транзакции будут сохранены!

Для долгосрочного архивирования/удаления вы хотите удалить эти записи из индекса — и, помимо проприетарной и специфичной для базы данных «условной индексации», которую я стараюсь избегать, удаление их из таблицы — единственный способ удалить их из индекса.

person Thomas W    schedule 22.10.2013

Для SQL-сервера...

Я думаю, важно знать, что если вы удаляете все записи для очень большой таблицы (имеется в виду множество записей), вам нужно сначала усечь, а затем удалить индексы. Это намного эффективнее.

Если вы хотите удалить подмножество записей и к вам применены индексы, используйте синтаксис DELETE FROM {table} WHERE {condition}. Если вы это сделаете, вы должны сначала удалить из зависимых таблиц в порядке иерархии зависимостей. По сути, это полная противоположность тому, как вы вставляете записи, начиная с независимых таблиц.

УДАЛИТЬ записи с иерархией зависимостей таблиц:

Зависимая/дочерняя таблица (зависит от таблицы зависимостей):

DELETE FROM [table_dependent]; -- "dependent" is a relative term since this may be part of a hierarchy; a FK in this table points to the PK of the [table_independent] table; in a physical database model, this table is sometimes referred to as the child table

Зависимость/Родительская таблица:

DELETE FROM [table_independent];  -- "independent" is a relative term since this may be part of a hierarchy; the PK of this table has a FK in a [table_dependent] table; in a physical database model, this is sometimes referred to as the parent table.

Примечание:

При наличии иерархии записи из «самой глубокой» зависимой таблицы должны быть удалены в первую очередь. Это означает, что индексы для этой таблицы также должны быть удалены в первую очередь. Затем вы должны работать вверх по иерархии, пока не дойдете до родительской таблицы.

ВСТАВЬТЕ записи с иерархией зависимостей таблиц:

SET IDENTITY_INSERT [table_independent] ON

INSERT INTO [table_independent]
(
[column that is not identity column],
[column that is not identity column],
[column that is not identity column]
)
VALUES
(
'1',
'2',
'3'
);

SET IDENTITY_INSERT [table_independent] OFF

SET IDENTITY_INSERT [table_dependent] ON

INSERT INTO [table_dependent]
(
[column that is not identity column],
[column that is not identity column],
[table_independent fk column]
)
VALUES
(
'1',
'2',
'3'
);

SET IDENTITY_INSERT [table_dependent] OFF
person MacGyver    schedule 28.09.2015