使用oracle的olap函式優化分頁查詢

2021-05-23 02:34:51 字數 1512 閱讀 2634

周**走查時發現由於分頁功能需要根據總條數計算分頁數 ,而目前專案組內的普遍做法是進行兩次sql查詢,一次用count(*)獲得總條數,一次獲取真正的展現資料。其實我們可以使用oracle提供的olap函式對此進行優化,通過偽列:count(*) over()即可獲得當前sql的總條數。

比如selectt.*

,count(*

) over

() from

dual

會返回總條數為1。

olap函式主要用於統計分析,熟練掌握能很好的提高sql執行效率。

count(*) over() 具體功能描述如下:

對一組內發生的事情進行累積計數,如果指定*或一些非空常數,count將對所有行計數,如果指定乙個表示式,count返回表示式非空賦值的計數,當有相同值出現時,這些相等的值都會被納入被計算的值;可以使用distinct來記錄去掉一組中完全相同的資料後出現的行數。

sample:下面例子中計算每個員工在按薪水排序中當前行附近薪水在[n-50,n+150]之間的行數,n表示當前行的薪水

例如,philtanker的薪水2200,排在他之前的行中薪水大於等於2200-50的有1行,排在他之後的行中薪水小於等於2200+150的行沒有,所以count計數值cnt3為2(包括自己當前行);cnt2值相當於小於等於當前行的salary值的所有行數

sql如下:

select

last_name, salary, 

count(*

) over

() as

cnt1,

count(*

) over

(order

bysalary) 

ascnt2,

count(*

) over

(order

bysalary range 

between

50preceding 

and150

following) 

ascnt3 

from

employees;

結果如下 :

last_name

salary

cnt2

cnt2

cnt3

olson        

2100

1071

3markle

2200

1073

2philtanker

2200

1073

2landry

2400

1075

8gee

2400

1075

8colmenares

2500

10711

10patel

2500

1071010

使用oracle的olap函式優化分頁查詢

上週 走查時發現由於分頁功能需要提供總條數 專案組內的普遍做法是進行兩次sql查詢,一次用count 獲得總條數,一次獲取真正的展現資料。其實oracle提供了olap函式對此進行優化,可通過偽列 count over 獲得當前sql的總條數。比如 select t.count over from ...

OLAP中的排序函式

三種用於排序的專用的視窗函式 rank 在計算順序的時候,會跳過相同的位次。例如,存在三個重複值,最後會輸出1,1,1,4 dense rank 不會跳過相同的位次,允許重複值存在。1,1,1,2 row number 這個函式賦予唯一的連續位次。例如,有3條排在第1位時,排序為 1,2,3,4 視...

一 Oracle的OLTP和OLAP模式

oracle屬於傳統的關係型資料庫,在建庫應用時,大致可以分為oltp和olap兩種模式,針對這兩種不同模式,oracle都有的不同的技術應用和優化技巧。先簡單介紹這一下這兩種模式 olap on line analytical processing 聯機分析處理,用於做複雜的sql關聯和資料分析,...