效能優化技巧 前半有序時的排序

2021-10-11 01:14:50 字數 2287 閱讀 8897

在對資料集進行排序運算時,有時會遇到這樣一種場景:資料集t已經按欄位a有序,而字段b無序,現在我們要將t按a、b排序,我們稱之為前半有序(a有序)的排序。此時我們能想到一種優化的排序方法:從t中先取出a值相同的一組記錄,再這一組內對b排序。然後再依次取出下一組a值相同的記錄,重複這個動作,直到完成t中所有記錄的排序。這種方法的好處是不需要對t中所有記錄進行大排序,一次只需取出一小組,對記憶體容量要求大大減低,只需能裝下每個小組即可。

遺憾的是sql並不支援這種優化演算法,只能所有記錄進行大排序,而spl提供了對這種演算法的支援,下面我們例項測試一下,並與oracle作對比。

測試機有兩個intel2670 cpu,主頻2.6g,共16核,記憶體64g,ssd固態硬碟。在此機上安裝虛擬機器來測試,設定虛擬機器為16核、8g記憶體。

在虛擬機器上建立資料表salesman1,共兩個字段:area(字串)、salesman(字串),生成資料記錄4億行,按area公升序排列,area不同值共2000個,每個area對應salesman為20萬個。將此表資料匯入oracle資料庫,同時用它生成集算器spl組表來進行測試。

再建另一張表salesman2作大資料量測試,資料表結構不變,總資料記錄20億行,area值4000個,每個area對應50萬個salesman。

測試任務都是要對錶按照area、salesman排序。

編寫測試sql如下:

select area, salesman from salesman1 order by area, salesman

本來只需這一句簡單的sql即可,不過這個排序結果的輸出時間卻非常長,為了減少輸出量,只統計排序過程的用時,我們不輸出排序後的全部結果,而只輸出中間位置的一行,也就是行號為2億的那一行,所以sql語句改寫如下:

select area, salesman from (

select area, salesman, rownum rn from (

select area, salesman from salesman1 order by area, salesman

) where rn=200000000;

要多說一句,這個查詢其實沒有什麼業務意義,純粹是為了迫使資料庫大排序且避免統計輸出時間的 。

編寫spl指令碼如下:

a

1=now()

2=file("/home/ctx/salesman1.ctx").create().cursor(area,salesman)

3=a2.group@qs(area;salesman)

4=a3.skip(199999999)

5=a3.fetch(1)

6=interval@s(a1,now())

group@qs中選項s表示對資料集只排序,不分組;選項q表示資料集對分號前的分組表示式(area)是有序的,請求使用前半有序時的排序方法按分號後的表示式(salesman)排序。

編寫測試sql如下:

select area, salesman from (

select area, salesman, rownum rn from (

select area, salesman from salesman2 order by area, salesman

) where rn=1000000000;

輸出行號為10億的一行。

編寫spl指令碼如下:

a

1=now()

2=file("/home/ctx/salesman2.ctx").create().cursor(area,salesman)

3=a2.group@qs(area;salesman)

4=a3.skip(999999999)

5=a3.fetch(1)

6=interval@s(a1,now())

測試結果如下,單位(秒):

資料量4億行

20億行

oracle

3262556

spl186

1266

從測試結果看,spl前半有序排序與oracle的大排序相比,資料量4億行時,執行時間只有60%,20億行時只有50%,可見效能提公升很多,資料量越大時效果越顯著。

PHP效能優化的技巧

關於require,include的效能 測試資料 有乙個陣列 一共3萬條資料,1mb大小,我分成2種方法放資料來測試 in 1.array.php 直接新建個空php檔案,把陣列放進去 2.array.txt 把陣列serialize後儲存 測試程式 複製內容到剪貼簿 1.在寫一些類或函式的時候,...

PHP效能優化的技巧

關於require,include的效能 測試資料 有乙個陣列 一共3萬條資料,1mb大小,我分成2種方法放資料來測試 in 1.array.php 直接新建個空php檔案,把陣列放進去 2.array.txt 把陣列serialize後儲存 測試程式 複製內容到剪貼簿 for i 0 i 100 ...

Web效能優化的常見技巧

保持連線,使其復用 後端優化sql語句的查詢速度,使其更快的返回給前端資料 一般由財務決定,涉及預算問題。後端開啟gzip 壓縮,瀏覽器會自動解壓縮 調整其載入順序,讓使用者先看到頁面,在實現其js的功能 先載入使用者看到的,在按需載入剩餘的。後端設定快取時間,可以使用hash值判定是否需要更新對應...