首页 > 解决方案 > 提高查询性能以在大表中的 clob 列中进行搜索

问题描述

我有一个包含许多列的大表(大约 460 万条记录),我连接了一些列并将其插入到 clob 列中(一列具有名称的别名,因此名称以不同的方式出现并插入到 clob 列中)以及带有 ctxsys.context 索引的那一列。

我搜索了一个包含模糊运算符的函数,为了提高性能,我添加了两列进行搜索,这些列带有位图索引,并使用DBMS_STATS.GATHER_TABLE_STATS()分析了表,我还将索引更改为与 4 度平行,并且将 SORT_AREA_SIZE 增加到 8300000。

我的问题是当我搜索它时需要 2 到 5 分钟才能执行。有什么方法可以提高性能并减少执行时间(另一种加快搜索速度的算法,或者我可以通过增加列并在多列中搜索来改变表的结构)。

这是我的查询:

SELECT first_name, 
       last_name, 
       countries, 
       category, 
       aliases 
FROM  (SELECT first_name, 
              last_name, 
              countries, 
              category, 
              aliases, 
              rr 
       FROM  (SELECT T.u_id, 
                     T.first_name, 
                     T.last_name, 
                     T.countries, 
                     T.category, 
                     T.aliases, 
                     ROWNUM rr, 
                     all_data 
              FROM   tbl_rsk_list_world T 
              WHERE  t.countries = 'SPAIN' 
                     AND category = 'Eng') 
       WHERE  Contains(all_data, 'fuzzy(JOSE,60,,weight)', 1) > 0) 
WHERE  rr BETWEEN 1 AND 500

执行计划是:

SQL> select * from TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2747287528
--------------------------------------------------------------------------------
| Id  | Operation              | Name               | Rows  | Bytes | Cost (%CPU
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                    | 20651 |   109M|  5724   (1
|*  1 |  VIEW                  |                    | 20651 |   109M|  5724   (1
|   2 |   COUNT                |                    |       |       |
|   3 |    PX COORDINATOR      |                    |       |       |
|   4 |     PX SEND QC (RANDOM)| :TQ10000           | 20651 |  4638K|  5724   (1
|   5 |      PX BLOCK ITERATOR |                    | 20651 |  4638K|  5724   (1
|*  6 |       TABLE ACCESS FULL| TBL_RSK_LIST_WORLD | 20651 |  4638K|  5724   (1
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("CTXSYS"."CONTAINS"("ALL_DATA",'fuzzy(jose,60,,weight)',1)>0 AND "
              AND "from$_subquery$_002"."RR">=1)
   6 - filter("COUNTRIES"='SPAIN' AND "CATEGORY"='Eng')

20 rows selected

 

当我使用 FIRST_ROWS 和 DOMAIN_INDEX_NO_SORT 提示执行计划是:

SQL> select * from TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1488722846
--------------------------------------------------------------------------------
| Id  | Operation                     | Name                   | Rows  | Bytes |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                        |    50 |   173K|
|*  1 |  VIEW                         |                        |    50 |   173K|
|   2 |   COUNT                       |                        |       |       |
|   3 |    TABLE ACCESS BY INDEX ROWID| TBL_RSK_LIST_WORLD     |    50 | 11500 |
|*  4 |     DOMAIN INDEX              | NDX_RSK_LIST_WORLD_CTX |       |       |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("CATEGORY"='Eng' AND "COUNTRIES"='SPAIN' AND
              "from$_subquery$_002"."RR"<=500 AND "from$_subquery$_002"."RR">=1)
   4 - access("CTXSYS"."CONTAINS"("W"."ALL_DATA",'fuzzy(jose,60,,weight)',1)>0)

18 rows selected

但仍然表现不佳:\

标签: oracleoracle10g

解决方案


推荐阅读