初学者请指点!
1、数据库效率上,很多文章提到减少磁盘IO操作,这个磁盘IO操作能否解释一下,那些数据库操作会增加磁盘IO操作
2、在建外键的问题上,如果只是一个用户表userinfo(userid,name)中,userid是主键;另一个订单表order(orderid,userid,ordername)中,orderid是主键,把userid设置为外键,这样在对order表操作时候,插入一个userinfo不存在的userid的记录,是插入不成功对吧?如果做了级联插入,就是在order表中先成功插入一条记录,然后再userinfo表中,自动加一条记录?那userinfo的其他字段值怎么自动填入?

解决方案 »

  1.   

    1.LOG写入,对表的各种操作等的时候就有可能有磁盘IO。做全表扫描、大量DML等会增加IO2.插入不成功。只要userinfo表里没这个userid,只要不禁用约束,不管你如何操作,order表就不可能插入含有这个userid的值。
      

  2.   

    2.如果你要在order表中插入记录,就必须确保在user表中有这个user_id的记录,如果没有先在user表中添加这么一条记录。
      

  3.   

    写触发器自己添加user
    或者不要设置外键
    或者另外一个字段tempUserId,userid为null
      

  4.   

    一.
     数据库的IO能力,在很多时候会影响到查询的性能,尤其是FTS 的性能,所以对于oracle来说,这会影响到执行计划的选择。
    数据库中统计的 physical  reads和 IO 不是一个概念,数据库中物理读统计的是 blocks ,而操作系统中是 io requests ,
    一次 request 可能是 128k/256k/1024k 等等数据,当然也可能是几十k 或者更少的,取决于数据库的要求。 io request 次数,简单点说是 table blocks / DB_FILE_MULTIBLOCK_READ_COUNT。
    暂时我们不考虑File  system 中os  block不连续的问题(除非经历了大量小文件的创建和删除才可能造成大量os碎片)。数据库的IO的次数和性能,实际上相关因素包括:1: 不同 os + 硬件 ,每次IO 有一个极限值,比如hp unix 极限值 是 256k ,sun 的可能高达 1---8m ,
    若 DB_FILE_MULTIBLOCK_READ_COUNT* block_size > 这个极限值自然就被拆分为多于一个的 io request 2: 一次 io request 不能跨越 extent 边界,所以 extent 大小也影响 IO request 3:对于文件系统来说,连续的 block_id 并不意味着连续的 os block block,这会影响到读磁盘的效率。4:对于 disk array 等设备类说,对于做了 raid 的设备来说,对于很多存储设备来说 , IO 在从 os 抵达这里的时候又重新做了优化重整的 ,还存在cache的,这样代价就不好评估了二.
    外键是为保证数据的完整性而设,最直观的作用是防止非法数据录入,就是说录入外键数据时必须在它所属的主表中存在相应数据,如果录入空字符或其他数据会报错。
    数据库并不存在级联插入,你那样做只会报错.