六、数据库评审规范
规范1: 脚本目录应小写,命名如:工程组件目录/工程简称+”_”+模块简称+”_”+sql
例如:BROP-UOP1.0.0/brop_uop_sql/
规范2: 脚本文件应小写,命名如:
序号_数据用户名_操作类型_操作类别_操作方式_对象名_UM帐号.sql
操作类型:ddl,dml
操作类别:tab,syn,grt,create,insert,alter
例如:001_tppdata_ddl_create_brop_tpp_bank_info_wanghuajie949.sql
规范3: SQL脚本的编码格式,要统一使用UTF-8 WITHOUT BOM 格式,否则会在文件头部增加BOM CODE产生乱码,影响脚本执行
序号 | 规则 | 说明 |
1 | 表和字段必须有comment中文注释 | |
COMMENT ON TABLE BCESDATA.IBP_BIND_ACCOUNT IS '一类户绑卡关系表'; COMMENT ON COLUMN BCESDATA.IBP_BIND_ACCOUNT.ID IS '主键ID'; | ||
2 | 创建或删除table时必须带上属主的名字 | |
CREATE TABLE BCESDATA.IBP_BIND_ACCOUNT DROP TABLE BCESDATA.IBP_BIND_ACCOUNT | ||
3 | 创建或删除索引时必须带上属主的名字 | |
create INDEX BCESDATA.IDX_IBP_BIND_ACCOUNT_CARD_NO drop INDEX BCESDATA.IDX_IBP_BIND_ACCOUNT_CARD_NO | ||
4 | 对于9i库新建表必须加上monitoring参数,10g与11g忽略 | |
CREATE TABLE OWNER.TABLE_NAME(COL NUMBER) MONITORING; | ||
5 | 建表语句必须显式指定INITRANS 6 | |
CREATE TABLE BCESDATA.IBP_BIND_ACCOUNT(...) INITRANS 6; | ||
6 | 创建索引(全局临时表创建索引排除)必须加上初始化事务槽,并设置为16。 | |
CREATE INDEX OWNER.IDX_NAME ON OWNER.TABLE(ID) INITRANS 16; | ||
7 | 所有可以被引用的对象都应该建同义词 | |
CREATE PUBLIC SYNONYM XXX FOR BCESDATA.XXX; | ||
8 | 创建同义词时禁止使用OR REPLACE关键字 | |
CREATE OR REPLACE PUBLIC SYNONYM ... | ||
9 | 创建主键时必须先创建索引,再创建主键 | |
CREATE UNIQUE INDEX BCESDATA.IDX_IBP_BIND_ID ON BCESDATA.IBP_BIND_ACCOUNT (ID) INITRANS 16; ALTER TABLE BCESDATA.IBP_BIND_ACCOUNT ADD CONSTRAINT PK_IDX_IBP_BIND_ID PRIMARY KEY (ID) USING INDEX BCESDATA.IDX_IBP_BIND_ID; | ||
10 | 唯一键的创建方式,与主键相同,即先建索引 | |
CREATE UNIQUE INDEX BCESDATA.IDX_IBP_BIND_ID2 ON BCESDATA.IBP_BIND_ACCOUNT_TAB (ID2) INITRANS 16; ALTER TABLE BCESDATA.IBP_BIND_ACCOUNT_TAB ADD CONSTRAINT UK_IDX_IBP_BIND_ID2 UNIQUE (ID2) USING INDEX BCESDATA.IDX_IBP_BIND_ID2; | ||
11 | Date 类型的字段, 需要以”DATE_”做为前缀。 Boolean类型的字段,需要以”IS_”作为前缀。 | |
12 | 主键字段的命名不能包含任何业务含义。命名规则为:”ID_”+表名 | |
13 | 要求所有的sequence都使用cache选项,cache值最低为40。 | |
CREATE SEQUENCE BCESDATA.SEQ_CHANNEL_ORDER_NO INCREMENT BY 1 START WITH 100000000000001 NOMAXVALUE NOCYCLE CACHE 100 | ||
14 | 创建sequence时,必须指定minvalue、maxvalue、start with、increment by、cache的值。 | |
CREATE SEQUENCE BCESDATA.SEQ_CHANNEL_ORDER_NO INCREMENT BY 1 START WITH 100000000000001 NOMAXVALUE NOCYCLE CACHE 100 NOORDER | ||
15 | 所有sequence使用noorder选项。 | |
16 | 创建或删除sequence时必须带上属主的名字 | |
CREATE SEQUENCE SECURITYDATA.SEQ_CHANNEL_ORDER_NO; DROP SEQUENCE SECURITYDATA.SEQ_CHANNEL_ORDER_NO; | ||
17 | 所有约束必须有约束名,非空约束除外: | |
主键约束:PK_ + 表名 外键约束: FK_ + 子表名_ + 子表字段名 唯一约束: UK_ + 表名_ + 字段名 值检查约束: CK_ + 表名_ + 字段名 |
序号 | 规则 | 说明 |
1 | ||
2 | ||
3 |
<h2 st
重点关注事件:
序号 | 事件名称 | 说明 | 举例 |
1 | Free buffer waits | ||
2 | Buffer busy waits | ||
3 | Read by other session | ||
4 | Log file parallel write | ||
5 | Log buffer space | ||
6 | Log file sync | ||
7 | Db file sequential read | ||
8 | Db file scattered read | ||
9 | Latch free | ||
10 | Log file switch | ||
11 | enqueue |
查询SQL:
ANALYZE TABLE SEC_USER_T COMPUTE STATISTICS; SELECT NUM_ROWS,CHAIN_CNT FROM DBA_TABLES T WHERE T.TABLE_NAME=’SEC_USER_T’; ANALYZE TABLE SEC_USER_T LIST CHAINED ROWS; SELECT OWNER_NAME,TABLE_NAME,HEAD_ROWID FROM CHAINED_ROWS WHERE TABLE_NAME=’SEC_USER_T’; |
查询SQL:
查询SQL:
SELECT T.SQL_ID,T.PARSING_SCHEMA_NAME,T.SQL_FULLTEXT,T.SQL_TEXT,TP.OBJECT_OWNER,TP.OBJECT_NAME,TP.PLAN_HASH_VALUE,T.EXECUTIONS,T.FIRST_LOAD_TIME,T.LAST_LOAD_TIME,T.LAST_ACTIVE_TIME, T.MODULE,T.ELAPSED_TIME,TP.FILTER_PREDICATES,INSTR(UPPER(T.SQL_FULLTEXT),'TO_NUMBER') AS POS FROM V$SQL T,V$SQL_PLAN TP WHERE T.SQL_ID=TP.SQL_ID AND (TP.FILTER_PREDICATES LIKE '%TO_NUMBER(%' OR TP.FILTER_PREDICATES LIKE '%TO_CHAR(%') AND T.PARSING_SCHEMA_NAME IN('TPPDATA','TPPOPR','TSPDATA',’POPDATA’,'TSPOPR','UOPDATA','UOPOPR',’POPOPR’) AND T.MODULE NOT IN('PL/SQL Developer','plsqldev.exe') AND T.LAST_ACTIVE_TIME>=SYSDATE-30; |
SELECT T.SQL_ID, T.SQL_TEXT, T.FORCE_MATCHING_SIGNATURE, T.EXACT_MATCHING_SIGNATURE FROM V$SQL T WHERE T.PARSING_SCHEMA_NAME IN ('TPPOPR', 'TSPOPR', 'UOPOPR', 'TPPDATA', 'TSPDATA', 'UOPDATA') AND UPPER(T.SQL_TEXT) NOT LIKE 'EXPLAIN%' --AND T.SQL_TEXT LIKE '%testaa where%' --AND T.FORCE_MATCHING_SIGNATURE<>T.EXACT_MATCHING_SIGNATURE AND T.MODULE NOT IN('plsqldev.exe','PL/SQL Developer') ORDER BY UPPER(T.SQL_TEXT) DESC |
SELECT 'TAB' COMTYPE,T.OWNER,T.TABLE_NAME,'',T.COMMENTS FROM DBA_TAB_COMMENTS T WHERE T.OWNER IN('TPPDATA','TSPDATA','UOPDATA','POPDATA') AND T.COMMENTS IS NULL UNION SELECT 'COL' COMTYPE,T.OWNER,T.TABLE_NAME,T.COLUMN_NAME,T.COMMENTS FROM DBA_COL_COMMENTS T WHERE T.OWNER IN('TPPDATA','TSPDATA','UOPDATA','POPDATA') AND T.COMMENTS IS NULL |