Чем быстрее сравнить изменения между подзапросами SQL? - PullRequest
2 голосов
/ 23 октября 2019

Мне нужно проверить изменение цвета кошек между двумя датами.

У меня есть запрос ниже:

WITH
cats_prior AS (SELECT IDTAG,Color FROM  CATS WHERE APPOINTMENT = '06/30/2019'),
cats_now AS (SELECT IDTAG,Color FROM  CATS WHERE APPOINTMENT = '08/31/2019')

SELECT cats_prior.IDTAG, cats_prior.Color,cats_now.Color
FROM cats_prior
JOIN cats_now on cats_prior.IDTAG = cats_now.IDTAG
WHERE cats_prior.Color != cats_now.Color

Это работает, но это занимает 11 минут, и естьоколо 15 миллионов кошек в этой таблице.

Есть ли другой способ сделать это? или способ сделать это быстрее?

Это SQL Server.

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Я бы попробовал агрегирование с предложением HAVING:

SELECT IDTAG
FROM  CATS
WHERE APPOINTMENT IN ('2019-08-31', '2019-06-30')
GROUP BY IDTAG
HAVING MIN(COLOR) <> MAX(COLOR);

Индекс на CATS(APPOINTMENT, IDTAG, COLOR) помог бы. Этот индекс также может ускорить вашу версию запроса.

1 голос
/ 23 октября 2019

Еще один способ попробовать то же самое:

select distinct cp.IDTAG
from CATS cp
inner join CATS cn
   on cp.IDTAG = cn.IDTAG
   and cp.color <> cn.color
where cp.APPOINTMENT = '06/30/2019'
   and cn.APPOINTMENT = '08/31/2019'

Вы можете проверить производительность по своим данным.

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