Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不使用联合优化查询_Sql_Oracle_Optimization_Union - Fatal编程技术网

Sql 不使用联合优化查询

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

我有下面的查询,它是从匿名块生成的。如果需要,我也可以更改匿名块。 下面提到了2010年和1月份的查询结果,但我一直在这样做。通过这种方式,我希望每年从2009年到2017年运行这些查询。
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条记录