【问题标题】:Faster way compare changes between SQL sub-queries?更快的方式比较 SQL 子查询之间的变化?
【发布时间】:2020-02-20 01:31:53
【问题描述】:

我需要检查两个日期之间猫的颜色变化。

我有以下问题:

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 分钟,并且该桌子上有大约 1500 万只猫。

还有其他方法可以做到这一点吗?或者有什么方法可以加快速度?

这是 SQL Server。

【问题讨论】:

  • 表上的索引是什么样的?
  • 怎么没人问猫的颜色在两个月内如何变化?哈!
  • 没有索引,我无法添加任何索引。

标签: sql sql-server database


【解决方案1】:

我会尝试使用 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) 上的索引会有所帮助。该索引还可以加快您的查询版本。

【讨论】:

  • 这很漂亮。这是迄今为止最快的。如果没有更快的速度出现,我会在几个小时后将其标记为答案。谢谢
  • @DNS_Jeezus 。 . .时间是什么?
  • 我认为这可能比我的答案更快,但我也对时间感到好奇。
  • 其实我已经不知道了。有一些奇怪的缓存或正在发生的事情。 avery's 今天更快了。但是经过奇怪的缓存。 avery 平均在 8 秒内运行 gordon 在 12 秒内运行我的旧查询在 23 秒内运行。
  • @DNS_Jeezus 。 . .查询的性能将取决于许多因素。有趣的因素之一是在某一天有多少IDTAGs。或多或少肯定会影响哪个最好。
【解决方案2】:

尝试同样事情的另一种方式:

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'

您可以根据数据检查性能。

【讨论】:

  • DISTINCT 通常会导致更长的执行时间。 cp.IDTAG 也应该在“select”之后使用,别名缺失。
  • 我认为不需要重复。这使得分组或不同,我相信它们的表现几乎相同。如果 OP 不关心重复项(或者可以保证没有猫在那些日子有多个约会),那么可以删除 distinct。
  • 你读过你链接的帖子吗? Distinct 最终比 group by 更快(几乎没有)。无论如何,OP 可以检查这两个选项以获得最佳性能。选择 cp.idtag ... 按 cp.idtag 分组。在这个简单的查询中,如果差异显着,我会感到惊讶,尽管很明显。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
相关资源
最近更新 更多