我的一个同事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. 你真的了解一段Java程序的生命史吗

    作为一名程序猿 ,我们每天都在写Code,但你真的了解它的生命周期么?今天就来简单聊下它的生命历程,说起一段Java Code,从出生到game over大体分这么几步:编译.类加载.运行.GC. 编 ...

  2. Linux优化之IO子系统监控与调优

    Linux优化之IO子系统 作为服务器主机来讲,最大的两个IO类型 : 1.磁盘IO 2.网络IO 这是我们调整最多的两个部分所在 磁盘IO是如何实现的 在内存调优中,一直在讲到为了加速性能,linu ...

  3. HDU 5441 Travel (并查集+数学+计数)

    题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...

  4. CodeForces 705C Thor (模拟+STL)

    题意:给定三个操作,1,是x应用产生一个通知,2,是把所有x的通知读完,3,是把前x个通知读完,问你每次操作后未读的通知. 析:这个题数据有点大,但可以用STL中的队列和set来模拟这个过程用q来标记 ...

  5. angular 管理后台

    http://blog.csdn.net/iamnieo/article/details/50474399

  6. C#学习笔记(八):扩展方法

    还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方 ...

  7. 自己学会汉化DevExpress控件[转]

    1. 文档导读 本文档以颜色区分内容的重要性和不同性,阅读本文档时请注意以下事项: 1. 红色部分表示需要注意的重点内容:(加粗的尤甚) 2. 蓝色部分表示相应于前版本新增的内容: 3. 紫色部分表示 ...

  8. SQLite本地事务处理

    private void toolStripButton1_Click(object sender, EventArgs e) { //判断新增的年度是否已经存在 if (HasYear()) { M ...

  9. java读取properties的工具类PropertiesUtil

    package org.properties.util; import java.io.FileInputStream; import java.io.FileOutputStream; import ...

  10. Jstl标签的使用

    一. 配置 JSTL 包括两个 JAR 文件, jstl.jar 和 standard.jar .是什么没有必要管,重在应用( 1+1 ? =2 ,我们没有必要深究,只需要知道这么用就行.). 原文引 ...