SQL-запросы всегда - PullRequest
       5

SQL-запросы всегда

2 голосов
/ 27 января 2010

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

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

Если я в sql server запускаю следующий запрос:

select top 100 *
from bam_Prestatie_AllInstances p
join bam_Zending_AllRelationships r on p.ActivityID = r.ReferenceData
join bam_Zending_AllInstances z on r.ActivityID = z.ActivityID
where p.PrestatieZendingOntvangen >= '2010-01-26' and p.PrestatieZendingOntvangen < '2010-01-27'

Это занимает около 35-55 секунд, что слишком долго. Потому что это только маленький.

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

Когда я использую план запросов для этого, я вижу, что 100% времени тратится на индексацию поля PrestatieZendingOntvangen. Если я установлю это поле для индексирования, ничего не изменится.

У кого-нибудь есть идеи, что делать?

Потому что мои клиенты начинают жаловаться на тайм-ауты и т. Д.

Спасибо

Ответы [ 6 ]

6 голосов
/ 27 января 2010

Помимо очевидного вопроса об индексе для столбца bam_Prestatie_AllInstances.PrestatieZendingOntvangen, также проверьте, есть ли у вас индексы для столбцов внешнего ключа:

  • p.ActivityID (таблица: bam_Prestatie_AllInstances)
  • r.ReferenceData (таблица: bam_Zending_AllRelationships)
  • r.ActivityID (таблица: bam_Zending_AllRelationships)
  • z.ActivityID (таблица: bam_Zending_AllInstance)

Индексация полей внешнего ключа может немного ускорить СОЕДИНЕНИЕ по этим полям!

Кроме того, как уже упоминалось: попытайтесь ограничить выбор полей, указав определенный список полей, а не SELECT *, особенно если вы объединяете несколько таблиц, просто количество столбцов, которые вы выбираете по количеству выбранных вами строк) может вызвать массовую передачу данных - и если вам не нужны все эти столбцы, это просто трата пропускной способности!

2 голосов
/ 27 января 2010
  1. Укажите поля, которые вы хотите получить, а не *
  2. Укажите либо внутреннее, либо внешнее соединение
0 голосов
/ 31 января 2010

Сколько столбцов имеет bam_Prestatie_AllInstances и другие таблицы? Похоже, вы распределяете все столбцы, и это, безусловно, может быть проблемой производительности.

Вы пытались выбрать определенные столбцы из определенных таблиц, таких как:

select top 100 p.column1, p.column2, p.column3

Вместо запроса всех столбцов, как вы делаете в данный момент:

select top 100 *
0 голосов
/ 27 января 2010

Кто-то из БД может прояснить мои сомнения по этому поводу.

Я думаю, вы должны указать дату в том стиле, в котором БД сможет ее понять.
например, Предполагая, что дата хранится в таблице в формате мм / дд / гггг, а ваш запрос пытается ввести для сравнения другой стиль даты (гггг-мм-дд), производительность снизится.

Не слишком ли я наивен, когда я это предполагаю?

0 голосов
/ 27 января 2010

Поместили ли вы индексы в поля даты в вашем предложении Where.

Если нет, я бы создал ИНДЕКС для этих полей, чтобы посмотреть, не изменит ли он ваше время.

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

EDIT:

Другие также высказали хорошие замечания по поводу указания столбцов, которые вам нужны в Select вместо * (подстановочный знак), и размещения большего количества индексов для внешних ключей и т. Д.

0 голосов
/ 27 января 2010

Попробуй между?

where p.PrestatieZendingOntvangen 
   between '2010-01-26 00:00:00' and '2010-01-27 23:00:00'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...