2016-12-23 77 views
0

我目前正在研究一個Web服務,它將從數據庫表中獲取數據並以XML格式將其發送給客戶端。數據庫中的表包含大量數據(數百萬行)。因此,分頁和壓縮算法已經實現,因此數據被壓縮並分成多個頁面。訂閱SQL查詢數據

我的問題是,如果我叫一些查詢說

select t.* 
from (select * 
     from table_name) t 
where rownum > start_val 
    and rownum <= end_val 

多次不排序,將行的數據和訂單獲取每次我都執行了相同的start_valend_val是同一時間(如果沒有數據庫中添加了新的值)?

編輯:如果沒有,那還有什麼可通過執行

select t.* 
from 
    (select * 
    from table_name 
    order by 1) t 
where 
    rownum > start_val and rownum <= end_val 

爲每個頁面可以更有效的方式從表作爲現在我獲取數據獲取分頁數據和查詢花費5- 6分鐘執行。

我對這些表具有隻讀訪問權限。

+8

沒有保證下,爲了不帶'爲了by' –

+4

此外,即使是爲了_were_保證(這不是),該如果在您的通話之間插入新記錄,訂單可能會發生變化。 –

+5

如果'start_val'大於1,[[rownum> start_val'將不匹配任何東西](http:// stackoverflow。COM /一個/266304分之32959569);所以你需要一個子查詢(內聯視圖),並且需要包括排序。 –

回答

0

我認爲如果你有隻讀訪問權限沒有辦法。你可以問parner(管理數據庫)有一些編輯該表,可以用戶物化視圖,oracle時間戳或添加id。

0

您的客戶可能無法瀏覽所有百萬條記錄,因此如果經常出現的情況是說比前100頁(假設每頁有10行) 您可能會優化它。

我想你的第一列(ORDER BY 1)是COL1

查找COL1一個值,如在表中都至少1000行與smaler值。 在我的情況下,它的價值是201110

select count(*) from myTab where col1 < 201110; 
COUNT(*) 
---------- 
     1000 

注意的是,1000行覆蓋了100頁每10行。 現在,您可以優化使用第100頁訪問下面的查詢:

SELECT 
    col1, col2, rownum rn 
FROM myTab 
where col1 < 201110 
order by id 
) 
select * from page 
where rn > 10 and rn <= 20 
; 

的關鍵部分是

FROM myTab 
where col1 < 201110 

即使存在col1沒有索引,你將被迫做FTS,你只需要排序1000條記錄,而不是全部百萬條記錄

請注意,排序是非常昂貴的全掃描,所以限制排序是關鍵。

而且從12c開始,你可以使用OFFSET子句分頁

SELECT 
    col1, col2 
FROM myTab 
where col1 < 201110 
order by col1 
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;