Как я могу оптимизировать этот SQL-запрос? - PullRequest
0 голосов
/ 06 мая 2009

Прямо сейчас у меня есть SQL-запрос, который действителен, но всегда истекает:

SELECT 
(
SELECT (MAX(WP_ODOMETER) - MIN(WP_ODOMETER)) / DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME))
FROM WAYPOINTS
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
AND WP_VTDID = 'L088'
)
AS MAXD, 
(
SELECT MAX(WP_ODOMETER) 
FROM WAYPOINTS
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
AND WP_VTDID = 'L088'
)
AS MD

Я хочу создать представление на основе вышеуказанного SQL-запроса. Примерно так:

SELECT L_VTDID
(
SELECT (MAX(WP_ODOMETER) - MIN(WP_ODOMETER)) / DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME))
FROM WAYPOINTS
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
AND WP_VTDID = LOCOMOTIVES.L_VTDID
)
AS MAXD, 
(
SELECT MAX(WP_ODOMETER) 
FROM WAYPOINTS
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
AND WP_VTDID = LOCOMOTIVES.L_VTDID
)
AS MD
FROM LOCOMOTIVES

Ответы [ 3 ]

3 голосов
/ 06 мая 2009

Верьте или нет, языки на стороне клиента на самом деле вполне способны выполнять вычитание и деление и т. Д. Итак, если бы это было до меня, я бы упростил запрос (тем более что эта версия создает проблемы):

SELECT MAX(WP_ODOMETER) AS MAX_ODO,
       MIN(WP_ODOMETER) AS MIN_ODO, 
       MIN(WP_DATETIME) AS MIN_DATE,
       MAX(WP_DATETIME) AS MAX_DARE
  FROM WAYPOINTS
 WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
   AND WP_VTDID = 'L088'

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

1 голос
/ 06 мая 2009

Поскольку они имеют одинаковое предложение where, вы можете объединить их:

SELECT 
MAX(WP_ODOMETER),
(MAX(WP_ODOMETER) - MIN(WP_ODOMETER)) / 
DATEDIFF(DAY, MIN(WP_DATETIME), MAX(WP_DATETIME))
FROM WAYPOINTS
WHERE WP_DATETIME BETWEEN DATEADD(DAY,-14,GETDATE()) AND GETDATE()
AND WP_VTDID = 'L088'

Индекс WP_VTDID, WP_DATETIME может ускорить это. Вы также можете включить WP_ODOMETER в индекс, чтобы сохранить поиск закладок из индекса в самой таблице.

Если время ожидания истекло из-за того, что кто-то другой блокирует таблицу, попробуйте изменить оператор from на:

FROM WAYPOINTS (NOLOCK)

Если запрос работает нормально с NOLOCK, другой процесс использует таблицу и не позволяет вашему запросу блокировать строки.

0 голосов
/ 06 мая 2009

Индексируются ли WAYPOINTS для WP_DATETIME и WP_VTDID?

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