Я создал таблицу календаря (с индексами), в которой есть даты, день недели, финансовый год, название дня и т. д. Диапазон в моей таблице календаря — от 2005 до 2071. У меня нет проблем, когда я запрашиваю календарный стол.
Я хочу использовать столбец даты в таблице календаря, чтобы отфильтровать 2 разных столбца даты в 2 разных таблицах.
Проблема, с которой я сталкиваюсь, заключается в том, что при поиске большого диапазона дат с использованием столбца даты в таблице календаря (например, 2010–2019) для возврата результатов требуется ОЧЕНЬ много времени. Принимая во внимание, что если я запрашиваю один и тот же диапазон дат для каждой таблицы, результаты возвращаются в секундах. Вот запрос, с которым я работаю:
Select
a.Col1,
a.Col2,
a.Col3,
a.Date1,
b.Date1
From
TableA as A
FULL JOIN TableB as B
on A.Col1 = B.Col1
INNER JOIN TableCal as C
on A.Date1 = C.Date1
or B.Date1 = C.Date1
WHERE
C.date1 between '2010' and '2019'
Если есть лучший способ написать это или если я делаю это неправильно, я открыт для всех советов / предложений! Спасибо!
Прежде всего, удалите эти NOLOCK подсказки. Они не заставляют все работать быстрее. Во-вторых, есть ли в вашей таблице календаря индексы для столбцов? Если нет, то будет медленно. Наконец, опубликуйте запрос действительный. То, что вы разместили здесь, не объединяет даты и фильтрует столбец Date по строке года. Предполагается, что таблица календаря имеет отдельные поля для каждого элемента даты, а поле Дата должно быть date. Если WHERE c.date between '2010' and '2019' не вызывает ошибку, это, вероятно, потому, что значения date были неявно преобразованы в строки, что вызвало полное сканирование таблицы.
Примеры данных и желаемые результаты действительно помогут. FULL OUTER JOIN требуется редко.
C.date1 действительно является varchar года?
исправление «c.date между« 2010 »и« 2019 »» решило проблему. Похоже, задержка была вызвана полным сканированием таблицы. Спасибо! @PanagiotisKanavos


Формально ответ заключается в использовании эквивалентных соединений, например:
Select a.Col1, a.Col2, a.Col3
From (a join
cal ca
on a.col2 = ca.col2
) full join
(b join
cal cb
on b.col2 = cb.col2
)
on a.col1 = b.col1
where ca.date between '2010' and '2019' or
cb.date between '2010' and '2019' ;