sql语句中常量处理——to_char and to_date 调优
tuning sql sql语句调优尽量避免在列上调用函数,如果不能避免则在常数上使用函数。下面这证明这一点; (一)SQL语句解释和执行时间比较测试语句A和语句B,功能是等价的,explain plan都走相同的索引,但是cost不一样。 A:这是一个标准的写法,建议都用这个,列"add_time"为date类型。 select count(*)from wiliam.tb_sale where add_time>=to_date('2011-01-11 00:00 ','yyyy-mm-dd hh24:mi:ss')and add_time<to_date('2011-01-12 00:00 ','yyyy-mm-dd hh24:mi:ss') B:在列上“add_time"使用"to_char"
驱动表和被驱动表
驱动表:要选择小的表作为驱动表大的表作为被驱动表"驱动表是在使用多表嵌套连接时,会先全表扫描该驱动表,然后驱动表返回的结果集中一行一行去匹配被驱动表(可以利用索引),所以我们会选择小表做为驱动表,而被驱动使用索引进行连接。对于基于规则的优化系统,驱动表在FROM后是有次序设置的,CBO而在基于成本的优化,ORACLE会选择最合适的驱动表。但是数据库有的时候不一定会选择较小的表作为驱动表,需要TUNING[@more@]
physical read and buffer read
1.物理读(physical read)当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子如果有新的数据需要被读入Buffer Cache中,而Buffer Cache又没有足够的空闲空间,Oracle就根据LRU算法将LRU链表中LRU端的数据置换出去。当这些数据被再次访问到时,需要重新从磁盘读入。逻辑读(buffer read)逻辑读指的就是从(或者视图从)Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为即时读(Current Read)和一致性读(Consistent Read)。注意:逻辑IO只有逻辑读,没有逻辑写
oracle 后台进程:7大进程总结(转载)
前面我们说过,Oracle的实例由内存结构和一组后台的进程组成。Oracle的后台进程比较重要的包括以下几个:·SMON·PMON·DBWR·LGWR·ARCH·CKPT下面我们将逐一介绍各个进程的作用。一、SMONSMON(System Monitor)-系统监控进程,在实例启动时执行实例恢复,并负责清理不再使用的临时段。SMON进程要完成所有“系统级”任务。PMON感兴趣的是单个的进程,而SMON与之不同,它以系统级为出发点,这是一种数据库“垃圾收集器”。SMON所做的工作包括: ·清理临时空间 ·合并空闲空间 ·针对原来不可用的文件恢复活动的事务 ·执行RAC中失败节点的
V$sqlarea 分析以及max(),min() 调优
V$sqlarea 分析(一)v$sqlarea作用和参数解析V$sqlarea用于分析SHARED_POOL中共享sql语句占用系统资源的情况几个重要参数buffer_gets,disk_reads,executions 三个最重要的参数l HASH_VALUE:SQL语句的Hash值。ADDRESS:SQL语句在SGA中的地址。这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。l SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。l SHARABLE_MEMORY:cursor使用的共享内存总数l SORTS表示排序的次数;
expain plan 不走索引的原因总结
4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ? A、不走索引大体有以下几个原因 ♀你在Instance级别所用的是all_rows的方式 ♀你的表的统计信息(最可能的原因) ♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 B、解决方法 ♀可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.补充:不走索引的原因,甚至加上 /*+index(table_name index_name)*/还不走索引,那可能是因为你要走索引的这列是nullable,虽然这列没有空值。
RBO AND CBO (二)
1、OPTIMIZER_MODE选项如下:* ALL_ROWS* FIRST_ROWS_n* FIRST_ROWS* CHOOSE* RULE1、CHOOSE仅在9i及之前版本中被支持,10g已经废除。8i及9i中为默认值。这个值表示SQL语句既可以使用RBO优化器也可以使用CBO优化器,而决定该SQL到底使用哪个优化器的唯一因素是,所访问的对象是否存在统计信息。如果所访问的全部对象都存在统计信息,则使用CBO优化器优化SQL;如果只有部分对象存在统计信息,也仍然使用CBO优化器优化SQL,优化器会为不存在统计信息对象依据一些内在信息(如分配给该对象的数据块)来生成统计信息,只是这样生成的统计信息可
RBO 和CBO分析
ORACLE 提供了CBO、RBO两种SQL优化器。Rule based optimizer(RBO) 基于规则Cost based optimizer (CBO) 基于成本,或者讲统计信息1:使用CBO 时,编写SQL语句时,不必考虑"FROM" 子句后面的表或视图的顺序和"WHERE" 子句后面的条件顺序;ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,函数索引,和并行查询等。2:使用CBO 时,要注意看采用了哪种类型的表连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。CBO有时会偏重于SMJ 和 HJ,但
insert /* APPEND */ into table_name用法
insert /* APPEND */ into emp中/* APPEND */Append 是将数据添加在table 后。不会替换掉里面相同的数据。也不会使用index ,对添加到里面的数据排序。 使用新块而不用已经已经使用的块 加快insert速度 ,使用hwk以上的块APPEND : Only valid for INSERT .. SELECT. Allows INSERT to work like direct load or to perform parallel insert.[@more@]
分析函数Ratio_to_report分解!
分析函数Ratio_to_report( ) over()使用说明表中需要计算单项占比:比如单项在部门占比多少,单项在公司占比多少。特别是在财务单项计算,部门个人薪水计算上。 Ratio_to_report() 括号中就是分子,over() 括号中就是分母,分母缺省就是整个占比。Ratio_to_report 一般结合partition by 使用。(一)举例子说明:表emp,dept,两表关联列为 deptnocreate,insert into 步骤省略。SQL> select * from emp; EMPNO DEPTNO SALARY--------------------------------------- ----------------------------
重复数据:选择,删除,保留
重复数据:选择,删除,保留min(rowid) max(rowid) 2010-12-30Database:oracle9i表:peng_tb_vip由于表数据太多,不便于选出来,故count;Select count(*) from peng_tb_vipSQL> Select count(*) from peng_tb_vip;COUNT(*)----------152(一):整个行数据重复如果整个表peng_tb_vip 行重复,则加distinct,,即可去掉重复的数据。Select distinct * from peng_tb_vip;(二)多个字段重复字段:corpid,cust_code;l 生成临时表CREATE TABLE PENG_TB_VIP2 AS SELECT * FROM PENG_TB_VIP;l
round (number) and round(date)
SQL> select add_time,round (add_time,'yyyy') aa from peng3 2 where rownum<=2;ADD_TIME AA----------- -----------2007-7-27 2 2008-1-12007-7-27 2 2008-1-1SQL> select add_time,round (add_time,'mm') aa from peng3 2 where rownum<=2;ADD_TIME AA----------- -----------2007-7-27 2 2007-8-12007-7-27 2 2007-8-1SQL> select add_time,round (add_time,'dd') aa from peng3 2 where rownum<=2;ADD_TIME AA----------- -----------2007-7-27 2 2007-7-282007-7-27 2 2007-7-28[@more@]
转载:limits.conf解释说明
linux /etc/security/limits.conf的相关说明linux limits.conf 配置 limits.conf 文件实际是 Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,而且只针对于单个会话。limits.conf的格式如下:username|@groupname type resource limitusername|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同
lock_sga and pre_page_sga设置
使Oracle的SGA常驻物理内存 Oracle中的lock_sga和pre_page_sga这两个静态初始化文件参数是用来指示SGA如何使用操作系统内存的。在Linux上启动Oracle数据库的时候,如果设置了lock_sga=true,那么就有可能碰到如下的报错信息: SQL> startup; ORA-27102: out of memory Linux-x86_64 Error: 12: Cannot allocate memory 这是因为Linux操作系统对应用程序使用内存有一些限制,在SHELL中使用ulimit命令可以查看到如下的信息: [oracle@dev111 ~]$ ulimit -a | grep memory max locked memory (kbytes, -l) 32 max memory size
smon 和pmon区分
System MonitorProcess Name: SMONMax Processes: 1This process is responsible for instance recovery, if necessary, at instance startup. SMON also cleans up temporary segments that are no longer in use. It also coalesces contiguous free extents in dictionary managed tablespaces that have PCTINCREASE set to a non-zero value. SMON wakes up about every 5 minutes to perform housekeeping activities. SMON must always be running for an instance.Process MonitorProcess Name: PMONMax Processes: 1This process
SYS/SYSTEM密码丢失、解决
SYS/SYSTEM密码丢失、解决说明:最近公司让我维护一台新的服务器这台服务器数据库是ORACLE 9I让我为难的是,公司之前的维护者尽然没有留下用户密码!我根本没有办法登录。我想采用默认登录修改密码,但是确显示 no privilegesconn /as sysdbano privileges编辑:sqlnet.ora SQLNET.AUTHENTICATION_SERVICES= (NTS)将NTS修改为NONE也报上面的错误。这个办法没有成功,至今还没有弄明白,如果那个高人能指导我,不胜感激!1:之前碰到类似的问题,我是这样修改的: sqlplus /nologconn /as sysdba;alter user system identified by 123;2:最
ALERT.LOG查找、编辑、CP、清空
ALERT.LOG查找、编辑、CP、清空我用的是公司的服务器,作如下示范:DBA每天首要工作是要查看ALERT.LOG,这里会涉及查找ALERT_SID.LOG的位置,以及如何查看ALERT_SID.LOG,如何备份,如何定期清空日志,熟悉看日志的DBA都知道日志会不断增长,如果不定期清空,如果报错很多,就会日志增长非常快,而且VI打开的时候,比较繁琐;1:查找ALERT.log的位置:ORACLE用户登录数据库[oracle@DELL /]$ iduid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)[oracle@DELL /]$ sqlplus /nologSQL*Plus: Release 9.2.0.6.0 - Production o
redo在线增加日志组合成员
数据在写入数据文件,即写入磁盘之前,都是脏数据,脏数据保存在缓存区里,即保存在内存里面,数据在写入磁盘前,也即保存在重做日志文件里面,所有日志文件的大小显得很重要!经常由于日志组不够大,日志组成员少,日志组少,所有日志全部写满了,都还来不及checkpoint,还没有来得及写入数据文件就会造成数据库严重堵塞,甚至down.数据----脏数据——buffer_cache-----DBWR------数据文件1:查看日志组合成员SQL> select * from v$logfile; GROUP# STATUS TYPE---------- -------------- --------------MEMBER
linux_不常用命令
查看系统语言环境[root@DELL root]# localeLANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=查看内存使用量和交换区使
AIX exp自动备份
OS:AIX $ oslevel4.3.2.0oracle:817非归档模式1:备份脚本hr1backup.sh$ cat hr1backup.shexport ORACLE_SID=hr1today=`date '+%y%m%d'`rm /databak/hr1$today.dmp.gzrm /databak/hr1$today.log/misfs/ora816/app/bin/exp system/1111@hr1 file=/databak/hr1$today.dmp log=/databak/hr1$today.log full=y buffer=64000 feedback=100000gzip /databak/hr1$today.dmp备份文件前,删除旧的备份,新的备份自动添加日期!2:crontab10 1 * * * /databak/hr1backup.sh每天凌晨1点10分,开始备份。[@more@]