2009-08-11 9 views
0

特定の基準に従って500レコードをフェッチする以下のクエリがあります。多くの行(数百万)があるという事実。私はレコードの総数を取得したいので、「500行に表示....」と言うことができます。このクエリでこれを行うことはできますか?私はそれを行うために別のクエリを持っていますが、私は同じクエリでそれを行うことができますかと思っていた。制限付きセットを取得中にレコードの総数を取得する - Oracle

乾杯、

クエリタム

SELECT * FROM APPL_PERF_STATS 
WHERE (GENERIC_METHOD_NAME != 'NULL' AND CURRENT_APPL_ID != 'NULL' AND EVENT_NAME != 'NULL') 
AND ROWNUM < 500 
AND current_appl_id LIKE '%OrderingGUI%' 
AND event_name LIKE '%/ccui%' 
AND generic_method_name LIKE '%com.telus.customermgt.service.CustomerMgtSvc.getCustomer%' AND appl_perf_interval_typ_id = 1440 
AND cover_period_start_ts >= to_date('06-07-2008 11:53','dd-mm-yyyy HH24:mi') 
AND cover_period_start_ts <= to_date('11-08-2009 11:53','dd-mm-yyyy HH24:mi') 
ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS 
+0

あなたのクエリは奇妙です。なぜgeneric_method_name!= 'NULL'と... generic_method_nameのような条件を持っていますか? current_appl_idとevent_nameで同じです。 また、このrownumとorderの組み合わせは、他のフィルタリング基準を満たす「ランダムな」499レコードを選択してから順序付けを行います。私は、すべてのレコードから最初の499レコード(指定された基準に従って)を望んでいたと思います... –

答えて

5

、私は一般的に(500を言うので、501を引く)私は表示することが喜んでより1以上を選択して、私はこの金額に達した場合、その後伝える:ROWNUMは、最初に適用されます「500以上のレコードが返されました」というユーザーがクエリを絞り込む機能を提供します。最初にクエリのカウントを実行して上位n行を返すことができますが、それはサーバーへの別のトリップを必要とし、クエリの複雑さとデータ量によっては時間がかかることがあります。

もう1つの方法は、このクエリを実行する直前に集計できる統計テーブルの数を追加することです。理論では、統計表はプライマリ表よりもはるかに少ないデータを保持するため、サーバーによって迅速にマッシュさせることができます。プロセスを作成する場合(ストアドプロシージャが最適)、これらを更新して結果を返します。

あなたのアプリケーションやユーザーについてはわかりません。しかし、私は一般的にレコードの総量を気にしないか、レコードの合計量だけを必要とし、詳細を望まない。

0

実際には、私はそれがほとんどない有用なデータを有することがわかってきた - と高価。特にテーブルに書き込まれている場合、あなたの総数は絶えず変化しており、そのためにかなり信頼できない数字が表示されます。

2

ORDER BYとROWNUMは、あなたが彼らがやりとりすると思うやり方で対話しません。私はこのような問題を与えていたときに

実際に
SQL> select ename from emp 
    2 where rownum < 5 
    3 order by ename 
    4/

ENAME 
---------- 
CLARKE 
PADFIELD 
ROBERTSON 
VAN WIJK 

SQL> select * from (
    2  select ename from emp 
    3  order by ename 
    4 ) 
    5 where rownum < 5 
    6/

ENAME 
---------- 
BILLINGTON 
BOEHMER 
CAVE 
CLARKE 

SQL> 
2

ページ1 of 100を表示する願望は、Googleに対する過度の暴露によるものです。 Googleの他の分野と同様に、エンタープライズITとは無関係です。 Googleは推測しますが、推測をかなり正確にするためのアーキテクチャを備えています。

すぐに使用できるRDBMSを使用している場合、これはセットアップには当てはまりません。 2つのクエリを実行することで、難しい方法で行う必要があります.1つはカウントを取得し、もう1つは行を取得します。クエリの索引付けがうまくいけば、最初のカウントを行うのはあまり高価ではないかもしれませんが、依然として2つのクエリです。例えば

:あなたはサブで注文クエリを埋め込む必要があります(APCが述べたように)ことを

select 
     count(*) over (partition by null) total_num_items, 
     p.* 
    from 
     APPL_PERF_STATS p 
    where 
     ... 

注意

オラクルで
4

は、少なくともあなたは、この使用して分析関数を行うことができますROWNUMを使用して出力をn行に制限する前に照会してください。

これは、返された結果セットの総行数を取得する方法ですが、バックグラウンドでは、すべての行がカウントされます。したがって、「数百万の行」があると、パフォーマンスが低下します。パフォーマンスのヒットが高すぎる場合、私が使用するアプローチは、合計行数を別々のバッチ・ジョブとしてあらかじめ集計することです。このような場合は、マテリアライズド・ビューが役立つことがあります。

2
SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type 
    FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS, 
       ROW_NUMBER() OVER (ORDER BY 1) AS rn, uo.* 
      FROM all_objects uo 
     WHERE owner = 'CSEIS') x 
WHERE rn BETWEEN 6 AND 10 

RN TOTAL_ROWS OWNER OBJECT_NAME  OBJECT_TYPE 
6 1262  CSEIS CG$BDS_MODIFICATION_TYPES  TRIGGER 
7 1262  CSEIS CG$AUS_MODIFICATION_TYPES  TRIGGER 
8 1262  CSEIS CG$BDR_MODIFICATION_TYPES  TRIGGER 
9 1262  CSEIS CG$ADS_MODIFICATION_TYPES  TRIGGER 
10 1262  CSEIS CG$BIS_LANGUAGES    TRIGGER 
関連する問題