oracle - 提高查询性能以在大表中的 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
但仍然表现不佳:\
解决方案
推荐阅读
- flutter - 在 _WidgetsAppState 中找不到路由 RouteSettings("/coursePage", {img: img3, title: Numbers}) 的生成器
- javascript - 当某些输入在父元素内时访问 nextSibling
- c - 允许一个进程在给定时间内停止另一个进程 c
- python - Python 前 5 个字母 getter
- arrays - 将整数添加到C中的动态数组,内存问题
- java - 按某些属性对对象数组进行排序,而不使用手动执行的集合
- assembly - 如何在 Rust 中跳转/调用任意内存
- openam - 启用 OAuth 身份验证时,OpenAm 不会创建用户
- mongodb - 简化 MongoDB 中的 graphLookup 输出
- stack - JSXGraph 0.99.7 曲线联合