mysqlとoracleのページングの違いは何ですか?
2228 ワード
Java面接:mysqlとoracleのページングの違い
多くの人が日常の仕事の中でページングを使うと信じています.例えば、日常のクエリーのデータ量が大きすぎて、私たちはその中のいくつかだけが必要です.だから、この时、ページングを使ってクエリーに行きます.今日は主にmysqlとoracleのページングについて分析します. MySQLページング文簡単な書き方: Oracleページング文の簡単な書き方:
上のsqlから両者の書き方の違いがわかります.まずmysqlのページングはlimitで、oracleはrownumです.もちろん、私が書いたsqlはランダムにいくつかのデータを取り出す場合にしか満足できません.次に、今日の本題を始めます.どのように2つのデータベースのページングをしますか.まずmysqlの書き方 について説明します
LIMITは1つまたは2つの数値パラメータを受け入れることができる.パラメータは整数定数でなければなりません.2つのパラメータが与えられた場合、1番目のパラメータは1ではなく1番目のレコード行に戻るオフセット量を指定し、2番目のパラメータは1番目のレコード行に戻る最大数を指定します.
-例次にoracleのページ分けの書き方を見てみましょう:
-例
この3つの書き方を比較すると、ほとんどの場合、1つ目はデータが与えられた最初のデータを取得するだけで、2つ目のクエリーと3つ目のクエリーは1つのクエリー範囲を与えられ、3つ目のクエリーの効率は2つ目よりずっと高いです.
これは、CBO最適化モードでは、Oracleが外部のクエリー条件を内部階層クエリーにプッシュして、内部階層クエリーの実行効率を向上させることができるためです.3番目のクエリ文の場合、1番目の階層のクエリ条件WHERE ROWNUM<=100は、Oracleによって内部階層クエリにプッシュされます.これにより、Oracleクエリの結果がROWNUM制約条件を超えると、クエリが終了して結果が返されます.
一方、2番目のクエリ文は、クエリ条件BETWEEN 5 AND 20がクエリの2番目の階層に存在するため、Oracleは2番目の階層のクエリ条件を最内層にプッシュできません(最内層にプッシュしても意味がありません.最内層クエリはRNが何を表しているか分からないためです).したがって、2番目のクエリ文では、Oracleの最上位レベルが中間レベルに返されるのは、条件を満たすすべてのデータであり、中間レベルが最上位レベルに返されるのもすべてのデータです.データのフィルタリングは最外層で完了し、この効率は最初のクエリよりもはるかに低いことが明らかになりました.
上で分析したクエリーは、単一テーブルの単純なクエリーだけでなく、最内層クエリーが複雑なマルチテーブル連合クエリーまたは最内層クエリーにソートが含まれている場合と同様に有効です.
多くの人が日常の仕事の中でページングを使うと信じています.例えば、日常のクエリーのデータ量が大きすぎて、私たちはその中のいくつかだけが必要です.だから、この时、ページングを使ってクエリーに行きます.今日は主にmysqlとoracleのページングについて分析します.
select * from table limit m,n; // m = (startPage-1)*pageSize, n = pageSize
select * from table where rownum <= a;
上のsqlから両者の書き方の違いがわかります.まずmysqlのページングはlimitで、oracleはrownumです.もちろん、私が書いたsqlはランダムにいくつかのデータを取り出す場合にしか満足できません.次に、今日の本題を始めます.どのように2つのデータベースのページングをしますか.
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMITは1つまたは2つの数値パラメータを受け入れることができる.パラメータは整数定数でなければなりません.2つのパラメータが与えられた場合、1番目のパラメータは1ではなく1番目のレコード行に戻るオフセット量を指定し、2番目のパラメータは1番目のレコード行に戻る最大数を指定します.
-例
select * from book limit 2,5; // 5
select* from book limit 5; // 5
select * from book where rownum= count; //count
/*
* := ,> ,< ,>= ,<=
*/
-例
select * from book where rownum < 10;// 0-10 , 9
select * from (
select rownum rn,A.* from book A)
where rn>5 and rn<20; // 6-20 , 20
select * from (
select rownum rn , A.* from book A where rownum <100 )
where rn > 50; // 51-100 , 100
( : )
この3つの書き方を比較すると、ほとんどの場合、1つ目はデータが与えられた最初のデータを取得するだけで、2つ目のクエリーと3つ目のクエリーは1つのクエリー範囲を与えられ、3つ目のクエリーの効率は2つ目よりずっと高いです.
これは、CBO最適化モードでは、Oracleが外部のクエリー条件を内部階層クエリーにプッシュして、内部階層クエリーの実行効率を向上させることができるためです.3番目のクエリ文の場合、1番目の階層のクエリ条件WHERE ROWNUM<=100は、Oracleによって内部階層クエリにプッシュされます.これにより、Oracleクエリの結果がROWNUM制約条件を超えると、クエリが終了して結果が返されます.
一方、2番目のクエリ文は、クエリ条件BETWEEN 5 AND 20がクエリの2番目の階層に存在するため、Oracleは2番目の階層のクエリ条件を最内層にプッシュできません(最内層にプッシュしても意味がありません.最内層クエリはRNが何を表しているか分からないためです).したがって、2番目のクエリ文では、Oracleの最上位レベルが中間レベルに返されるのは、条件を満たすすべてのデータであり、中間レベルが最上位レベルに返されるのもすべてのデータです.データのフィルタリングは最外層で完了し、この効率は最初のクエリよりもはるかに低いことが明らかになりました.
上で分析したクエリーは、単一テーブルの単純なクエリーだけでなく、最内層クエリーが複雑なマルチテーブル連合クエリーまたは最内層クエリーにソートが含まれている場合と同様に有効です.