如何在类型对象上创建索引?

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 它们是函数索引(因为它们是在对象函数上创建的)。

以上是关于如何在类型对象上创建索引?的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch基础知识以及创建索引

不同类型的 MongoDB 索引

MongoDB——索引类型之多键索引(Multikey Index)

MongoDB——索引类型之多键索引(Multikey Index)

MySQL索引类型

您如何计算在大型 Postgresql 表上创建索引的时间?