Что вызывает перегрузки базы данных SQL? - PullRequest
2 голосов
/ 27 апреля 2011

База данных: SQL-сервер

Я создал программу, которая работает на нескольких машинах и довольно часто запрашивает базу данных. В последнее время произошло то, что запросы, поступающие из каждого экземпляра этой программы, приводили к полной остановке базы данных. Было почти невозможно запросить что-либо из базы данных, не ожидая много секунд.

Так что я пытаюсь лучше понять эту проблему и выяснить, что вызвало это. У меня есть несколько вопросов:

  1. Если у меня есть запрос на чтение, который обычно выполняется 2 секунды, что произойдет, когда во многих случаях моя программа пытается выполнить этот же запрос? Все они работают в базе данных одновременно или только по одному за раз? Если они запускаются по одному, формируются ли запросы, которые не выполняются, и формируют очередь? Я думаю, что если эта очередь может накапливаться до определенного момента, это приведет к замедлению работы базы данных.

  2. Что обычно приводит к необычайно медленной работе базы данных? Может ли это быть вызвано большими таблицами (более 100 000 строк) с несколькими запросами на соединение? Или это возможно только в том случае, если где-то существует бесконечный цикл, который постоянно пытается выполнить запрос.

Приложение: у меня есть запрос, который делает несколько соединений с таблицей с более чем 100 000 строк, которая использует подзапрос в своем месте. Так что-то вроде этого:

var result = from a in db.TableNormal
    join b in db.TableHuge on a.id equals b.id
    where b.value = (db.TableOther.Select(z=>z.value).Max())
    select new {Normal = a};

Таким образом, в основном, подзапрос выполняется более 100 000 раз каждый раз, когда выполняется его родительский запрос. Если этот запрос выполняется второй раз на 10 машинах, будет ли этого достаточно, чтобы значительно снизить производительность сервера SQL? (У меня есть очень неполное представление о мощности сервера SQL).

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

Есть так много вещей, статистика устарела, взаимоблокировки, проблемы с оборудованием, блокировка какого-то большого процесса, плохо написанные запросы, плохой дизайн, отсутствие индексации.Если у вас проблемы с производительностью, вам нужно прочитать большую толстую книгу по настройке производительности, есть буквально сотни вещей, которые могут ошибаться.Если вы не очень хорошо знакомы с принципами, лежащими в основе хорошей производительности базы данных, вероятность того, что у вас плохо спроектированная база данных или плохо спроектированные запросы, близка к 100%.

Коррелированные подзапросы в конечном итоге должны выполнить сканирование таблицыбудет медленнее по мере добавления строк.Они должны использоваться редко.По сути, вы не можете воспользоваться преимуществами индексирования, и в действительности это похоже на маленький курсор в запросе (курсоры - очень плохая вещь в SQL Server).Если этот запрос выполняется часто, это может привести к замедлению работы вашей системы.Но чтобы действительно знать, что он делает, вы должны взглянуть на план выполнения.

4 голосов
/ 27 апреля 2011
  1. Все они будут работать одновременно, то есть одновременно.

  2. Многие вещи - обычно неоптимизированные запросы / база данных, без правильных (или каких-либо) индексов. 100 000 строк - это не много для базы данных SQL, хотя многие объединения также могут быть проблемой. Аппаратные проблемы могут быть из-за неисправности, нехватки памяти / процессора, медленного жесткого диска. Проблемы проектирования - плохо спроектированная схема (ненормализованная), плохо спроектированный запрос и т. Д. И т. Д. И т. П.

Я рекомендую прочитать эту статью из двух частей о решении проблем производительности в SQL Server.

1 голос
/ 27 апреля 2011

По моему опыту, единственное, что останавливает SQL-сервер, - это некорректный запрос. Это может быть попытка получить слишком много данных или создание неправильных объединений, но первое, что я хотел бы сделать, это очень внимательно посмотреть на то, что вы пытаетесь сделать, и посмотреть, есть ли лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...