Присоединение таблицы календаря

Я создал таблицу календаря (с индексами), в которой есть даты, день недели, финансовый год, название дня и т. д. Диапазон в моей таблице календаря — от 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, и понять, почему это может быть плохой идеей. Это не является кнопка "быстрее".
S3S 21.03.2019 14:42

Прежде всего, удалите эти NOLOCK подсказки. Они не заставляют все работать быстрее. Во-вторых, есть ли в вашей таблице календаря индексы для столбцов? Если нет, то будет медленно. Наконец, опубликуйте запрос действительный. То, что вы разместили здесь, не объединяет даты и фильтрует столбец Date по строке года. Предполагается, что таблица календаря имеет отдельные поля для каждого элемента даты, а поле Дата должно быть date. Если WHERE c.date between '2010' and '2019' не вызывает ошибку, это, вероятно, потому, что значения date были неявно преобразованы в строки, что вызвало полное сканирование таблицы.

Panagiotis Kanavos 21.03.2019 14:44

Примеры данных и желаемые результаты действительно помогут. FULL OUTER JOIN требуется редко.

Gordon Linoff 21.03.2019 15:00

C.date1 действительно является varchar года?

S3S 21.03.2019 17:34

исправление «c.date между« 2010 »и« 2019 »» решило проблему. Похоже, задержка была вызвана полным сканированием таблицы. Спасибо! @PanagiotisKanavos

SD617 02.04.2019 20:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
1 093
1

Ответы 1

Формально ответ заключается в использовании эквивалентных соединений, например:

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' ;

Другие вопросы по теме