小编Bob*_*Bob的帖子

首先快速对大表的SQL查询然后慢

下面的查询快速返回初始结果然后变得非常慢.

SELECT A.Id
, B.Date1
FROM A
LEFT OUTER JOIN B
ON A.Id = B.Id AND A.Flag = 'Y'
AND (B.Date1 IS NOT NULL AND A.Date >= B.Date2 AND A.Date < B.Date1)
Run Code Online (Sandbox Code Playgroud)

表A有2400万条记录,表B有50万条记录.

表A的索引位于列:Id和Date

表B的索引在列上:Id,Date2,Date1 - Date1可为空 - 索引是唯一的

第一个11米的记录返回得非常快,然后突然变得非常慢.执行计划显示使用了索引.

但是,当我删除条件A.Date <B.Date1时,查询再次变快.

你知道应该怎样做才能提高性能吗?谢谢

更新: 我更新了查询以显示结果中需要表B的字段.当我有条件"B.Date1不为空"时,您可能会想到为什么我使用左连接.那是因为我发布了简化查询.我的性能问题即使是这个简化版本.

sql t-sql sql-server

6
推荐指数
1
解决办法
302
查看次数

SQL - 根据日期差异选择行

假设我们有下表:

代码 DT
c1 2020-10-01
c1 2020-10-05
c1 2020-10-09
c1 2020-10-10
c1 2020-10-20
c2 2020-10-07
c2 2020-10-09
c2 2020-10-15
c2 2020-10-16
c2 2020-10-20
c2 2020-10-24

Code 和 Dt 的组合是独一无二的。行根据 Code 和 Dt 进行排序。数据库是 Oracle 12。对于每个代码,我想获得它的 Dt 列表,与之前选择的 Dt 相比,每个 Dt 大于 7 天。因此,结果应该是:

代码 DT
c1 2020-10-01
c1 2020-10-09
c1 2020-10-20
c2 2020-10-07
c2 2020-10-15
c2 2020-10-24

如果日期差异大于 7,我已经尝试过基于 row_number() 的自连接将每一行与其前一行连接起来。任何解决方案?谢谢

sql oracle

1
推荐指数
1
解决办法
68
查看次数

标签 统计

sql ×2

oracle ×1

sql-server ×1

t-sql ×1