如何在类型对象上创建索引?
Posted
技术标签:
【中文标题】如何在类型对象上创建索引?【英文标题】:How to create index on type object? 【发布时间】:2013-03-01 10:00:03 【问题描述】:目前我正在使用 oracle 11g 中的类型对象。在这我有如下数据库对象:
表格
CREATE TABLE students
(rollno NUMBER(15) primary key, s_Name VARCHAR2(20), Marks type_1
);
类型对象规范是
CREATE OR REPLACE type type_1
AS
object
(
sub_1 NUMBER,
sub_2 NUMBER,
sub_3 NUMBER,
member FUNCTION total
RETURN NUMBER,
member FUNCTION e_result
RETURN VARCHAR2);
身体
CREATE OR REPLACE type body type_1
AS
member FUNCTION total
RETURN NUMBER
IS
BEGIN
RETURN (sub_1+sub_2+sub_3);
END;
member FUNCTION e_result
RETURN VARCHAR2
IS
DECLARE
temp NUMBER;
BEGIN
temp :=sub_1+sub_2+sub_3;
IF(temp>50) THEN
RETURN ('pass');
ELSE
RETURN ('fail');
END IF;
END;
END;
在创建所有这些东西之后,即使我已经使用
成功填充了学生表BEGIN
FOR i IN 1..800 LOOP
FOR j IN 1..400 LOOP
INSERT INTO students
VALUES (sequence1.NEXTVAL,
dbms_random.String('A', 5),
Type_1(Round(dbms_random.Value(10, 100)), Round(
dbms_random.Value(10, 100)), Round(dbms_random.Value(10, 100))));
END LOOP;
END LOOP;
dbms_output.Put_line('completed');
COMMIT;
END;
/
我需要在e_result
列上创建位图索引,在tot
列上创建普通索引。
我试过了
create index id1 on students(marks.total)
和
create bitmap index bid1 on students(marks.e-result)
但我不能。我该怎么办?
【问题讨论】:
只是好奇为什么要创建对象的嵌套表而不是简单地创建 MARKS 表并根据需要加入 STUDENTS?但也许这只是 pl/sql 中的一个练习? @ tbone:ya ya 正是...这只是类型对象的做法,伙计! 【参考方案1】:首先,您必须将您的函数声明为DETERMINISTIC
,以便它们在 SQL 索引中使用(即,您必须向 Oracle 断言,给定相同的输入,它们会给出相同的输出)。
例如:
SQL> CREATE OR REPLACE type type_1
2 AS
3 object
4 (
5 sub_1 NUMBER,
6 sub_2 NUMBER,
7 sub_3 NUMBER,
8 member FUNCTION total
9 RETURN NUMBER deterministic,
10 member FUNCTION e_result
11 RETURN VARCHAR2 deterministic
12 );
13 /
Type created.
SQL> CREATE OR REPLACE type body type_1
2 AS
3 member FUNCTION total
4 RETURN NUMBER deterministic
5 IS
6 BEGIN
7 RETURN (sub_1+sub_2+sub_3);
8 END;
9 member FUNCTION e_result
10 RETURN VARCHAR2 deterministic
11 IS
12 temp NUMBER;
13 BEGIN
14 temp :=sub_1+sub_2+sub_3;
15 IF(temp>50) THEN
16 RETURN ('pass');
17 ELSE
18 RETURN ('fail');
19 END IF;
20 END;
21 END;
22 /
其次你必须在调用函数时使用()
,否则它将假定它是一个名为total
的列:
SQL> create index id1 on students (marks.total());
Index created.
SQL> create bitmap index bid1 on students(marks.e_result());
Index created.
那么你应该看到使用的索引:
SQL> exec dbms_stats.gather_table_stats(user, 'STUDENTS', method_opt=>'for all indexed columns size skewonly')
PL/SQL procedure successfully completed.
SQL> explain plan for select * from students s where s.marks.e_result() = 'fail';
Explained.
SQL> @explain ""
Plan hash value: 1595221732
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 635 | 17780 | 109 (0)| 00:00:02 |
| 1 | TABLE ACCESS BY INDEX ROWID | STUDENTS | 635 | 17780 | 109 (0)| 00:00:02 |
| 2 | BITMAP CONVERSION TO ROWIDS| | | | | |
|* 3 | BITMAP INDEX SINGLE VALUE | BID1 | | | | |
-----------------------------------------------------------------------------------------
【讨论】:
:是不是像基于函数的索引? @ThiyaguATR 它们是函数索引(因为它们是在对象函数上创建的)。以上是关于如何在类型对象上创建索引?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB——索引类型之多键索引(Multikey Index)