行; 这听起来很直观,但最有效的方法是什么?你可能有如下选择:行,其中有50行你必须剔除行,其中有450行你必须剔除行中剔除50行听起来比从500行中剔除450行更高效,但是请记住:聚簇,或者说,数据的物理组织或分布,是关系重大的。页(译者注:“页”可理解为ORACLE的“块”)的数据,每页包含10行,你要的50行在其中的5页上;而另一个索引找出了5页,每页包含100行。访问10个页并剔除50行,或者访问5个页剔除450行,哪个方法好?访问更少数据页的方法可能更好。中的查询:所示的图像。一般要两三次尝试才能画出一幅清晰、整洁的图像,这不足为奇,特别是当你对别人的SQL进行反向工程的时候。我的第一幅草图总是会把所有的表挤在画面的一角。

行)还是行数稍微增加(选项4),诸如此类。但是,如果你把这些选项当作灵活而不是死板的教条,并且总是提前思考几个步骤,即使你错了也差不远。中所示的草图。

图2: 表被访问的顺序一旦我们决定这是查询的正确路径,我们就可以着手实施,可能是简单方便的重新排列一下表在查询中的顺序并且加上“强制顺序”的提示。(译者注:相当于ORACLE中的ORDERED提示,这仅仅在发现优化器生成的计划不够理想时使用)另一方面,如果这个查询至关重要,而且我们早在系统设计阶段就得以介入,那么我们可能需要考虑一下架构上的特点。选择索引我们可能会在customers表上建一个聚簇索引,但如果它是一个简单的堆表带一个非聚簇的主键索引(id),我们可以考虑把地点(location)列加入到索引中,所以我们不必再访问表来检查地点。这种安排,即一个小小的主键索引带附加列,比起在表的id列上建一个聚簇索引会给我们带来更多的缓存上的好处。(译者注:聚簇索引(clustered index)是SQL SERVER和SYBASE的概念,相当于ORACLE中的索引组织表(index organized table)和索引聚簇表(index clustered table), 带附加列(included column)的主键在oracle中不支持,ORACLE中必须另外建立一个 (id,location) 上的索引)或者,如果我们在orders表的(id_customer, date_placed)上建立一个索引,我们可以考虑从customers表开始我们的查询,因为这个新索引使得我们能够利用customers表中选择出来的客户非常精确地访问orders表:虽然这个索引可能比较大,对于这个查询而言几乎没有缓存上的好处。因此也许(date_placed, id_customer)会更好。理所当然的,这又把我们带回了聚簇这个话题。在orders表上有两个候选的聚簇索引:下单日期(date_placed)和客户id(id_customer)。如果要用的话,哪一个好?或者(悄悄说)我们应该只是建一个简单的堆表?当然,这个基础设计问题应该在系统设计阶段就很明确地提出来,并且取决于我们期望按照什么来访问表:根据客户,根据日期,或者两者的组合(如本例所示)。既然数据是按照日期顺序产生的,它自己很自然地就按日期来聚簇,哪怕我们只是用了一个简单的堆表,所以按下单日期(date_placed)的聚簇索引不会带来明显的好处。另一方面,假如我们在客户id建立一个聚簇索引,数据插入将会变得昂贵得多,并且,除非我们经常查询一个客户的完整历史,当我们运行基于单个客户的查询的时候,一个(id_customer, date_placed)上的非聚簇索引已经能给我们足够好的性能。最后要说的是,在一个生产系统上修改索引肯定会有风险,为了解决SQL的性能问题,我们希望通过对代码的处理,对统计信息的调整,或者使用提示来强制更优的执行计划。画图使得你更好地看清楚和理解可供选择的手段,也使得你在作一些困难决定时更加心里有底。结论为了写出高效的查询,你必须知道你需要获取多少数据,数据又在哪里。你还必须知道你有哪些手段可以获取这些数据,为了访问你不需要的数据必须浪费多少代价,这样你才能决定访问表的顺序。对于复杂的查询,最好的办法是从画图开始,包括所有相关的表,画出表间的连接,指出相关的数据量,描述出能让你从一张表到达另一张表的所有索引。这样的一张图会使你更易于理解你的查询所有可能的访问路径的效率。

设计高效SQL: 一种视觉的方法的更多相关文章

  1. 设计高效sql一般经验谈

      1不用在sql语句使用系统默认的保留关键字 2尽量用exists 和 not exists 代替 in 和 not in 这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ...

  2. 走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串

    原文:走向DBA[MSSQL篇] 针对大表 设计高效的存储过程[原理篇] 附最差性能sql语句进化过程客串 测试的结果在此处 本篇详解一下原理 设计背景 由于历史原因,线上库环境数据量及其庞大,很多千 ...

  3. SQL注入9种绕过WAF方法

    SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...

  4. iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比

    iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比   iphoneiPhoneIPhoneIPHONEIphone数据持久化 对比总结 本篇对IOS中常用的5种数据持久化方法进行简单 ...

  5. MySQL写出高效SQL

    mysql设计标准事务处理标准索引使用标准约束设计sql语句标准 怎么写出高效SQL清晰无误的了知业务需求满足业务需求,不做无用功知道表数据量和索引基本情况知道完成SQL需要扫描的数据量级SQL执行计 ...

  6. 防止SQL注入攻击的一些方法小结

    SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...

  7. .NET中资料库的设计与SQL

    .NET中资料库的设计与SQL ADO.NET设计 先来说说资料库的设计 主要涉及 关联式资料库 资料库系统管理(DBMS) 结构化查询(SQL) 预储程序 一个资料库包含一个以上的资料表,每个资料表 ...

  8. 编写高效SQL最佳实践

    编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...

  9. iOS中常用的四种数据持久化方法简介

    iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...

随机推荐

  1. AOJ.602 大家来找茬

    大家来找茬 Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 627 Submiss ...

  2. BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP

    这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...

  3. 使用google api material icons在网页中插入图标

    在<head></head>中加入这一句: <link rel='stylesheet' href='http://fonts.googleapis.com/icon?f ...

  4. jsonArray与jsonObject

    最近两个星期接触最多的就是json和map了. 之前用到的json,就是一个键对应一个值,超级简单的一对一关系.现在用到的json那可以层层嵌套啊,刚开始接触的时候,确实有种崩溃的赶脚,不想去理,取个 ...

  5. 对比append插入数据产生的redo量

    --版本信息 SELECT * FROM v$version; Oracle - Prod PL - Production CORE Production TNS - Production NLSRT ...

  6. C#中的弱引用(WeakReference)

    我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现.弱引用可 ...

  7. gdb 调试 ncurses 全过程:

    转载地址: http://blog.jobbole.com/107759/ gdb 调试 ncurses 全过程: 发现网上的“gdb 示例”只有命令而没有对应的输出,我有点不满意.gdb 是 GNU ...

  8. [NOIP 2015] 斗地主 landlord

    想起几个月之前的 noip2015-只会瞎搞-这道题骗了 30 分.T T 题目 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的 A 到 K 加上大小王的共 54 张牌 ...

  9. CSS变形

    css3 变形/变换 相关属性 transform transform-origin transform-style:flat/preserve-3d perspective: 长度单位 perspe ...

  10. Android之BInder分析

      MediaService的诞生: nt main(int argc, char** argv) { //FT,就这么简单?? //获得一个ProcessState实例 sp<ProcessS ...