《数据库索引设计优化》读书笔记(八)
来源:互联网 发布:linux系统ip地址设置 编辑:程序博客网 时间:2024/04/27 23:08
第14章 优化器不是完美的
练习
14.1 重写SQL 14.8中的游标,使得新游标的访问路径满足:
提示:WHERE语句可以包含操作符NOT,不过NOT将使该谓词对于优化器而言太过困难(无匹配列)。
分析:
(LNAME = :LNAMEPREV AND CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX)
=>
((LNAME = :LNAMEPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX)) AND
((CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX))
=>
(LNAME = :LNAMEPREV OR LNAME > :LNAMEPREV) AND (LNAME = :LNAMEPREV OR LNAME <= :LNAMEMAX) AND
((CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX))
=>
(LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX) AND
((CNO > :CNOPREV) OR (LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX AND LNAME <> :LNAMEPREV))
出于简化,设
LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX 为 a
CNO > :CNOPREV 为 b
LNAME <> :LNAMEPREV 为 c
则原条件谓词转化为:
a and (b or (a and c)) => a and (a or b) and (b or c) => a and (b or c)
再把a、b、c还原回去,则条件原来的条件谓词可以转化为:
LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX AND (CNO > :CNOPREV OR LNAME <> :LNAMEPREV)
这个等价的谓词条件去掉了外层的OR,可以以LNAME作为匹配列,CNO和LNAME作为过滤列访问(LNAME,CNO,FNAME),满足题目要求。最终的SQL改写为:
14.2 列出你正在使用的优化器具有的最常见的缺点。
练习
14.1 重写SQL 14.8中的游标,使得新游标的访问路径满足:
- MC=1
- 仅需访问索引
- 无排序
-- SQL 14.8DECLARE CURSOR141 CURSOR FORSELECT LNAME, FNAME, CNO FROM CUST WHERE (LNAME = :LNAMEPREV AND CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX) ORDER BY LNAME, CNOWE WANT 20 ROWS PLEASE要求:不能去除ORDER BY。
提示:WHERE语句可以包含操作符NOT,不过NOT将使该谓词对于优化器而言太过困难(无匹配列)。
分析:
查询谓词只有两个字段LNAME、CNO,并且这两个字段都有范围条件。要满足“MC=1”,候选索引为(LNAME)、(CNO)、(LNAME,CNO)、(CNO,LNAME)。要满足“仅需访问索引”,则前两个单列候选索引被排除。后两个复合索引还要加入FNAME字段,使之成为宽索引。候选索引变为(LNAME,CNO,FNAME)或(CNO,LNAME,FNAME)。最后要满足“无排序”,则索引只能是(LNAME,CNO,FNAME)。索引确定后需要改写SQL 14.8,使得查询能够走(LNAME,CNO,FNAME)索引。
原查询语句里的OR前后括号里的谓词条件都是是非BT谓词,所以要把外层的OR去掉。根据逻辑运算的等价性做如下转换(前提是:LNAMEPREV <= :LNAMEMAX):(LNAME = :LNAMEPREV AND CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX)
=>
((LNAME = :LNAMEPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX)) AND
((CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX))
=>
(LNAME = :LNAMEPREV OR LNAME > :LNAMEPREV) AND (LNAME = :LNAMEPREV OR LNAME <= :LNAMEMAX) AND
((CNO > :CNOPREV) OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX))
=>
(LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX) AND
((CNO > :CNOPREV) OR (LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX AND LNAME <> :LNAMEPREV))
出于简化,设
LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX 为 a
CNO > :CNOPREV 为 b
LNAME <> :LNAMEPREV 为 c
则原条件谓词转化为:
a and (b or (a and c)) => a and (a or b) and (b or c) => a and (b or c)
再把a、b、c还原回去,则条件原来的条件谓词可以转化为:
LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX AND (CNO > :CNOPREV OR LNAME <> :LNAMEPREV)
这个等价的谓词条件去掉了外层的OR,可以以LNAME作为匹配列,CNO和LNAME作为过滤列访问(LNAME,CNO,FNAME),满足题目要求。最终的SQL改写为:
-- SQL 14.8DECLARE CURSOR141 CURSOR FORSELECT LNAME, FNAME, CNO FROM CUST WHERE LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX AND (CNO > :CNOPREV OR LNAME <> :LNAMEPREV) ORDER BY LNAME, CNOWE WANT 20 ROWS PLEASE
14.2 列出你正在使用的优化器具有的最常见的缺点。
- MySQL的表连接只有嵌套循环一种方式
- MySQL只有memory引擎支持HASH索引
- MySQL不支持位图索引和函数索引
- MySQL的分区表只有本地索引,没有全局索引
0 0
- 《数据库索引设计优化》读书笔记(八)
- 《数据库索引设计优化》读书笔记(一)
- 《数据库索引设计优化》读书笔记(二)
- 《数据库索引设计优化》读书笔记(三)
- 《数据库索引设计优化》读书笔记(四)
- 《数据库索引设计优化》读书笔记(五)
- 《数据库索引设计优化》读书笔记(六)
- 《数据库索引设计优化》读书笔记(七)
- 数据库索引设计与优化读书笔记--《一》概述
- 数据库索引设计与优化读书笔记--《三》SQL处理过程
- 数据库优化---索引设计
- 数据库索引设计与优化读书笔记--《四》为SELECT语句创建理想的索引
- 数据库索引设计与优化
- 《数据库索引设计与优化》
- 读书笔记:数据库索引的设计原则
- 数据库索引设计与优化pdf
- MySQL数据库入门--读书笔记(八)
- mysql性能优化(八) mysql索引优化
- 使用pyinstaller制作包含Oracle数据库的可执行程序
- 虚拟机下CentOS 6.5配置IP地址的三种方法
- ASMSNMP通过不过(oracle11g单机asm)
- Java开发-Redis客户端Jedis
- JAVA与GUI
- 《数据库索引设计优化》读书笔记(八)
- @maohoo Intellij idea15安装JRebel插件实现tomcat热部署
- 解决UITextView上面一段空白(ios oc)
- mysql更新记录时设置自动更新时间戳
- 软件开发管理: 迭代小结会(review meeting)
- 源代码就是设计
- linux下启动、登陆 mysql 出现ERROR 2002(HY000):can't connect to local mysql server
- style、id、class和*的优先级
- unity用oculus播放全景视频