2016-06-20 3 views
2

У меня есть один вид с двумя полями datetime. Я хочу получить результат между двумя сочетаниями дат с любым из двух полей datetime.Как оптимизировать диапазон дат с условием ИЛИ

Я написал запрос для этого, но я хочу оптимизировать это, запрос упоминается ниже.

SELECT * 
FROM viewName 
WHERE country = 'India' 
AND ((dateTimeFieldFirst BETWEEN '2016-06-20 16:42:39' 
AND '2016-06-20 16:52:39') 
OR (dateTimeFieldSecond BETWEEN '2016-06-20 16:42:39' 
AND '2016-06-20 16:52:39')) 
+0

Оптимизировать * как *? – Jamiec

+0

Какую ошибку вы получаете? –

+0

Когда я использую или условие с SQL-сервером, требуется больше времени для выполнения. Я хочу использовать между предложением для двух полей, но с диапазоном дат это невозможно. '2016-06-20 16:41:00' BETWEEN dateTimeFieldFirst AND dateTimeFieldSecond с диапазоном дат –

ответ

4

Try отделяя это до двух запросов с использованием UNION:

SELECT * 
FROM viewName 
WHERE country = 'India' 
    AND ((dateTimeFieldFirst BETWEEN '2016-06-20 16:42:39' 
    AND '2016-06-20 16:52:39') 
UNION 
SELECT * 
FROM viewName 
WHERE country = 'India' 
    AND ((dateTimeFieldSecond BETWEEN '2016-06-20 16:42:39' 
    AND '2016-06-20 16:52:39') 

Если вы знаете, что только один из этих столбцов (dateTimeFieldFirst ,dateTimeFieldSecond) может ответить на состояние, изменить его UNION ALL, который должен быть быстрее.

Кроме того, добавьте соответствующие индексы, если они еще не существует, и если его возможно (зависит, если вы вычисляя столбцы в представлении или нет):

(country,dateTimeFieldFirst) 
(country,dateTimeFieldSecond) 
+0

Спасибо Sagi. время сокращается с помощью UNION. –

0

Вы можете попробовать установить переменные.

declare @date1 datetime = '2016-06-20 16:42:39' 
declare @date2 datetime = '2016-06-20 16:52:39' 

SELECT * 
FROM viewName 
WHERE country = 'India' 
AND ((dateTimeFieldFirst BETWEEN @date1 
AND @date2) 
OR (dateTimeFieldSecond BETWEEN @date1 
AND @date2)) 

Не знаю, как еще вы его оптимизировали.

0

Этот запрос отлично и не может оптимизироваться, на мой взгляд. Если вы хотите получить более быстрые результаты запроса, вам нужно будет посмотреть таблицу (таблицы) внутри представления, которое содержит поля даты.

Начните с применения фильтра только к этой таблице, пока не получите приемлемые результаты. Общие рекомендации состоят в том, чтобы убедиться, что два поля правильно проиндексированы и используются оптимизатором запросов.

После того, как вы удовлетворены этим представлением, посмотрите на представление. Если вам нужно улучшить производительность там, вы можете посмотреть на отдельные таблицы, которые будут объединены вместе с фильтрами, применяемыми к каждой из этих таблиц, если таковые имеются. Если все будет хорошо, пока вы не объедините представление, вы сможете оптимизировать представление несколькими способами в зависимости от вашей конкретной ситуации. Возможно, сохранение «моментального снимка» данных в ненормированном формате (возможно, хранилище данных) для устранения объединений, если вы создаете решение для отчетности. Мне также нравятся индексированные взгляды, когда ситуация правильная.

Смежные вопросы