好的习惯,需要不断的培养和强化,直到成为一种习惯,然后成为思想的一部分。
上班前或者下班后,有空我都要给我家小家伙读一读《三字经》或者《弟子规》,他可能并不懂这些文字的内容,但是我希望这些知识能够陪伴他长大,成为思想和行动的一部分。
我们设计系统架构、做数据库规划的时候,也有一些基本的原则。
不知道没有关系,多学习就知道了
不懂没有关系,多看几次就懂了
持之以恒就是人生。
数据库常用的好习惯记录下来,没事就翻翻。
设计表和索引等
1. 选择合适的小字段,可以减少数据库行数据的大小,并提高索引匹配的效率,进而提升数据库性能。如日期采用date代替datetime、类型或标记使用tinyint代替smallint和int、使用定长字段代替非定长字段(如char代替varchar2),都能或多或少减少数据行大小,提高数据库缓冲池的命中率;
2. 主键,其选型更会对表索引的稳定和效率带来很大的影响,一般建议考虑数据库自增或自主维护的唯一数值。
3. 适当的冗余一些数据,这样在设计表的时候虽然不舒服,但是可以提高很多性能;
4. 如果业务内容比较多,不要把所有字段都放到一个表中,这样表空间会很大,查询速度会很慢,要明确“哪些字段常用,哪些字段不常用”,尽量把不常用的字段放在附表里面,与主表一对一关联。
5. 在高分离度字段创建索引,比如用户表中的电话号码字段,索引的效率会非常高;
6. 类型,状态等内容基本变化不多的字段,原则上用位图索引比普通索引有效些,但是创建使用位图索引,必须要验证效率是否得到提升;
7. 不要太依赖于建索引,一般而言,创建索引会提升相应的查询速度,但是索引太多,会影响输入的写入。
使用表的一些习惯
1. 正如我们编写JAVA程序,可以多利用Apache Commons工具包一样,多利用Oracle自带的内部函数不仅可以提升开发效率,也能提高Sql语句执行效率;
2. 尽量把sql语句写成 dm=? ,然后再赋值,而不是直接dm=9,这样oracle每次执行都要编译这条语句,而前面的那种方法,oracle只编译一次。
3. Exists比in 的效率大多数时候都会高,具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。
3.
4. Not in最好在代码中不要出现,效率不高,如果一定要用,可以用 minus 或则not exists代替。
4.
5. where条件中,尽量不要用to_char,to_date,upper等方法进行格式转换。转换和计算操作尽量放=右边,如果在左边进行了转换,那么会进行全表扫描;如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。
6. 不要把很复杂的逻辑用一条语句来实现,如果这种复杂的语句执行效果不理想,可以尝试把它拆开成简单的语句,看看效率是否提升。
7. 尽量不要用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替。例如:a<>0改为 a>0 or a<0,a<>’’ 改为 a>’ ’,用“>=”替代“>”。
8. Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOTNULL。这样就可以用其他操作来取代判断NULL的操作。
8.
9. 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用,因此一般不要作为第一个字符出现。或者尽可能不用这种方式;
10. 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。
10.
11. 对数据类型不同的列进行比较时,会使索引失效。
12. UNION操作符会对结果进行筛选,消除重复,数据量大的情况下可能会引起磁盘排序。如果不需要删除重复记录,应该使用UNION ALL。
12.
13. Oracle从下到上处理Where子句中多个查询条件,所以表连接语句应写在其他Where条件前,可以过滤掉最大数量记录的条件必须写在Where子句的末尾。Oracle从右到左处理From子句中的表名,所以在From子句中包含多个表的情况下,将记录最少的表放在最后。Oracle10g以及以上的版本,以及对这个问题就进行了优化,但是这个习惯还是不错的,值得保留。
14. OrderBy语句中的非索引列会降低性能,可以通过添加索引的方式处理。如果排序的数据量比较大,对性能的影响非常大,尽量避免使用。唯一性索引是一个比较好的折中方法;
原文地址:http://blog.csdn.net/ffm83/article/details/42454237