Оговорюсь сразу, что я не DBA. И я даже не напишу триггер без мануала. Однако мне посчастливилось приобрести неплохой опыт в разработке и оптимизации баз данных. Этим опытом я и хочу поделиться.
Я хочу привести простой список, который, я надеюсь, поможет вам выявить узкие места в работе с СУБД на ваших проектах. Все это мои личные наработки, поэтому на какую либо полноту, упорядоченность, уникальность и безоговорочность они претендовать не могут. Итак, начнем.
Структура БД
- Созданы ли домены для всех необходимых столбцов?
- Созданы ли все необходимые fk(foreign key)?
- Созданы ли индексы для fk указывающие на таблицы с большим объемом данных(в некоторых СУБД индексы создаются вместе с fk)?
- Правильный ли порядок полей в составных индексах?
- Есть ли таблицы где размер id(pk) поля(домена) занимает более 30% от объема строки(кортежа) и есть вторичный pk(primary key)?
- Можно ли заменить триггеры на fk?
Работа с СУБД
- Используете ли вы Connection pool?
- Используете ли вы серверные курсоры?
- Используете ли вы read-only транзакции и курсоры где возможно? Однонаправленные курсоры?
- Используете ли вы параметризированные и подготовленные запросы (особенно при многократной вставке информации)?
- Используете ли вы явное управление транзакциями?
- Минимизирована ли длина транзакции?
- Есть ли очень длинные или объемные транзакции, которые можно разбить на несколько?- Есть ли у вас после IUD запросов select в той же транзакции?
- Выставлен ли таймаут для запроса?
- выставлен ли минимально возможный Isolation Level? Меняете ли вы его в зависимости от нужд транзакции?
- Знаете ли вы что, когда и на сколько блокируется на запись? А на чтение?
- Блокируются ли любая ваша таблица более чем на секунду?
- Знаете ли вы TOP 5 запросов в вашей системе по кол-ву вызовов? А по времени выполнения?
- Можно ли часть часто используемой информации закэшировать?
- Есть ли у вас выборки, которые по условию возвращают более 30% данных из таблицы?- Есть ли у вас выборки, которые возвращают информации в 2 раза больше чем необходимо?- Есть ли запросы, которые сканируют всю таблицу не по ключу(natural scan)?
Вот вкратце и все что вспомнилось. Почти обо все вопросы я в свое время спотыкался. Практически каждый может выиграть вам кучу времени у сервера без всяких хитрых махинаций и подстроек СУБД и БД в частности.
Не обвиняйте во всех проблемах других – попробуйте сначала найти их в себе.
P.S. Если причина упоминания какого-либо пункта не ясна - спрашивайте.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.