Oracle:在索引搜索上强制并行
Posted
技术标签:
【中文标题】Oracle:在索引搜索上强制并行【英文标题】:Oracle: forcing parallelism over index search 【发布时间】:2013-03-22 14:11:09 【问题描述】:我想在 LET_TESTATE_LETTURE 上使用并行执行而不强制全表扫描,我想对索引使用强制并行性。
我该如何解决?
alter session enable parallel dml;
CREATE TABLE netatemp.let_testate_letture1
AS
SELECT /* parallel(tele 32) full(tele) */
tele.TELE_DATA_LETTURA,
tele.tele_storico_id
FROM let_testate_letture tele
WHERE tele.prov_provenienza_lettura_id = '*1ENI01BCAMBIO'
AND tele.spwkf_stato_pubblico_id != '*1UNICOANN';
Size 56,1 GB
Number Extents 1.081
OWNER SIUMETERING
TABLE_NAME LET_TESTATE_LETTURE
TABLESPACE_NAME SIUMETERING_DATITD
CLUSTER_NAME
IOT_NAME
STATUS VALID
PCT_FREE 10
PCT_USED
INI_TRANS 30
MAX_TRANS 255
INITIAL_EXTENT 80 KB
NEXT_EXTENT 1 MB
MIN_EXTENTS 1
MAX_EXTENTS 2.147.483.645
PCT_INCREASE
FREELISTS
FREELIST_GROUPS
LOGGING YES
BACKED_UP N
NUM_ROWS 456.635.338
BLOCKS 3.340.120
EMPTY_BLOCKS 0
AVG_SPACE 0
CHAIN_CNT 0
AVG_ROW_LEN 385
AVG_SPACE_FREELIST_BLOCKS 0
NUM_FREELIST_BLOCKS 0
DEGREE 1
INSTANCES 1
CACHE N
TABLE_LOCK ENABLED
SAMPLE_SIZE 456.635.338
LAST_ANALYZED 29/12/2012 13:03:15
PARTITIONED NO
IOT_TYPE
TEMPORARY N
SECONDARY N
NESTED NO
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
ROW_MOVEMENT DISABLED
GLOBAL_STATS YES
USER_STATS NO
DURATION
SKIP_CORRUPT DISABLED
MONITORING YES
CLUSTER_OWNER
DEPENDENCIES DISABLED
COMPRESSION ENABLED
COMPRESS_FOR OLTP
DROPPED NO
READ_ONLY NO
SEGMENT_CREATED YES
RESULT_CACHE DEFAULT
【问题讨论】:
【参考方案1】:您必须将索引更改为并行。即
alter index xxx parallel;
或
alter index xxx parallel <n>;
因为并行提示仅适用于表。
【讨论】:
【参考方案2】:试试
/*+ parallel_index(tele, let_tele_letb_prov_fk_idx, 32) */
注意星号后面的“+”。没有它,Oracle 将忽略提示。
此外,您可能还希望根据返回的行数并行创建表,例如:
CREATE TABLE netatemp.let_testate_letture1 parallel 32 as
select /*+ ...
【讨论】:
【参考方案3】:您发布了很多有用的信息,令人耳目一新。所以除了回答你的问题,我可以提供 其他提高性能的建议:
-
语句级提示。
由于您使用的是 11gR2(基于
SEGMENT_CREATED
列的存在),您应该使用
statement-level parallel hint,而不是对象级别。使用/*+ parallel(32) */
,然后Oracle 将并行化查询中的所有内容,无论访问方法或别名如何。
旧统计数据还是旧数据?
最后分析于 2012 年 12 月 29 日似乎有点旧。如果您的表非常活跃,那么您应该重新收集统计信息。如果它真的不经常更改,您可能需要考虑重新创建它,按prov_provenienza_lettura_id
排序。这可能会显着提高索引的性能。虽然它可能会降低其他索引的性能。
压缩。
您的表使用压缩,但您的索引是否也被压缩?如果你真的有 900 万个相同值的条目,索引压缩可以节省大量空间,并使索引读取速度更快。此外,位图索引在这里可能很合适。
全表扫描。
优化器认为您将读取大约 2% 的行。甚至 2% 也可能足以保证进行全表扫描,具体取决于诸如集群因素之类的因素。您可能不想尝试强制使用特定的访问方法——首先让 Oracle 尝试选择。如果 Oracle 弄错了,那么您应该尝试通过提供更有用的信息来帮助它,例如更好的统计数据,也许还有直方图。
DazzaL 和 Ronnis 的建议也应该会有所帮助。
【讨论】:
非常感谢。请问如何强制 Oracle 计算直方图并更新统计信息? (11g) @Gik25:exec dbms_stats.gather_table_stats(<schema name?>, 'LET_TESTATE_LETTURE', method_opt => 'FOR ALL COLUMNS SIZE AUTO, FOR COLUMNS PROV_PROVENIENZA_LETTURA_ID SIZE 254');
虽然您可能想在没有method_opt
的情况下先尝试一下,但我不确定这是否一定会有所帮助。此外,由于此表非常大,您可能希望并行收集统计信息,您可以通过添加类似 degree => dbms_stats.auto_degree
的参数来做到这一点。以上是关于Oracle:在索引搜索上强制并行的主要内容,如果未能解决你的问题,请参考以下文章