冗余就等于备份的意思 一块坏了会转到另一块上
RAID 5 (定义,优势,弱点,适用范围,使用技巧)
定义:
RAID5是在RAID 3的基础上进行了一些改进,同样也是由三块以上的硬盘组成,也是以数据的校验位来保证数据的安全,但它不是以特定硬盘来存放数据的校验位,而是将数据段的校验位交互存放于各个硬盘上。
优势:克服RAID3校验盘性能问题,有冗余,硬盘利用率高
如果数据盘(物理)损坏,只要将坏硬盘换掉,RAID控制系统则会根据校验盘的数据校验位在新盘中重建坏盘上的数据。利用单独的校验盘来保护数据虽然没有镜像的安全性高,但是硬盘利用率得到了很大的提高,为(N-1)/N 其中N为RAID中硬盘的个数。
弱点:读写性能差
当向RAID 5写入数据时,情况会变得复杂一些。即使我们只是向一个磁盘写入一个数据块,也必须计算与该数据块同处一个带区的所有数据块的校验值,并将新值重新写入到校验块中。由此我们可以看出,一个写入 *** 作事实上包含了数据读取(读取带区中的关联数据块),校验值计算,数据块写入和校验块写入四个过程。读写性能尤其是写性能大大降低。
适用范围:
• 文件和应用服务器
• 数据库服务器
• WEB,Email服务器
• 局域网服务器
• 使用范围较广
使用技巧:
RAID 5虽然具有容错能力,当一块硬盘出现故障时,RAID系统在降级模式下的运行情况。该磁盘上的所有数据块必须使用校验信息重新建立。此时如果我们是从好盘中读取数据块,不会有任何变化。但是如果我们所要读取的数据块正好位于已经损坏的磁盘,则必须同时读取同一带区中的所有其它数据块,并根据校验值重建丢失的数据,整个系统的性能会受到严重的影响。当我们更换了损坏的磁盘之后,系统必须一个数据块一个数据块的重建坏盘中的数据。整个过程包括读取带区,计算丢失的数据块和向新盘写入新的数据块,都是在后台自动进行。因此,如果有硬盘损坏必须及时更换,并且重建活动最好是在RAID系统空闲的时候进行。
,fread和fwrite用于读写各种类型的数据块
第一个参数是读写数据的内存区的指针, 第2个是每一项的大小,第3个是项数, 第4个是文件指针说简单点fwrite就是把结构体中的数据写入文件中,而fread就是从文件中把数据写入结构体中。
例如:结构体变量student
FILE file;
fwirte(&student,sizeof(student),1,file)
表示向file文件中写入student所指的结构体中的一项。
fread(&student,sizeof(student),1,file);
表示将file中的内容读入student中。
#include <stdioh>
int main(void)
{
FILE stream;
char msg[] = "this is a test";
char buf[20];
if ((stream = fopen("DUMMYFIL", "w+")) == NULL)
{
fprintf(stderr, "Cannot open output file\n");
return 1;
}
/ write some data to the file /
fwrite(msg, strlen(msg)+1, 1, stream);
/ seek to the beginning of the file /
fseek(stream, 0, SEEK_SET);
/ read the data and display it /
fread(buf, strlen(msg)+1, 1,stream);
printf("%s\n", buf);
fclose(stream);
return 0;
}
) 全表扫描(Full Table Scans FTS)
为实现全表扫描 Oracle读取表中所有的行 并检查每一行是否满足语句的WHERE限制条件一个多块读 *** 作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定) 而不是只读取一个数据块 这极大的减少了I/O总次数 提高了系统的吞吐量 所以利用多块读的方法可以十分高效地实现全表扫描 而且只有在全表扫描的情况下才能使用多块读 *** 作 在这种访问模式下 每个数据块只被读一次
使用FTS的前提条件 在较大的表上不建议使用全表扫描 除非取出数据的比较多 超过总量的 % % 或你想使用并行查询功能时
使用全表扫描的例子
SQL> explain plan for select from dual; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS FULL DUAL
) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)
行的ROWID指出了该行所在的数据文件 数据块以及行在该块中的位置 所以通过ROWID来存取数据可以快速定位到目标数据上 是Oracle存取单行数据的最快方法
这种存取方法不会用到多块读 *** 作 一次I/O只能读取一个数据块 我们会经常在执行计划中看到该存取方法 如通过索引查询数据
使用ROWID存取的方法
SQL> explain plan for select from dept where rowid = AAAAyGAADAAAAATAAF ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID DEPT [ANALYZED]
)索引扫描(Index Scan或index lookup)
我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值) 然后根据rowid直接从表中得到具体的数据 这种查找方式称为索引扫描或索引查找(index lookup) 一个rowid唯一的表示一行数据 该行对应的数据块是通过一次i/o得到的 在此情况下该次i/o只会读取一个数据库块
在索引中 除了存储每个索引的值外 索引还存储具有此值的行对应的ROWID值 索引扫描可以由 步组成 ( ) 扫描索引得到对应的rowid值 ( ) 通过找到的rowid从表中读出具体的数据 每步都是单独的一次I/O 但是对于索引 由于经常使用 绝大多数都已经CACHE到内存中 所以第 步的I/O经常是逻辑I/O 即数据可以从内存中得到 但是对于第 步来说 如果表比较大 则其数据不可能全在内存中 所以其I/O很有可能是物理I/O 这是一个机械 *** 作 相对逻辑I/O来说 是极其费时间的 所以如果多大表进行索引扫描 取出的数据如果大于总量的 % % 使用索引扫描会效率下降很多 如下列所示
SQL> explain plan for select empno ename from emp where empno= ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I
但是如果查询的数据能全在索引中找到 就可以避免进行第 步 *** 作 避免了不必要的I/O 此时即使通过索引扫描取出的数据比较多 效率还是很高的
SQL> explain plan for select empno from emp where empno= ; 只查询empno列值 Query Plan SELECT STATEMENT [CHOOSE] Cost= INDEX UNIQUE SCAN EMP_I
进一步讲 如果sql语句中对索引列进行排序 因为索引已经预先排序好了 所以在执行计划中不需要再对索引列进行排序
SQL> explain plan for select empno ename from emp where empno > order by empno; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX RANGE SCAN EMP_I [ANALYZED]
从这个例子中可以看到 因为索引是已经排序了的 所以将按照索引的顺序查询出符合条件的行 因此避免了进一步排序 *** 作
根据索引的类型与where限制条件的不同 有 种类型的索引扫描
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)
索引全扫描(index full scan)
索引快速扫描(index fast full scan)
( ) 索引唯一扫描(index unique scan)
通过唯一索引查找一个数值经常返回单个ROWID 如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话 Oracle经常实现唯一性扫描
使用唯一性约束的例子
SQL> explain plan for select empno ename from emp where empno= ; Query Plan SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I
( ) 索引范围扫描(index range scan)
使用一个索引存取多行数据 在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围 *** 作符(如> < <> >= <= beeen)
使用索引范围扫描的例子
SQL> explain plan for select empno ename from emp where empno > order by empno; Query Plan SELECT STATEMENT[CHOOSE] Cost= TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX RANGE SCAN EMP_I [ANALYZED]
在非唯一索引上 谓词col = 可能返回多行数据 所以在非唯一索引上都使用索引范围扫描
使用index rang scan的 种情况
(a) 在唯一索引列上使用了range *** 作符(> < <> >= <= beeen)
(b) 在组合索引上 只使用部分列进行查询 导致查询出多行
(c) 对非唯一索引列上进行的任何查询
( ) 索引全扫描(index full scan)
与全表扫描对应 也有相应的全索引扫描 而且此时查询出的数据都必须从索引中可以直接得到
全索引扫描的例子
An Index full scan will not perform single block i/o s and so it may prove to be inefficient e g Index BE_IX is a concatenated index on big_emp (empno ename) SQL> explain plan for select empno ename from big_emp order by empno ename; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FULL SCAN BE_IX [ANALYZED]
( ) 索引快速扫描(index fast full scan)
扫描索引中的所有的数据块 与 index full scan很类似 但是一个显著的区别就是它不对查询出的数据进行排序 即数据不是以排序顺序被返回 在这种存取方法中 可以使用多块读功能 也可以使用并行读入 以便获得最大吞吐量与缩短执行时间
索引快速扫描的例子
BE_IX索引是一个多列索引
big_emp (empno ename) SQL> explain plan for select empno ename from big_emp; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FAST FULL SCAN BE_IX [ANALYZED]
只选择多列索引的第 列
SQL> explain plan for select ename from big_emp; Query Plan SELECT STATEMENT[CHOOSE] Cost= INDEX FAST FULL SCAN BE_IX [ANALYZED]
lishixinzhi/Article/program/Oracle/201311/17452
1 SQL优化的原则是:将一次 *** 作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。 \r\n调整不良SQL通常可以从以下几点切入: \r\n 检查不良的SQL,考虑其写法是否还有可优化内容 \r\n 检查子查询 考虑SQL子查询是否可以用简单连接的方式进行重新书写 \r\n 检查优化索引的使用 \r\n 考虑数据库的优化器 \r\n\r\n2 避免出现SELECT FROM table 语句,要明确查出的字段。 \r\n\r\n3 在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。 \r\n\r\n4 查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。 \r\n\r\n5 在判断有无符合条件的记录时建议不要用SELECT COUNT ()和select top 1 语句。 \r\n\r\n6 使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。 \r\n\r\n7 应绝对避免在order by子句中使用表达式。 \r\n\r\n8 如果需要从关联表读数据,关联的表一般不要超过7个。 \r\n\r\n9 小心使用 IN 和 OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。 \r\n\r\n10 用 代替,>用>=代替,1000)。应该用如下语句代替:select name from customer inner join order on customercustomer_id=ordercustomer_id where ordermoney>100。 \r\n\r\n15 在WHERE 子句中,避免对列的四则运算,特别是where 条件的左边,严禁使用运算与函数对列进行处理。比如有些地方 substring 可以用like代替。 \r\n\r\n16 如果在语句中有not in(in) *** 作,应考虑用not exists(exists)来重写,最好的办法是使用外连接实现。 \r\n\r\n17 对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读 *** 作在前面完成,数据库写 *** 作在后面完成,避免交叉。 \r\n\r\n18 请小心不要对过多的列使用列函数和order by,group by等,谨慎使用disti软件开发t。 \r\n\r\n19 用union all 代替 union,数据库执行union *** 作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。 \r\n当已知的业务逻辑决定query A和query B中不会有重复记录时,应该用union all代替union,以提高查询效率。
以上就是关于有3块scsi硬盘做了RAID5,服务器是惠普G3的,SQL数据库在C盘全部的内容,包括:有3块scsi硬盘做了RAID5,服务器是惠普G3的,SQL数据库在C盘、visual c++里怎么用fwrite和fread才能对学生数据库(结构体)既能输入数据又能读取数据、浅谈存取Oracle当中扫描数据的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)