bug*_*boo 2 sql database oracle
我对一个非常庞大的大型数据库进行了一系列查询,我在WHERE子句中有数十万个OR.优化此类SQL查询的最佳和最简单的方法是什么?我发现了一些关于创建临时表和使用连接的文章,但我不确定.我是严肃的SQL的新手,并且已经将结果从一个切入到下一个.
SELECT doc_id, language, author, title FROM doc_text WHERE language='fr' OR language='es'
SELECT doc_id, ref_id FROM doc_ref WHERE doc_id=1234567 OR doc_id=1234570 OR doc_id=1234572 OR doc_id=1234596 OR OR OR ...
SELECT ref_id, location_id FROM ref_master WHERE ref_id=098765 OR ref_id=987654 OR ref_id=876543 OR OR OR ...
SELECT location_id, location_display_name FROM location
SELECT doc_id, index_code, FROM doc_index WHERE doc_id=1234567 OR doc_id=1234570 OR doc_id=1234572 OR doc_id=1234596 OR OR OR x100,000
Run Code Online (Sandbox Code Playgroud)
这些未经优化的查询每个可能需要24小时.干杯.
我想我刚回答了自己的问题...... NESTED TABLES!
SELECT doc_text.doc_id, doc_text.language, doc_text.author, doc_text.title, doc_ref.ref_id, ref_master.location_id, location.location_display_name, doc_index.doc_id, doc_index.display_heading
FROM DOC_TEXT, DOC_REF, REF_MASTER, LOCATION, DOC_INDEX
WHERE
doc_text.language='fr' OR doc_text.language='es'
AND
doc_text.doc_id=doc_ref.doc_id
AND
doc_ref.doc_id=ref_master.ref_id
AND
ref_master.location_id=location.location_id
AND
doc_text.doc_id=doc_index.doc_id
Run Code Online (Sandbox Code Playgroud)
完成这项工作的最简单方法是:
language,ref_id,doc_id,等),至少仔细检查它们的存在.如果它们是表的主索引,则使它们成群集.所以...
SELECT doc_id, language, author, title
FROM doc_text
WHERE language='fr' OR language='es'
Run Code Online (Sandbox Code Playgroud)
变
INSERT language_search (language) VALUES ('fr')
INSERT language_search (language) VALUES ('es')
/* and 50 more */
SELECT dt.doc_id, dt.language, dt.author, dt.title
FROM doc_text dt
INNER JOIN language_search ls ON dt.language = ls.language
Run Code Online (Sandbox Code Playgroud)