mysqlとOracleのページング方法の比較概要

5417 ワード

ページングは開発ではよくありますが、oracleとMySQLではページング方法が異なるので、ここに記録しておきます
mysql:
一:ページング要件:
クライアントはstart(ページ番号)、limit(ページごとに表示されるバー数)の2つのパラメータを渡してデータベーステーブルのデータをページングします.MySqlデータベースはページング関数limit m,nを提供していることを知っていますが、この関数の使い方は私たちのニーズとは異なります.そのため、実際の状況に応じて自分に合ったページング文を書き換える必要があります.具体的な分析は以下の通りです.
例:
第1条から第10条までのデータを照会するsqlは、select*from table limit 0,10である.->私たちのニーズに対応するのは、最初のページのデータをクエリーすることです:select*from table limit(1-1)*10,10;
10条から20条までのデータを照会するsqlは、select*from table limit 10,20である.->私たちのニーズに対応するのは、2ページ目のデータをクエリーすることです:select*from table limit(2-1)*10,10;
20条から30条までのデータを照会するsqlは、select*from table limit 20,30である.->私たちのニーズに対応するのは、3ページ目のデータをクエリーすることです:select*from table limit(3-1)*10,10;
二:上の分析を通じて、私たちのニーズに合ったページングsqlフォーマットは:select*from table limit(start-1)*limit、limit;ここでstartはページ番号であり、limitはページごとに表示されるバー数である.
Oracle:サブクエリー
Oracleページング・クエリー・ステートメントで最もよく使用されるステートメントの1つです.次に、Oracleページング・クエリー・ステートメントの使用方法について説明します.この点に興味があれば、見てみてください.
Oracleページング・クエリー・ステートメントは、基本的に本明細書で説明したフォーマットに従って使用できます.Oracleページング・クエリーのフォーマット:
SELECT * FROM  
(  
SELECT A.*, ROWNUM RN  
FROM (SELECT * FROM TABLE_NAME) A  
WHERE ROWNUM <= 40  
)  
WHERE RN >= 21  

 
その中でも最内層の照会SELECT*FROM TABLE_NAMEは、ページをめくらない元のクエリ文を表します.ROWNUM<=40およびRN>=21は、ページングクエリの各ページの範囲を制御する.
上記のOracleページング・クエリー・ステートメントは、ほとんどの場合、より効率的です.ページングの目的は、出力結果セットのサイズを制御し、結果をできるだけ早く返すことです.上記のページングクエリ文では,この考え方は主にWHERE ROWNUM<=40という文に現れる.
21~40番目のレコードを選択するには、上記の例で示したクエリの2番目のレイヤで最大値をROWNUM<=40で制御し、クエリの最外層で最小値を制御する2つの方法があります.もう1つの方法は、クエリの最外層でページングの最小値と最大値を制御する、クエリの第2層のWHERE ROWNUM<=40文を削除することである.クエリ文は次のとおりです.
SELECT * FROM  
(  
SELECT A.*, ROWNUM RN  
FROM (SELECT * FROM TABLE_NAME) A  
)  
WHERE RN BETWEEN 21 AND 40  

 
この2つの書き方を比較すると、ほとんどの場合、最初のクエリの効率は2番目よりずっと高いです.
これは、CBO最適化モードでは、Oracleが外部のクエリー条件を内部階層クエリーにプッシュして、内部階層クエリーの実行効率を向上させることができるためです.1番目のクエリ文の場合、2番目の階層のクエリ条件WHERE ROWNUM<=40は、Oracleによって内部階層クエリにプッシュされます.これにより、Oracleクエリの結果がROWNUM制約条件を超えると、クエリが終了して結果が返されます.
2番目のクエリ文は、クエリ条件BETWEEN 21 AND 40がクエリの3番目の階層に存在するため、Oracleは3番目の階層のクエリ条件を最内層にプッシュできません(最内層にプッシュしても意味がありません.最内層クエリはRNが何を表しているか分からないためです).したがって、2番目のクエリ文では、Oracleの最上位レベルが中間レベルに返されるのは、条件を満たすすべてのデータであり、中間レベルが最上位レベルに返されるのもすべてのデータです.データのフィルタリングは最外層で完了し、この効率は最初のクエリよりもはるかに低いことが明らかになりました.
上で分析したクエリーは、単一テーブルの単純なクエリーだけでなく、最内層クエリーが複雑なマルチテーブル連合クエリーまたは最内層クエリーにソートが含まれている場合と同様に有効です.
 
ページングの計算方法:
        //page   ,rows     
        int page=2;
        int rows=5;                            
        List list=a.select(page*rows+1,(page-1)*rows);
        //  sql  :  select * from(select a.*,rownum rn from (select * from t_articles) a where rownum < 11) where rn>5
      // , rownum<11, rn>5