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

2021-05-01 16:59:50 字數 1318 閱讀 6888

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

比如: select t.*,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 by salary) as cnt2,

count(*) over (order by salary range between 50 preceding and 150 following) as cnt3 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

10710

10

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

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

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關聯和資料分析,...