暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 搜索串联索引值

ASKTOM 2019-05-02
274

问题描述

我正在调查连接索引的问题
(也称为多列,复合或组合索引)。

因此,根据当前的设计,我有2列KEY1和KEY2,它们产生了我的主键pk1。

CREATE TABLE "myTable" 
   ( "KEY1" VARCHAR2(7 CHAR) NOT NULL ENABLE, 
 "KEY2" NUMBER(7,0) NOT NULL ENABLE, 
 "INFO1" VARCHAR2(1 CHAR), 
 "INFO2" VARCHAR2(2 CHAR)
  CONSTRAINT "PK1" PRIMARY KEY ("KEY1", "KEY2") ENABLE
   )
复制


K1    |K2
------|-----
12345 |1254
564874|521
6689  |76758
复制


所以PK1会是这样的

PK1
---------
123451254
564874521
668976758
复制


现在我想做的是直接搜索连接的PK1
SELECT * FROM myTable WHERE PK1 = 564874521
复制


是否有可能直接在Oracle中执行此操作,而不是使用诸如

SELECT * FROM myTable WHERE K1 = 564874 AND K2 = 521
复制



专家解答

您可以创建一个虚拟列,将两者连接起来。并索引:

CREATE TABLE t  ( 
 "KEY1" VARCHAR2(7 CHAR) NOT NULL ENABLE, 
 "KEY2" NUMBER(7,0) NOT NULL ENABLE, 
 "INFO1" VARCHAR2(1 CHAR), 
 "INFO2" VARCHAR2(2 CHAR),
 CONSTRAINT "PK1" PRIMARY KEY ("KEY1", "KEY2") ENABLE
);

insert into t ( key1, key2 ) values (12345 ,1254);
insert into t ( key1, key2 ) values (564874,521);
insert into t ( key1, key2 ) values (6689  ,76758);
commit;

alter table t 
  add pk as ( key1 || key2 );
  
create index i 
  on t ( pk );
  
select * from t
where  pk = '564874521';

KEY1     KEY2   INFO1    INFO2    PK          
564874        521         564874521    
复制


注意: 搜索值是一个字符串。如果在这里使用数字,则数据库to_number() 是虚拟列。意味着它不会使用索引。

虽然这个要求在我看来很可疑。您可以轻松地以具有不同主键的行结束。但是相同的串联键:

insert into t ( key1, key2 ) values (56487,4521);

select * from t
where  pk = '564874521';

KEY1     KEY2     INFO1     INFO2     PK          
564874        521         564874521    
56487        4521         564874521  
复制


除非您还可以在连接字符串上添加唯一约束,否则此方法最终必将给您带来问题。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论