SQL優化 分析函式減少大表掃瞄次數

2021-09-27 03:18:07 字數 1233 閱讀 3809

我們看一下分析函式減少大表的掃瞄次數。

下面案例使用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 游標通常要優於其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的資料時。在結果集中包括 合計 的例程通常要比使用...