是否可以减少选择请求SQL的输入输出

时间:2017-10-25 18:59:41

标签: sql oracle

我有一张包含超过30M记录的表格。这是一张生产表。我想运行一个select * where .....但我的I / O使用限制有问题。我需要保持对I / O的限制,以保持数据库运行顺畅。是否可以限制请求的磁盘使用情况。这是甲骨文。

我希望有以下几点: 从表中选择*,将磁盘使用限制为x

2 个答案:

答案 0 :(得分:0)

配置文件可用于限制特定SQL语句使用的I / O量。

来自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

现在创建一个具有该配置文件的用户以及从这些表中选择SELECT的功能:

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兆字节的表上失败。很多配置文件功能都不准确,很难准确测量Oracle读写的I / O数量。

(官方资源经理应该允许对这些事情进行更多控制。但我从未见过它在实践中使用过。在现实世界中,没有多少人有时间或知识来准确定义究竟有多少资源应该分配给谁。)

在实施之前,您应该在您的环境中对此进行彻底测试。它可能永远不会高度准确,但它可能足以阻止一些荒谬的查询。

答案 1 :(得分:-2)

你需要创建存储过程然后如果需要执行select查询它们将帮助你没有减少输入输出错误

USE [Databasename] GO

SET ANSI_NULLS ON 走 SET QUOTED_IDENTIFIER ON 走 创建程序[dbo]。[TableName] 如 开始 从表格中选择* 端