我有2張桌子。
create table person
(
ID integer,
a_number varchar(9),
first_name varchar(25),
last_name varchar(25),
etc ...
);
create table number_in_ranges
( range_id number(9,0) ,
begin_range number(9,0),
end_range number(9,0)
)
我需要檢索a_number特定范圍內的所有s。
我有以下查詢
select nums.range_id, count(p. a_number)
from number_in_ranges nums
left join person p on to_number(p. a_number)
between nums.begin_range and nums.end_range
group by nums.range_id;
但由于person表有大約 100 條記錄,這個查詢非常慢。
如何改進此查詢?
謝謝!
uj5u.com熱心網友回復:
如果每個范圍在person表中的相關行百分比較低(小于 5%,理想情況下小于 1%),則功能索引可以幫助提高查詢性能。直接索引a_number根本無濟于事。
最直接的解決方案是在轉換運算式上添加索引。例如:
create index ix1 on person (to_number(a_number));
現在,如果對于每個范圍,匹配行的百分比都高于 5%,那么這個索引可能不會有幫助。在這種情況下,仍然有希望合并 join,但那是一個不同的故事。
uj5u.com熱心網友回復:
雖然你可以在 range_id、a_number 等基礎列上有一個索引,但你可以在左連接中只從像下面這樣的人中選擇 a_number 列,以在一定程度上提高現有的性能
select nums.range_id, count(p. a_number)
from number_in_ranges nums
left join (Select distinct a_number from person) p on
to_number(p.
a_number)
between nums.begin_range and nums.end_range
group by nums.range_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361892.html
