我們看一下分析函式減少大表的掃瞄次數。
下面案例使用oracle自帶示例資料,schema為sh。
首先,需求如下,我們要求產品id,時間id,產品銷售數量,以及到目前時間的累積銷售數量。
先來乙個效能較好的分析函式版本。
with tmp as
(select s.prod_id,
s.time_id,
s.quantity_sold,
sum(s.quantity_sold) over (partition by s.prod_id
order by s.time_id
rows between unbounded preceding and current row) as sum_quantity_sold
from sales s where rownum>0
group by s.prod_id,
s.time_id,
s.quantity_sold
order by s.prod_id,
s.time_id)
select * from tmp where rownum<100; --故意用rownum減少最後返回資料量。
這裡的主處理是with tmp裡面的sql,我們重點分析這條語句,通過執行計畫可以看出,表只被掃瞄一次。
explain plan for
with tmp as
(select s.prod_id,
s.time_id,
s.quantity_sold,
sum(s1.quantity_sold) as sum_quantity_sold
from sales s
inner join sales s1
on s.prod_id=s1.prod_id
and s.time_id<=s1.time_id
where rownum>0
group by s.prod_id,
s.time_id,
s.quantity_sold
order by s.prod_id,
s.time_id)
select * from tmp where rownum<100;
看這個版本,我們沒有用分析函式,用了自連線(還是非等自連線)。結果直接出不來了。
sql優化分析
sql 語句前加explain 分析sql掃瞄行數 table 顯示該語句涉及的表 type 這列很重要,顯示了連線使用了哪種類別,有無使用索引,反映語句的質量。possible keys 列指出mysql能使用哪個索引在該表中找到行 key 顯示mysql實際使用的鍵 索引 如果沒有選擇索引,鍵是...
避免全表掃瞄的sql優化
對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在where 及order by 涉及的列上建立索引 嘗試下面的技巧以避免優化器錯選了表掃瞄 使用analyze table tbl name為掃瞄的表更新關鍵字分布。對掃瞄的表使用force index告知mysql,相對於使用給定的索引表掃瞄將非常耗...
避免全表掃瞄的sql優化
26.使用基於游標的方法或臨時表方法之前,應先尋找基於集的解決方案來解決問題,基於集的方法通常更有效。27.與臨時表一樣,游標並不是不可使用。對小型資料集使用fast forward 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括 合計 的例程通常要比使用...