设计高效SQL: 一种视觉的方法
行; 这听起来很直观,但最有效的方法是什么?你可能有如下选择:行,其中有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: 一种视觉的方法的更多相关文章
- 设计高效sql一般经验谈
1不用在sql语句使用系统默认的保留关键字 2尽量用exists 和 not exists 代替 in 和 not in 这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ...
- 走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串
原文:走向DBA[MSSQL篇] 针对大表 设计高效的存储过程[原理篇] 附最差性能sql语句进化过程客串 测试的结果在此处 本篇详解一下原理 设计背景 由于历史原因,线上库环境数据量及其庞大,很多千 ...
- SQL注入9种绕过WAF方法
SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...
- iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比
iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比 iphoneiPhoneIPhoneIPHONEIphone数据持久化 对比总结 本篇对IOS中常用的5种数据持久化方法进行简单 ...
- MySQL写出高效SQL
mysql设计标准事务处理标准索引使用标准约束设计sql语句标准 怎么写出高效SQL清晰无误的了知业务需求满足业务需求,不做无用功知道表数据量和索引基本情况知道完成SQL需要扫描的数据量级SQL执行计 ...
- 防止SQL注入攻击的一些方法小结
SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := &quo ...
- .NET中资料库的设计与SQL
.NET中资料库的设计与SQL ADO.NET设计 先来说说资料库的设计 主要涉及 关联式资料库 资料库系统管理(DBMS) 结构化查询(SQL) 预储程序 一个资料库包含一个以上的资料表,每个资料表 ...
- 编写高效SQL最佳实践
编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...
- iOS中常用的四种数据持久化方法简介
iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...
随机推荐
- [8.16模拟赛] 玩具 (dp/字符串)
题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...
- [hdu 2102]bfs+注意INF
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的……把INF改成I ...
- oralce的客户端sqlplus
安装完oracle后,默认的客户端是sqlplus,还有一个公司常用的是PLSQLdeveloper 客户端软件,另外Navicat primie这个可以连接mysql.sqlserver.oracl ...
- linux下将jpg,jpeg格式转为PDF
1.安装imagemagick(用其中的convert)和gthumb sudo apt-get install imagemagick gthumb 2.将tiff图片转换为png或jpeg ...
- C# Producer Consumer (生产者消费者模式)demo
第一套代码将producer Consumer的逻辑写到from类里了,方便在demo的显示界面动态显示模拟生产和消费的过程. 第二套代码将producer Consumer的逻辑单独写到一个 ...
- Windows下安装Mycat
Mycat 首先在安装Mycat之前,需要安装JDK1.7以上,可以在cmd环境下输入 java -version 查看本地安装的java版本 如果未安装或者版本在1.7以下,请重新安装. 安装JDK ...
- BigDecimal精度问题
介绍 1.商业计算使用BigDecimal. 2.使用参数为String的构造函数. 3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象.所以在做加减乘除后千万要保存操作后的值 ...
- HDU1596 find the safest road---(最短路径dijkstra,#变形#)
http://acm.hdu.edu.cn/showproblem.php?pid=1596 分析: 题目要找一条安全度最高的路,安全度计算方法 Safe(P) = s(e1)*s(e2)…*s ...
- Python基础(9)三元表达式、列表解析、生成器表达式
一.三元表达式 三元运算,是对简单的条件语句的缩写. # if条件语句 if x > f: print(x) else: print(y) # 条件成立左边,不成立右边 x if x > ...
- 【BZOJ】1571: [Usaco2009 Open]滑雪课Ski
[算法]动态规划 [题解]yy出了O(1w log 1w)的算法. 将雪坡排序预处理出g[i]表示能力值为i的最短时长雪坡. 这样就可以定义work(t,c)表示时长t能力c的最多滑雪数量,work( ...