Я использую этот SELECT статус

SELECT ID, Code, ParentID,... 
FROM myTable WITH (NOLOCK)
WHERE ParentID = 0x0

Этот статус повторяется каждые 15 минут (через службу Windows)
Проблема в том, что при выполнении этого запроса база данных становится медленной для других пользователей.
Как лучше всего избежать снижения производительности при выполнении запроса?

0
CodeGear 16 Июл 2017 в 00:01
1
Вы должны выяснить, в чем причина того, что база данных становится медленной, можно ли улучшить запрос и, возможно, также подумать, действительно ли вам действительно нужно каждый раз получать 500 тыс. Строк, что вы с ними делаете?
 – 
James Z
16 Июл 2017 в 00:47
Если ваша основная цель - избежать воздействия на других пользователей, добавьте подсказку OPTION(MAXDOP 1) в конец запроса. Если вы хотите ускорить этот запрос, добавьте индекс для ParentID вместе со столбцами в списке выбора или измените кластерный индекс на ParentID.
 – 
Dan Guzman
16 Июл 2017 в 01:03
Обычно результат этого запроса составляет от 25 до 50 записей, но я должен использовать этот запрос, чтобы найти их. Затем у меня есть некоторые вычисления с другой базой данных в зависимости от результатов.
 – 
CodeGear
16 Июл 2017 в 22:40

2 ответа

Создайте план выполнения для своего запроса и изучите его.

  • Индексировано ли поле ParentId?
  • Есть ли другие способы оптимизации запроса?

Можно ли увеличить производительность сервера, на котором размещен SQL Server?

  • Требуется ли больше диска или ОЗУ?
  • Есть ли у вас отдельные диски (шпиндели) для операционной системы, данных, журналов транзакций, временных баз данных?

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

0
STLDev 16 Июл 2017 в 00:19
Индексировано ли поле ParentId? Да, есть ли другие способы оптимизации запроса? Я не знаю, что это единственный способ узнать. Нет необходимости в дополнительной оперативной памяти
 – 
CodeGear
16 Июл 2017 в 22:46
Вы создали и просмотрели план выполнения запроса?
 – 
STLDev
17 Июл 2017 в 00:30

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

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

-1
marc_s 16 Июл 2017 в 11:06