У меня есть база данных в производстве почти 3 года, на Sql 2008 (был '05, до этого). Было хорошо, но не очень эффективно. Поэтому я настраиваю схему и запросы, чтобы ускорить некоторые вещи. Кроме того, оценка основных таблиц содержит около 1-3 строк по одной таблице (для оценки размеров).
Вот пример схемы базы данных (Соз, под NDA, поэтому я не могу отобразить оригинал): -
альтернативный текст http://img11.imageshack.us/img11/4608/dbschemaexample.png
На что следует обратить внимание (которые имеют непосредственное отношение к моей проблеме): -
- Автомобиль может иметь 0 (NULL) или 1 радио. (Левое внешнее соединение)
- Автомобиль может иметь 0 (NULL) или 1 Cupholder (левое внешнее соединение)
- Автомобиль имеет 1 тип шин (внутреннее соединение).
Во-первых, это выглядит как нормализованная схема базы данных . Я сосу и теорию БД, так что я предполагаю, что это 3NF (по крайней мере) ... знаменитые последние слова:)
Теперь, это убивает мою производительность базы данных, потому что эти два внешних соединения и внутреннее соединение вызывают много вызовов И есть также еще несколько соединений во многих операторах.
Чтобы попытаться это исправить, я подумал, что можно попробовать и индексированное представление . Создание вида это кусок пирога. Но его индексация не работает -> не может создавать индексированные представления с объединениями ИЛИ самоссылающимися таблицами (также другая проблема :().
Итак, я плакал часами (и / запястья , окрашенные волосы и написал об этом эмо-песню и поместил ее в myfailspace) и сделал следующее ...
- Добавлена новая строка в каждую «необязательную» таблицу внешних соединений (в этом примере Radios и CupHolders). ID = 0, остальные данные = «Неизвестный бла» или 0.
- Обновите родительские таблицы, чтобы любые нулевые данные теперь имели 0.
- Обновить отношение внешних соединений к внутренним соединениям.
Теперь это работает. Я даже могу сделать свое индексированное представление, которое сейчас очень быстро.
Итак ... мне больно. Это противоречит всему, чему меня учили. Я чувствую себя грязным В одиночестве. Зараженный.
Это плохо делать? Является ли это распространенным сценарием денормализации базы данных для повышения производительности?
Мне бы хотелось подумать об этом, пожалуйста:)
PS. Эти изображения, которые случайный гугл находит - не я.