问题描述
美好的一天
请我需要认真的帮助,我有一张400万记录的表。这是我的查询select * 从表中,其中custname如rownum <40和 (“% WE %” 或custnumber如 “% WE %”)
即使我说custnumber,这些都是var2。
这在上午11点前的早晨运行良好,但是从那时到大约下午4点,系统需要时间来获取。看着服务器,CPU没有到达20% 同样的d ram。
请我需要认真的帮助,我有一张400万记录的表。这是我的查询select * 从表中,其中custname如rownum <40和 (“% WE %” 或custnumber如 “% WE %”)
即使我说custnumber,这些都是var2。
这在上午11点前的早晨运行良好,但是从那时到大约下午4点,系统需要时间来获取。看着服务器,CPU没有到达20% 同样的d ram。
专家解答
在您的查询中:
您正在搜索字符串中间的一些字符。在这种情况下,Oracle无法使用索引,因此生成的执行计划将是全表扫描。
考虑到您描述的性能特征,您最喜欢在下午与系统上的其他查询争夺IO带宽。
假设您的搜索条件实际上是选择性的 (将返回表中400万记录的一小部分),并且CUSTNAME列上存在索引,则可以强制进行索引访问,这可能是有益的。
在早期的askTOM问题中可以看到一个有用的示例:
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1434815000346190059
另一种选择是创建上下文索引,这将允许您对大量数据进行更友好的IO全文搜索。
首先,您需要创建上下文索引。例如:
要利用上下文索引,您需要将查询更改为:
要了解更多信息,请参阅
https://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm-g1020588
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。