Sql 不使用联合优化查询
我有下面的查询,它是从匿名块生成的。如果需要,我也可以更改匿名块。 下面提到了2010年和1月份的查询结果,但我一直在这样做。通过这种方式,我希望每年从2009年到2017年运行这些查询。Sql 不使用联合优化查询,sql,oracle,optimization,union,Sql,Oracle,Optimization,Union,我有下面的查询,它是从匿名块生成的。如果需要,我也可以更改匿名块。 下面提到了2010年和1月份的查询结果,但我一直在这样做。通过这种方式,我希望每年从2009年到2017年运行这些查询。 ID\u REC的值是不同的,有47个值。因此,1月份将产生47条记录 每年一次运行查询需要10分钟以上的时间。是否有其他方法可以优化此查询并使其成为单个查询? 我每次都使用rownum获取第一条记录 我没有这列的索引 SELECT ID_REC,MONTH_ID,NAME,LOAD_SDT,LOAD_I
ID\u REC
的值是不同的,有47个值。因此,1月份将产生47条记录
每年一次运行查询需要10分钟以上的时间。是否有其他方法可以优化此查询并使其成为单个查询?
我每次都使用rownum获取第一条记录
我没有这列的索引
SELECT ID_REC,MONTH_ID,NAME,LOAD_SDT,LOAD_ID from TEST_REC_LIST where month_id = 201001 and ID_REC= 1 and rownum=1 union
那么这个呢:
SELECT DISTINCT
ID_REC, MONTH_ID,
FIRST_VALUE(NAME) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) AS NAME,
FIRST_VALUE(LOAD_SDT) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) LOAD_SDT,
FIRST_VALUE(LOAD_ID) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) AS LOAD_ID
from TEST_REC_LIST
where month_id = 201001
and ID_REC BETWEEN 0 and 48;
那么这个呢:
SELECT DISTINCT
ID_REC, MONTH_ID,
FIRST_VALUE(NAME) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) AS NAME,
FIRST_VALUE(LOAD_SDT) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) LOAD_SDT,
FIRST_VALUE(LOAD_ID) OVER (PARTITION BY ID_REC, MONTH_ID ORDER BY ROWID) AS LOAD_ID
from TEST_REC_LIST
where month_id = 201001
and ID_REC BETWEEN 0 and 48;
将row\u number()
与分区一起使用
:
select id_rec, month_id, name, load_sdt, load_id
from (select id_rec, month_id, name, load_sdt, load_id,
row_number() over (partition by id_rec order by null) as rn
from test_rec_list
where month_id = 201001)
where rn = 1;
如果您只对特定的id\u rec
s感兴趣,请在where
子句中添加和id\u rec in(1,2,3,5…)
您还可以将其中month\u id=201001
更改为month\u id,介于。。。和…
并在分区中包含month\u id
,以在一个查询中生成所有内容
如果您有任何键,可以将order by null
更改为正确的顺序,可能是load\u id
或日期
编辑:根据您的评论,您的查询应该是:
select entity_id,month_id,sys_db_name,sys_load_dts,sys_load_id
from (select entity_id,month_id,sys_db_name,sys_load_dts,sys_load_id,
row_number() over (partition by entity_id, month_id order by rowid) as rn
from int_pub_edw.dm_cust_purch_fl
where month_id between 201001 and 201012 and entity_id between 0 and 48)
where rn = 1;
不要使用行编号()
两次,也不要忽略其中rn=1
,这一点非常重要,在这里,我们每个id/月只获得一行
表只命中一次,没有联合,所有内容都在一个查询中,如果列entity\u id
和month\u id
上有索引,应该很快 将行编号()
与分区一起使用
:
select id_rec, month_id, name, load_sdt, load_id
from (select id_rec, month_id, name, load_sdt, load_id,
row_number() over (partition by id_rec order by null) as rn
from test_rec_list
where month_id = 201001)
where rn = 1;
如果您只对特定的id\u rec
s感兴趣,请在where
子句中添加和id\u rec in(1,2,3,5…)
您还可以将其中month\u id=201001
更改为month\u id,介于。。。和…
并在分区中包含month\u id
,以在一个查询中生成所有内容
如果您有任何键,可以将order by null
更改为正确的顺序,可能是load\u id
或日期
编辑:根据您的评论,您的查询应该是:
select entity_id,month_id,sys_db_name,sys_load_dts,sys_load_id
from (select entity_id,month_id,sys_db_name,sys_load_dts,sys_load_id,
row_number() over (partition by entity_id, month_id order by rowid) as rn
from int_pub_edw.dm_cust_purch_fl
where month_id between 201001 and 201012 and entity_id between 0 and 48)
where rn = 1;
不要使用行编号()
两次,也不要忽略其中rn=1
,这一点非常重要,在这里,我们每个id/月只获得一行
表只命中一次,没有联合,所有内容都在一个查询中,如果列entity\u id
和month\u id
上有索引,应该很快 这样行吗<代码>从测试记录列表中选择ID记录、MONTH记录、NAME、LOAD SDT、LOAD记录,其中ID记录在(1,10,11,12…9)中,MONTH记录ID=201001,rownum=1
作为rownum=1它只返回一行的目的是什么。。。rownum=1
?它将返回一个任意的非确定行,因为您没有指定任何ORDER BY
。对于每个ID\u REC,都需要获取rownum=1是,但是哪一行?你认为什么是“一行”?这行吗?代码>从测试记录列表中选择ID记录、MONTH记录、NAME、LOAD SDT、LOAD记录,其中ID记录在(1,10,11,12…9)中,MONTH记录ID=201001,rownum=1
作为rownum=1它只返回一行的目的是什么。。。rownum=1
?它将返回一个任意的非确定行,因为您没有指定任何ORDER BY
。对于每个ID\u REC,都需要获取rownum=1是,但是哪一行?你认为“一行”是什么?我想要201001到201031之间的蒙太奇。你能告诉我如何在分区中使用它,以及它是否会优化性能吗?我希望monthid在201001到201031之间。你能告诉我如何在分区中使用它,以及它是否会优化性能吗?它返回的重复记录sadd DISTRICT关键字我不确定应该在哪里添加DISTINCT,因为对于每个ID_REC,需要获取rownum=1。此外,对于group by子句,其给定错误为not group by EXPRESSION通常应重新返回564条记录,因为我有ID_REC 47和47*12(月)=564条记录返回重复记录add DISTICT关键字我不确定应在何处添加DISTINCT,因为对于每个ID_REC,需要获取rownum=1。同样对于group by子句,其给出的错误不是group by表达式。通常,它应该重新返回564条记录,因为我有ID_REC 47和47*12(月)=564条记录