我有一个从 SQL 执行时执行出色的查询。
它是表和查询之间的连接。这两个表都有近 400 万条记录。我试图提供提示的文档表上有位图索引。当我从蟾蜍看到时,解释计划确实表明他们正在帮助加入。
我提供了 2 个其他提示,看看它们是否有帮助。一种是直接路径 APPEND,另一种是利用 pda 上现有的 BTree 索引。
当对 SQL 中的替换变量运行此查询时,结果是即时的,但过程中的相同查询需要 8 秒或更长时间。
除了 DBA 尚未屈服的程序计划之外,如果有任何明显的遗漏,我可能会让您想到什么?提前致谢。
INSERT /*+ APPEND */
INTO tmp_search_gross_docs (document_id,
last_name,
first_name,
person_doc_association_id,
association_date)
SELECT /*+INDEX(pda IDX_DOC_PDOC_DOCID ) USE_NL(pda doc) */
pda.document_id,
last_name,
first_name,
person_doc_association_id,
association_date
FROM pda,
(SELECT /*+INDEX_COMBINE(attr IDX_BMP_SEARCH_FN,IDX_BMP_SEARCH_LN)*/
document_id, last_name, first_name
FROM doc attr
WHERE first_name LIKE l_first_name OR last_name LIKE l_last_name) doc
WHERE pda.document_id = doc.document_id;
) doc
WHERE pda.document_id = doc.document_id;
解释计划(来自 Toad 的绑定变量)
INSERT STATEMENT ALL_ROWSCost: 1,086,010 Bytes: 15,309,420 Cardinality: 364,510
11 LOAD AS SELECT TMP_SEARCH_GROSS_DOCS
10 TABLE ACCESS BY INDEX ROWID TABLE PDA Cost: 3 Bytes: 20 Cardinality: 1
9 NESTED LOOPS Cost: 1,086,010 Bytes: 15,309,420 Cardinality: 364,510
7 TABLE ACCESS BY INDEX ROWID TABLE ATTR 成本:23,893 字节:8,019,220 基数:364,510
6 位图转换为行 5 位图
或
2位图合并
1 位图索引范围扫描索引(位图) IDX_BMP_SEARCH_FN 4 位图合并
3 BITMAP INDEX RANGE SCAN INDEX (BITMAP) IDX_BMP_SEARCH_LN 8 INDEX RANGE SCAN INDEX IDX_PDA_EXP_DOC 成本:2 基数:1
基数 364,510 似乎关闭,因为该表包含 3738562 行,而对于 WHERE 中列的替换值,计数仅为 8892。
但同样,这个计划至少告诉我正在使用正确的索引,并且从 toad 编辑器运行得非常快。
PL/SQL 的实际计划仍然不可用。
不确定这是否会增加一些有价值的信息。但思想还是会编辑。谢谢