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

Oracle 中午的Quries慢

askTom 2017-07-18
486

问题描述

美好的一天
请我需要认真的帮助,我有一张400万记录的表。这是我的查询select * 从表中,其中custname如rownum <40和 (“% WE %” 或custnumber如 “% WE %”)
即使我说custnumber,这些都是var2。
这在上午11点前的早晨运行良好,但是从那时到大约下午4点,系统需要时间来获取。看着服务器,CPU没有到达20% 同样的d ram。

专家解答

在您的查询中:
SELECT * 
FROM Customer 
WHERE Custname like ‘%WE%’;

您正在搜索字符串中间的一些字符。在这种情况下,Oracle无法使用索引,因此生成的执行计划将是全表扫描。

考虑到您描述的性能特征,您最喜欢在下午与系统上的其他查询争夺IO带宽。

假设您的搜索条件实际上是选择性的 (将返回表中400万记录的一小部分),并且CUSTNAME列上存在索引,则可以强制进行索引访问,这可能是有益的。

SELECT /*+ index (CUSTOMER CUSTNAME_IDX) */ * 
FROM Customer 
WHERE Custname like ‘%WE%’;


在早期的askTOM问题中可以看到一个有用的示例:
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1434815000346190059

另一种选择是创建上下文索引,这将允许您对大量数据进行更友好的IO全文搜索。

首先,您需要创建上下文索引。例如:
CREATE INDEX search_idx 
on Customers(custname) 
INDEXTYPE is CTXSYS.CONTEXT
/ 

要利用上下文索引,您需要将查询更改为:
SELECT * 
FROM Customer 
WHERE contains(Custname ‘WE’) > 0 
/ 


要了解更多信息,请参阅
https://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm-g1020588

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论