Как ускорить действие чужих ключей - PullRequest
1 голос
/ 29 марта 2011

У нас очень нормализованная база данных.Когда я добавляю и удаляю данные с внешними ключами к таблицам с тоннами данных, НАВСЕГДА нужно удалять записи, не говоря уже о блокировках, которые из этого происходят.Что я могу сделать, чтобы внешние ключи все еще использовались, но не влияли на производительность моих массовых вставок и удалений в базу данных.Все внешние ключи индексируются.

В основном внешние ключи значительно замедляют мои сценарии массовых данных.Наши клиенты импортируют сотни тысяч записей в день, и мы также удаляем большие объемы данных каждый день.Внешние ключи обеспечивают целостность данных, но в то же время значительно снижают скорость этих процессов.

Есть ли способ обойти побочные эффекты нормализованной схемы?Как вы справились с этими проблемами?

Я использую SQL Server 2005.

1 Ответ

2 голосов
/ 29 марта 2011

Вы не предоставили достаточно информации о проблемах, которые пытаетесь решить с помощью базы данных.

Мне кажется, что проблема не в внешних ключах, а в том, что они не статичны и / или выкаскадное удаление.

Для вставок может потребоваться нормализация и поэтапная загрузка, чтобы строки первичного ключа загружались перед строками с внешними ключами, которые на них ссылаются, поэтому там немного больше работы.Удаление (для очистки диапазона) иногда может быть улучшено с помощью разделов или запланированных пакетов, с программным удалением во время производства.

Итак, вопрос в том, почему ваши данные так часто меняются?Каков ваш конкретный сценарий использования?И нормализованная модель хороша для этого.Обычно в средах OLTP данные обновляются и обновляются.INSERT не часто делают много блокировок, а DELETE блокирует операции только с теми же объектами данных, которые участвуют в удалении (так что вы хотите, чтобы они блокировались).В среде OLAP, где данные регулярно загружаются и выгружаются для анализа, реляционная модель не всегда так хороша, и поэтому размерная модель может быть более подходящей, поскольку загрузка / выгрузка факта обычно не будет блокироваться между различными периодами времени.

...