2017-10-25 19 views
1

私は30M以上のレコードを持つテーブルを持っています。これは生産表です。私はselect *を実行したいのですが..... I/Oの使用制限に問題があります。私はデータベースをスムーズに動かすためにI/Oの制限を維持する必要があります。要求のディスク使用を制限することは可能ですか?それはオラクルです。選択要求のInput Ouputを減らすことは可能ですか?SQL

私はの線に沿って何かしたいと思います:あなたは店のプロシージャを作成する必要があり、必要に選択クエリ、彼らを実行するならば、RENのx

+0

使用している実際のデータベースエンジンを報告する必要があります。 – fredt

+0

オラクル...万が一10g以上?データベースリソースマネージャー私はここであなたを助けます。 https://docs.oracle.com/cd/B19306_01/server.102/b14231/dbrm.htm#i1010776 – Twelfth

答えて

0

を用いることができる表SELECT * FROM。 SQL言語リファレンスのCREATE PROFILE章から

LOGICAL_READS_PER_CALL

(、解析の実行、またはフェッチ)SQL文を処理するための呼び出しのために読み取られたデータ・ブロックの許容数を指定します。 。

クイックテストを作成するには、不当に低いサイズ制限を100MBに設定しましょう。標準ブロックサイズが8KBであると仮定すると、制限は100 * 1024 * 1024 /(8 * 1024)= 12800ブロックである必要があります。

create profile reduced_io limit logical_reads_per_call 12800; 

は今、いくつかの簡単な表を作成し、ステートメントが失敗したときに正確に確認するために、それらのすべてのデータを選択します。インデックスがない場合、これらのテーブルで select count(*)を実行すると、セグメント内のすべてのバイトを読み取る必要があります。

drop table test_40m; 
drop table test_60m; 
drop table test_80m; 
drop table test_120m; 

create table test_40m(a varchar2(1000)); 
create table test_60m(a varchar2(1000)); 
create table test_80m(a varchar2(1000)); 
create table test_120m(a varchar2(1000)); 

insert into test_40m select lpad('a', 1000, 'a') from dual connect by level <= 30 * 1024; 
insert into test_60m select lpad('a', 1000, 'a') from dual connect by level <= 50 * 1024; 
insert into test_80m select lpad('a', 1000, 'a') from dual connect by level <= 70 * 1024; 
insert into test_120m select lpad('a', 1000, 'a') from dual connect by level <= 100 * 1024; 
commit; 

上記の数字はおそらく奇妙に見えます。たとえば、50MBのデータを60MBの表に挿入します。これは、セグメント/ブロック/行オーバーヘッドや自動エクステントサイジングなどの場合、セグメントサイズを正しく取得するのが難しいためです。しかし、彼らはすぐに十分なテストを受けることができます。

select segment_name, bytes/1024/1024 mb from dba_segments where segment_name like 'TEST_%M'; 

SEGMENT_NAME MB 
------------ -- 
TEST_40M  35 
TEST_60M  59 
TEST_80M  88 
TEST_120M  120 

は今、そのプロファイルおよびそれらのテーブルから選択することで、ユーザを作成します。そのユーザーとの

drop user test_user; 
create user test_user identified by "test_user#1A" profile reduced_io; 
grant create session to test_user; 
grant select on test_60m to test_user; 
grant select on test_80m to test_user; 
grant select on test_120m to test_user; 

ログインし、テーブル内のすべてのデータを照会してみてください。小さなクエリは成功し、大きなクエリは失敗します。

sqlplus test_user/test_user#1A 

... 

SQL> select count(*) from jheller.test_40m; 

    COUNT(*) 
---------- 
    30720 

SQL> select count(*) from jheller.test_60m; 
select count(*) from jheller.test_60m 
* 
ERROR at line 1: 
ORA-02395: exceeded call limit on IO usage 


SQL> 

制限は例外をスローしますが、すぐに発生します。制限が100メガバイトの場合、60メガバイトのテーブルでは失敗しません。多くのプロファイル機能は正確ではなく、I/Oがどれだけ読み書きしているかを正確に測定することは困難です。

(正式には、リソースマネージャはこれらの種類をより詳細に制御できると考えられていますが、実際には使用されていませんでした。多くのリソースを誰に割り当てるか)。

これを実装する前に、環境内で完全にテストする必要があります。それはおそらく非常に正確なことはありませんが、ばかげた質問を止めるのに十分かもしれません。

-2

に 選択*テーブルから...リミットディスク使用量を無入力出力誤差を低減

使用[データベース名] procedを作成 GO ON GO のSET QUOTED_IDENTIFIER ON

のSET ANSI_NULLSをGOをお届けしますUREは[DBO]。[テーブル名] としてを開始プロファイルは、特定のSQLステートメントによって使用されるI/Oの量を制限する 端

+0

ここで質問している内容を理解していないと思わないでください。 – Twelfth

関連する問題