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

是否可以减少select请求SQL的输入输出,sql,oracle,Sql,Oracle,我有一张超过3000万条记录的桌子。这是生产台。我想运行一个select*where。。。。。但是我在i/O使用限制方面遇到了问题。我需要保持对I/O的限制,以保持数据库平稳运行。是否可以限制请求的磁盘使用率。是甲骨文 我想要一些大致如下的东西: 从表中选择*,其中。。。将磁盘使用限制为x您需要创建存储过程,然后如果需要执行select查询,它们将帮助您减少输入输出错误 使用[数据库名称] 去 将ANSI_空值设置为ON 去 在上设置带引号的\u标识符 去 创建过程[dbo].[TableNam

我有一张超过3000万条记录的桌子。这是生产台。我想运行一个select*where。。。。。但是我在i/O使用限制方面遇到了问题。我需要保持对I/O的限制,以保持数据库平稳运行。是否可以限制请求的磁盘使用率。是甲骨文

我想要一些大致如下的东西:
从表中选择*,其中。。。将磁盘使用限制为x

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

使用[数据库名称] 去

将ANSI_空值设置为ON 去 在上设置带引号的\u标识符 去 创建过程[dbo].[TableName] 作为 开始 从表中选择*,其中
end

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

从SQL语言参考的章节中:

逻辑_每次调用读取_

指定为处理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;
现在,创建一个具有该配置文件并能够从这些表中进行选择的用户:

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量

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


在实现它之前,您应该在您的环境中彻底测试它。它可能永远不会非常精确,但可能足以阻止一些荒谬的查询。

您需要报告您正在使用的实际数据库引擎。Oracle….10g或更高版本?数据库资源管理器在这里为您提供帮助。我想你不明白这里的问题是什么。
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>