行; 这听起来很直观,但最有效的方法是什么?你可能有如下选择:行,其中有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. 工具——SVN常用命令

    SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码    把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...

  2. jsp电子商务 购物车实现之一 设计篇

    购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: 2.用session实现购物车: 3.用cookie和数据库(购物车信息持久化)实现购物车: ============= ...

  3. codeforces 110E Lucky Tree

    传送门:https://codeforces.com/contest/110/problem/E 题意:给你一颗树,节点与节点之间的边有一个边权,定义只由4和7组成的数字是幸运数字,现在要你求一共有多 ...

  4. 用DOM解析XML ,用xpath快速查询XML节点

    XPath是一种快速查询xml节点和属性的一种语言,Xpath和xml的关系就像是sql语句和数据库的关系.用sql语句可以从数据库中快速查询出东西同样的用xPath也可以快速的从xml中查询出东西. ...

  5. 自旋锁、排队自旋锁、MCS锁、CLH锁

    转载自:http://coderbee.net/index.php/concurrent/20131115/577 自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他 ...

  6. linux 学习好资源

    Linux-Wiki.cn http://linux-wiki.cn/wiki/zh-hans/Linux%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84    Linux目录 ...

  7. 正式进入搭建OpenStack

    部署mariadb数据库 控制节点: yum install mariadb mariadb-server python2-PyMySQL -y 编辑: /etc/my.cnf.d/openstack ...

  8. Idea IntelliJ远程调试教程

    总结 第一步:修改startup.sh 在倒第二行加上export JPDA_ADDRESS=8787 最后一行在start前面加上"   jpda   " 第二步:配置Idea, ...

  9. UOJ#80 二分图最大权匹配 [模板题]

    从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...

  10. 关于dlib人脸对比,人脸识别

    人脸检测 人脸特征点提取 人脸对比,等于两张人脸对比,识别 封装的所有识别函数,直接看下面调用就好了. # coding:utf-8 ''' 本本次封装,我主要是做两张人脸对比. 就只人脸识别部分,简 ...