我的一个同事Martin Masarik,SQLde的CEO,跟我谈起了他的一个DBA朋友,他管理着一个国际银行的Oracle数据库,数据规模约2TB。Martin Masarik曾问他:“什么样的SQL问题能让你气愤到竖起头发?”,他总结了以下几点,都是经验之谈:

一、不要在索引列上调用Function

这样做将会阻止数据库使用这个索引,这个问题甚至可以影响这个分区表,因为这样做的话将不会从指定的分区中读取数据,而是扫描整一个表空间。对于大数据量的数据表,这将是性能上的一场大灾难。

不要这样做:

WHERE
TIME_ID+14 > to_number(to_char(sysdate,'J'))

应该这样做:

WHERE
TIME_ID > to_number(to_char(sysdate-14,'J'))

二、使用Analyze对复杂SQL的优化

如果你不这样做,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会。假设你创建了一张拥有100万条记录的临时表,如果不对其进行分析,那么优化器将无法从现有的线索中获取表中真正的内容,于是它只能决定使用嵌套循环连接来一行行地扫描数据表,如果数据量不大,可能我们感觉不到性能的损失,但是随着数据集的增长,你的数据库性能会越来越差。

建议这样做:

ANALYZE TABLE <TABLE_NAME> COMPUTE STATISTICS

三、将复杂的SQL分成几步执行

把SQL想象成披萨,我想你应该不会一下子将整个披萨吞到嘴里嚼烂它吧。

对于创建一个复杂的SQL查询,我们最好将其分成3-4个步骤,SQL越简单,优化器的效果就越好,另外,对每一张数据表中的数据也越容易调试。

四、只有在必要的时候才使用Distinct

这是一个非常好的经验法则,Distinct经常被用在返回2条或2条以上重复记录的SQL查询中,使用Distinct,将会过滤掉重复的数据记录。但是使用Distinct的目的一定要明确,当你确定返回的记录一定是唯一的时候才能使用,比如用户id。滥用Distinct将会出现不可预知的错误,比如多表连接查询的情况。

五、合理创建索引

最后一点就是合理创建表索引,简单来说,假如有一张10万条记录的数据表,你可能经常会查询这样的信息:“我的某个客户信息在这张表中吗?”。如果使用了索引,那么检索这条客户信息将非常迅速,否则数据库优化器将会选择全表扫描,这在大数据量的情况下简直就是噩梦。

来自:码农网

链接:http://www.codeceo.com/article/5-sql-tips-dba-love-you.html

5个让DBA爱上你的SQL技巧的更多相关文章

  1. 一名小小的SQL Server DBA想谈一下SQL Server的能力

    一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...

  2. 人人都是 DBA(VIII)SQL Server 页存储结构

    当在 SQL Server 数据库中创建一张表时,会在多张系统基础表中插入所创建表的信息,用于管理该表.通过目录视图 sys.tables, sys.columns, sys.indexes 可以查看 ...

  3. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  4. 人人都是 DBA(V)SQL Server 数据库文件

    SQL Server 数据库安装后会包含 4 个默认系统数据库:master, model, msdb, tempdb. SELECT [name] ,database_id ,suser_sname ...

  5. 人人都是 DBA(IV)SQL Server 内存管理

    SQL Server 的内存管理是一个庞大的主题,涉及特别多的概念和技术,例如常见的 Plan Cache.Buffer Pool.Memory Clerks 等.本文仅是管中窥豹,描述常见的内存管理 ...

  6. 人人都是 DBA(III)SQL Server 调度器

    在 SQL Server 中,当数据库启动后,SQL Server 会为每个物理 CPU(包括 Physical CPU 和 Hyperthreaded)创建一个对应的任务调度器(Scheduler) ...

  7. 人人都是 DBA(II)SQL Server 元数据

    SQL Server 中维护了一组表用于存储 SQL Server 中所有的对象.数据类型.约束条件.配置选项.可用资源等信息,这些信息称为元数据信息(Metadata),而这些表称为系统基础表(Sy ...

  8. 人人都是 DBA(I)SQL Server 体系结构

    在了解 SQL Server 数据库时,可以先从数据库的体系结构来观察.SQL Server 的体系结构中包含 4 个主要组成部分: 协议层(Protocols) 关系引擎(Relational En ...

  9. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

    原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们 ...

随机推荐

  1. Android JNI之C/C++层调用JAVA

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930032.html 从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 ...

  2. 【转】Maven实战(二)---多模块开发---缺少Jar包

    原博文出于:http://blog.csdn.net/liutengteng130/article/details/41611755    感谢! Maven里面的Jar包经常出现Missing的情况 ...

  3. Hibernate的常用关键类以及接口介绍

    上一篇初步的对Hibernate进行了认识,并测试了Hibernate的HelloWorld, 这里主要介绍HibernateTest类中的相关类和接口,以及其作用和特性,关于Session中的相关方 ...

  4. HTML5新增的CSS类API

  5. mmap和普通文件读写的区别和比较 & mmap的注意点

    参考 http://www.cnblogs.com/huxiao-tee/p/4660352.html 对linux文件系统不了解的朋友,请参阅我之前写的博文<从内核文件系统看文件读写过程> ...

  6. Javascript继承实现

    S1:js中一切皆对象,想想如果要实现对父对象属性和方法的继承,最初我们会怎样子来实现呢,考虑到原型的概念,最初我是这样来实现继承的 function Parent(){ this.name='123 ...

  7. 如何给word 文章的每段段尾添加 脚注

    新建一个宏,其代码如下 Sub 段尾加脚注() ' ' 段尾加脚注 宏 ' 'ActiveDocument.Paragraphs.Count返回文档的段落数 ' 定义一个整形变量numpara,来存储 ...

  8. android中broadcastreceiver的用法-manifest中注册。

    package com.jinhoward.broadcast.activity; import com.jinhoward.broadcast.activity.R; import android. ...

  9. DevExpress - cxGrid 使用方法

    如何设置多选,并对多个选中行进行数据处理. 1.首先需要将需要获取的字段的列添加到 Grid 中,例如 grdDemoColumn1. 2.将 Grid 的 OptionsSelection 中的 C ...

  10. 单个SWF文件loading加载详解(转)

    通过带宽查看器,可以看到SWF中每帧所占带宽状况.另外,我们还可以在Flash发布设置中,选择生成体积报告. 勾选这一项之后,发布flash时,会自动在fla目录中生成一个名为”文件名 Report. ...