Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 ORACLE-在一个大表上设置重复的排序,需要优化_Sql_Oracle_Optimization - Fatal编程技术网

Sql ORACLE-在一个大表上设置重复的排序,需要优化

Sql ORACLE-在一个大表上设置重复的排序,需要优化,sql,oracle,optimization,Sql,Oracle,Optimization,这是对更复杂算法的简化提取。 问题是我有一个简单的表C_哈希,如下所示: CREATE TABLE C_HASH ( HASH CHAR (48), RANK INTEGER ); 首先,我用所有散列值填充表。但是因为我可以在散列中有重复项,为了逐个识别重复项,我需要按散列设置排名 我执行此SQL语句,但它太长了,我已为哈希列编制了索引,但没有任何效果: UPDATE C_HASH a set RANK = ( select temp.rank from

这是对更复杂算法的简化提取。 问题是我有一个简单的表C_哈希,如下所示:

CREATE TABLE C_HASH
    (   
    HASH CHAR (48),
    RANK INTEGER
    );
首先,我用所有散列值填充表。但是因为我可以在散列中有重复项,为了逐个识别重复项,我需要按散列设置排名

我执行此SQL语句,但它太长了,我已为哈希列编制了索引,但没有任何效果:

UPDATE C_HASH a set RANK = ( select temp.rank from ( select rowid, rank() over ( PARTITION BY HASH ORDER BY ROWID ) rank from C_HASH ) temp where temp.rowid = a.rowid);

我需要优化这个!提示?

这需要很长时间,因为您正在更新所有行。但您可以将逻辑简化为:

update c_hash h
    set rank = (select count(*)
                from c_hash h2
                where h2.hash = h.hash and h2.rowid <= h.rowid
               );

这应该是一个利用现有索引的表。

这将花费很长时间,因为您正在更新所有行。但您可以将逻辑简化为:

update c_hash h
    set rank = (select count(*)
                from c_hash h2
                where h2.hash = h.hash and h2.rowid <= h.rowid
               );
这应该是一个利用现有索引的表。

您可以使用合并语法:

样本数据:

HASH | RANK :----------------------------------------------- | ---: foo | null foo | null foo | null bar | null 您可以使用合并语法:

样本数据:

HASH | RANK :----------------------------------------------- | ---: foo | null foo | null foo | null bar | null
编辑问题并显示所需结果。编辑问题并显示所需结果。
create table c_hash2 as
select hash, row_number() over(partition by hash order by rowid) as rank
from c_hash