Как повысить производительность базы данных?
Я несколько раз разрабатывал базы данных в своей компании. Чтобы повысить производительность базы данных, я ищу только нормализацию и индексирование.
Если бы вас попросили увеличить производительность базы данных, которая имеет приблизительно 250 таблиц и некоторые таблицы с миллионами записей, какие разные вещи вы бы искали?
спасибо заранее.
10 ответов
оптимизация логического проектирования
логический уровень - это структура самого запроса и таблиц. Попытайтесь сначала максимизировать это. Цель состоит в том, чтобы открыть как можно меньше данных на логическом уровне.
- имеют наиболее эффективные SQL-запросы
- создайте логическую схему, которая поддерживает потребность приложения (например, тип столбцов и т. д.)
- компромисс дизайна для поддержки некоторого варианта использования лучше, чем другое
- реляционные ограничения
- нормализация
оптимизация физического проектирования
физический уровень имеет дело с нелогичным рассмотрением, таким как тип индексов, параметры таблиц и т. д. Цель-оптимизировать Ио, которая всегда узкое место. Настройте каждый стол, чтобы соответствовать его потребности. Малая таблица может быть загружена постоянно загружается в кэш СУБД, таблица с низкой скоростью записи может иметь разные настройки, чем таблица с высокой скоростью обновления, чтобы занять меньше места на диске и т. д. В зависимости от запросов может использоваться другой индекс и т. д. Вы можете денормализовать данные прозрачно с материализованными представлениями и т. д.
- Paremeters таблиц (размер распределения, etc.)
- индексы (комбинированные, типы и т. д.)
Это очень неопределенный вопрос.
вы говорите, что ищете индексацию, но вы не можете смотреть на индексацию в изоляции. Вы должны посмотреть на выполняемые запросы, планы выполнения, используемые индексы и способы их использования. Инструмент профилировщика может помочь в определении того, какие запросы неэффективны.
помимо этого-убедитесь, что план обслуживания настроен. Вы должны обновлять статистику и дефрагментировать / перестраивать индексирует не реже одного раза в неделю в массивной транзакционной базе данных.
Если у вас есть инфраструктура, посмотрите на настройки файла и файловой группы. Вы должны попытаться поместить таблицы и / или индексы, которые являются большими и часто используются на разных физических дисках, если это возможно. Если у вас есть очень большие таблицы, вы можете подумать о их разбиении.
Если у вас все еще есть проблемы с производительностью,денормализация иногда может помочь, но все зависит от ситуация.
Я собираюсь остановиться на этом - не хочу, чтобы этот ответ стал самым случайным в мире списком советов по производительности SQL. Я рекомендую вам быть более конкретным о том, где вы думаете, проблемы с производительностью, и расскажите нам немного больше о базе данных (размер, текущая стратегия индексирования, частота транзакций, любые большие отчеты, которые вам нужно создать, и т.д.)
сжатие. Для подавляющего большинства нагрузок, которые я пробовал, использование сжатия было огромной бесплатной поездкой. Уменьшенный размер данных значит уменьшенный I/O значит более лучшее объем. В SQL Server 2005 параметры сжатия ограничены (vardecimal
). Но я бы серьезно рассмотрел возможность обновления до 2008 года только для сжатия страниц. Или 2008 R2, если вы используете nvarchar
часто, чтобы получить сжатие Unicode.
Сохранение Данных. Установление политики хранения и удаление старые данные агрессивно. Меньше данных означает меньше ввода-вывода, означает лучшую пропускную способность. Часто это рассматривается как оперативный, а не дизайн, но мне нравится думать об этом как о проблеме дизайна приложения.
конечно, я предполагаю, что вы уже контролируете каждый запрос, чтобы убедиться, что никто не делает глупые сквозные сканирования таблиц.
многие другие ускорители производительности в основном работают или развертываются, а не проектируются: обслуживание (дефрагментация, перестройка индекса и т. д.), ввод-вывод и дизайн хранилища так далее.
и последнее, но не в последнюю очередь понять скрытую стоимость различных решений под ключ. Например, репликация или зеркальное отображение базы данных.
к вашему инструментарию нормализации и индексирования с чрезвычайно большими таблицами вы также можете рассмотреть плюсы и минусы разделения таблиц. Но у вас уже есть ключевые.
есть много вещей, которые вы могли бы сделать, многие из них уже предложено выше. Некоторые из них я бы посмотрел (в этом порядке):
- ошибки / журналы-многие ядра БД имеют инструменты отчетности, которые указывают на проблемные области в базе данных. Начните здесь, чтобы увидеть, если есть что-то, что вы можете сосредоточиться на прямо сейчас.
- хранение данных - проверьте бизнес-спецификацию, как долго данные должны храниться, убедитесь, что все старые данные перемещаются в хранилище данных, чтобы сохранить размер таблицы небольшим. (Зачем хранить 5 лет, если нужны только последние 3 месяца?)
- ищите сканирование таблицы, индексируйте данные, если это поможет (вы должны измерить это против записи таблицы). Журналы сервера, вероятно, помогут вам найти сканирование таблиц.
- атомарные элементы работы, некоторые записи сохраняют блокировки в разных таблицах до достижения точки фиксации? Можно ли упростить эти элементы работы или переместить точки фиксации для ускорения производительности? Здесь вам понадобится разработчик посмотреть на код.
- ищите длительные операторы SQL, можно ли сделать их более эффективными? Иногда плохо структурированные запросы могут действительно затянуть приложение. Для повышения производительности может потребоваться изменить кодировку.
- DBA realm: посмотрите, как распределяются таблицы: размер страницы, несколько сегментов и т. д. Здесь пригодятся инструменты диагностики от поставщика, так как они часто могут подсказать, как можно структурировать таблицу на основе истории использования. Опытный dba будет полезен здесь.
- ищите аппаратные / сетевые узкие места. Здесь тебе понадобится парень с оборудованием. :)
Это действительно высокий уровень, я бы также взглянул на то, что предлагает поставщик вашего DB engine в качестве улучшения производительности.
кроме того, я бы датчик такой список против того, что мой босс готов заплатить и сколько времени у меня есть. ;)
надеюсь, что это помогает.
мой ролл в MySpace был "повышение производительности DBA / Developer". Я бы сказал, что нормализация и индексы являются требованием в высокопроизводительных базах данных, но вы должны действительно проанализировать свои структуры таблиц и индексов, чтобы действительно разблокировать возможности проектирования баз данных.
вот несколько предложений, которые я хотел бы для вас;
познакомьтесь с двигателем DB. A через знание подчеркивающей структуры ввода-вывода проходит очень долгий путь в проектировании правильный индекс или таблица. Используя PerfMon и Profiler, наряду с вашими знаниями о том, что такое чтение/запись I/Os, вы можете поместить некоторые очень конкретные цифры за свою теорию того, что такое хорошо сформированное решение таблицы / индекса.
поймите разницу между кластеризованными и Некластеризованными индексами и когда их использовать.
использовать sys.dm_os_waiting_tasks и sys.dm_os_wait_stats DMVs. Они скажут вам, куда вы должны приложить свои усилия сокращение времени ожидания.
используйте DBCC SET STATISTICS IO / TIME ON и оцените свои планы выполнения, чтобы увидеть, уменьшает ли один запрос или увеличивает количество считываний страниц или продолжительность.
DBCC SHOWCONTIG сообщит вам, если ваши таблицы сильно фрагментированы. Это часто игнорируется разработчиками и младшими DBAs с точки зрения производительности-однако это может иметь очень большое влияние на количество страниц-чтения у вас есть. Если таблица имеет 20% степени плотность страниц, это означает, что Вы читаете примерно в 5 раз больше данных, чем в противном случае, если бы таблица и ее индексы были дефрагментированы.
оценить грязные чтения (nolock, read uncommited). Если вы можете избавиться от миллисекундной точности при чтении, сохраните замки!
рассмотрите возможность извлечения ненужных внешних ключей. Они полезны в среде разработки, а не в высокопроизводительных транзакционных системах.
разделы в больших таблицах имеют большое значение-только если они правильно спроектированы.
изменения приложения - если вы можете запланировать пакетные обновления для асинхронных транзакций, поместите их в кучу без индексов и обработайте ее по расписанию, чтобы вы не постоянно обновляли таблицы, которые вы сильно запрашиваете.
Всегда Всегда Всегда!!! используйте ту же переменную типа данных для запроса целевых столбцов; например, следующая инструкция использует переменную bigint для столбца smallint:
объявить @i bigint установить @i = 0
выберите * из MyTable, где Col01SmallInt >= @i
в процессе оценки страниц индекса / таблицы механизм запросов может выбрать преобразование данных столбца smallint в тип данных bigint. Вместо этого измените тип varialbe или, по крайней мере, преобразуйте его в smallint в своем условии поиска.
- среда SQL 2005/08 дает вам "отчеты" в приложении управления, взгляните на отчеты о том, как выполняются ваши индексы. Их сканируют, видят? когда вы последний раз сканировали стол? Если это было недавно, индексы не выполняют все необходимые запросы. Если у вас есть индекс, который почти не используется (см. или сканируется), но постоянно обновляется, рассмотрите возможность его удаления.. Это может сэкономить вам много ненужных блокировок строк и ключей. ..
Это все, о чем я могу думать с моей макушки. Если вы столкнетесь с более конкретной проблемой, у меня будет более конкретный ответ для вас..
Если запрос является чрезвычайно критически важным, вы можете рассмотреть de - нормализация, чтобы уменьшить количество поисков таблиц на запрос. Кроме того, если вам нужно больше производительности, помимо индексирования и де-нормализации, вы можете посмотреть на программную сторону: кэширование, оптимизация запросов/хранимых процедур и т. д.
для повышения производительности вам сначала нужно будет контролировать свою базу данных. Вы можете отслеживать и загружать его в SQL server profiler, чтобы узнать, какие запросы являются самыми медленными. После этого вы можете сосредоточиться на них.
вы также можете использовать динамические представления и функцию управления, чтобы узнать, какие индексы отсутствуют. Вы также сможете получать статистику о существующих индексах, таких как использование индекса и пропущенные индексы.
оптимизация запросов, используемых для доступа к этой базе данных, является наиболее важной. Просто добавляя индексы, вы не гарантируете, что запросы будут их использовать.
мы не написали об одном бит производительности:
оборудование.
базы данных интенсивно управляются вводом-выводом. Переезд на более быстрый жесткий диск должен увеличить скорость запросов к базе данных. Разделение базы данных между многими быстрыми жесткими дисками может улучшить ее еще больше.