Что является наиболее распространенным узким местом производительности, которое не вызвано структурой базы данных?
Топ-10 узких мест в SQL Server
Ответ 1
Посмотрим (в определенном порядке)
-
курсоры
-
non-sargable where clauses
-
Невозможность индексирования полей внешнего ключа
-
Невозможно индексировать поля, обычно используемые в предложении where
-
взаимосвязанные подзапросы
-
случайные кросс-соединения, вызывающие необходимость различать набор результатов
-
Неверный код, поступающий из ORM
-
Код, который вызывает слишком много чтений или вызывается более одного раза, когда это не нужно (я видел приложения, которые отправляют один и тот же код много раз, когда им это не нужно, или каждый раз, когда страница открыта)
-
Перегрузка сетевой трубы
-
Пользовательские функции, вызывающие обработку по строкам
-
Параметр sniffing
-
устаревшая статистика
-
Союз, а не объединение всех
Ответ 2
сканирование таблицы, потому что:
- индекс не существует
- устаревшие данные
- функции, в которых условие запрещает использование
Ответ 3
- Сервер - как память и память типы.
- Сеть - Задержка и пропускная способность вопросы.
- Индексация - не уверен, если вы считаете эта структура базы данных
- Запросы - Плохие запросы с присоединением проблемы, которые могут вызвать полную таблицу сканирование.
Ответ 4
Физический.... Запуск из памяти и переход на диск.
Ответ 5
Применение скалярной функции к каждой строке в результирующем наборе
SELECT fn_EveluateSomeValue([ColumnName]) FROM LargeTable
Ответ 6
Использование курсоров. Для любой базы данных.
Ответ 7
Использование табличных данных по одной строке за раз, а не по одной таблице за раз (т.е. курсоры).
Ненужные (или плохо спроектированные) блокировки.
Журналы регистрируют вещи, которые не нужно регистрировать (удалить из таблицы вместо таблицы Truncate и т.д.)
Наличие ограничений при загрузке данных. Серьезно замедляет вставку. Выключите их, загрузите данные, затем включите их.
Ответ 8
Ditto ref cursors, также плохо написанные клиентские приложения, которые получают огромный набор записей, затем обрабатывают его сами, потому что разработчик не понял, что sql был чем-то большим, кроме огромной кучи для хранения данных.
Попытка сделать все в одном огромном запросе, а не разбить его на разумные шаги. Иногда это не даст SQL возможности правильно уменьшить количество индексов (надеюсь,!) Страниц, на которые он должен смотреть. В связи с этим, не понимая, как использовать временные таблицы для передачи манипуляций до обновления больших индексированных таблиц.
Не имеет индексов для объединений или обычно запрашиваемых полей.
Не включая поля в индексах, когда вы всегда ищете и возвращаете одно и то же значение (например, форматированное имя для сотрудника при поиске с использованием EmployeeID), вызывая два действия вместо одного.
Ответ 9
Некоторые низко висящие фрукты:
- Скалярные UDF
- опускание
text()
в запросах XPath - недостающие столбцы в индексах (вызывание ключевых запросов)
- с помощью курсоров
- не использовать fast_forward, когда это возможно, когда курсоры необходимы
- с помощью
JOIN
, когда будет выполнятьсяAPPLY
, или наоборот (test!)
Ответ 10
Триггеры могут быть ОГРОМНЫМ узким местом (и головной болью) при обработке больших партий команд.
Ответ 11
Если система ввода-вывода на сервере не соответствует заданию, вы можете получить конфликт затвора на tempdb, и это, в свою очередь, может вызвать серьезные проблемы с производительностью.
Ответ 12
Я склоняюсь к следующим узким местам (по порядку частоты):
- Отсутствующие или неверные индексы (в результате чего сканируются таблицы)
- Плохо написанные запросы
- Контекст ввода/вывода
Ответ 13
Наличие плохой конфигурации my.cnf может убить сервер даже при правильном проектировании и индексировании базы данных. Читайте:
http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/ http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/ http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/
http://www.mysqlperformanceblog.com/2007/08/18/how-fast-can-you-sort-data-with-mysql/ http://www.mysqlperformanceblog.com/2007/09/17/mysql-what-read_buffer_size-value-is-optimal/
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html
Полезный аналитический инструмент my.cnf: http://www.day32.com/MySQL/tuning-primer.sh
Ответ 14
Мне никогда не удавалось найти много полезной информации о распаде больших запросов, в Oracle кажется, что вам больше рекомендуется хранить все вместе в одном запросе, а не использовать временные таблицы. Вы также можете получить проблемы с журналом повтора, если ваша временная таблица хранит много данных. Я хотел бы узнать больше/получить некоторые ссылки?
Ответ 15
неисправное оборудование. У меня был сервер один раз, когда на жестком диске были некоторые сектора, которые он испытывал затруднения при чтении, и мы заменили его, что заметно увеличило производительность.
Ответ 16
Для нас настройка настроек BIOS и настроек плана мощности привела к тому, что для запросов, интенсивно работающих в ЦП (поиск, продолжительность около 5 секунд), было достигнуто твердое ~ 2 раза быстрее.
1) Настройки BIOS изменились с "Производительность на ватт-оптимизированный (DAPC)" на "Производительность" или "Производительность на ватт с оптимизацией (OS)". Обе опции, похоже, выполнялись аналогичным образом, однако "управляемая ОС" не постоянно приводила вентилятор в макс.
2) План питания Windows был изменен с "Сбалансированный" на "Высокая производительность".
Это было обнаружено после обновления процессоров и почти не улучшилось.
Команда для проверки скорости процессора от SQLServerCentral:
PS> gwmi -class win32_Processor | SELECT CurrentClockSpeed, MaxClockSpeed
Обновление 6/13/2017: Предупреждение: этот номер может сообщить Current = Max, однако диспетчер задач может показать другое (гораздо меньшее) число. Также режим BIOS "Performance Per Watt Optimized (OS)" внезапно прекратил работать для нас после некоторых изменений аппаратного обеспечения. ЦП был заблокирован с максимальной частотой 50%, независимо от нагрузки. Только режим "Производительность" (режим громкоговорителя) все же достиг максимального максимального значения. Нам не хватает патча прошивки/программного обеспечения.
Ответ 17
Оговорки, которые следует избегать (если возможно):
- DISTINCT/UNIQUE
- UNION
- GROUP BY
- ЗАКАЗАТЬ