行; 这听起来很直观,但最有效的方法是什么?你可能有如下选择:行,其中有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. 【BZOJ 2756】[SCOI2012]奇怪的游戏 二分+最大流

    这道题提醒我,要有将棋盘黑白染色的意识,尤其是看到相邻格子这样的条件的时候,然后就是要用到与其有关的性质与特点以体现其作用,这道题就是用到了黑格子与白格子之间的关系进行的,其出发点是每次一定会给一个黑 ...

  2. 如何用PhotoShop制作网站的favicon.ico

    所谓favicon,即Favorites Icon的缩写,顾名思义,便是其可以让浏览器的收藏夹中除显示相应的标题外,还以图标的方式区别不同的网站.当然,这不仅仅是Favicon的全部,根据浏览器的不同 ...

  3. java 多线程 原子性

    原子性 原子性:原子操作是不能被线程调度机制中断的操作,一旦操作开始,那么它就一定可以在可能发生的“上下文切换”之前(切换到其他线程执行)执行完毕. 依赖原子性是很棘手且很危险的,除非你是并发专家,否 ...

  4. 移动端去掉a标签点击时出现的背景

    之前做移动端的Portal时,手机上测试,点击a标签总是出现一个背景框 在CSS中添加 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);就可以了 a:act ...

  5. php 计算两个日期的间隔天数

    使用php内部自带函数实现 1.使用DateTime::diff 实现计算 参考阅读>>PHP DateTime::diff() 上代码: <?php $start = " ...

  6. MySQL 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1

    (1)问题:     当使用 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'; 时会出现"......near 'identifie ...

  7. SpringBoot入门学习(一): Idea 创建 SpringBoot 的 HelloWorld

    创建项目: 项目结构: 程序启动入口: 正式开始: package com.example.demo; import org.springframework.boot.SpringApplicatio ...

  8. javascript提示抖动实现方法

    css代码: <style type="text/css"> #div1{ width:200px; height:200px; background-color:or ...

  9. 转:Linux 目录结构和常用命令

    转自:http://www.cnblogs.com/JCSU/articles/2770249.html仅为学习参考之用 一.Linux目录结构 你想知道为什么某些程序位于/bin下,或者/sbin, ...

  10. html5 游戏开发

    近来想做html5游戏开发些小东西玩一下,因为手边就是笔记本,想怎么玩就怎么玩了,今年可以说是非常重要特殊的一年,感觉有些倒霉,不过,心态最重要,该怎么做的时候就去怎么做吧,日子的24小时是不会变的, ...