Sql ORACLE-在一个大表上设置重复的排序,需要优化
这是对更复杂算法的简化提取。 问题是我有一个简单的表C_哈希,如下所示: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
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