前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《数据库索引设计优化》读书笔记(八)

《数据库索引设计优化》读书笔记(八)

作者头像
用户1148526
发布2022-05-07 12:42:03
1740
发布2022-05-07 12:42:03
举报
文章被收录于专栏:Hadoop数据仓库

第14章 优化器不是完美的 练习 14.1 重写SQL 14.8中的游标,使得新游标的访问路径满足:

  • MC=1
  • 仅需访问索引
  • 无排序
代码语言:javascript
复制
-- SQL 14.8
DECLARE CURSOR141 CURSOR FOR
SELECT LNAME, FNAME, CNO
  FROM CUST
 WHERE (LNAME = :LNAMEPREV AND CNO > :CNOPREV)
    OR (LNAME > :LNAMEPREV AND LNAME <= :LNAMEMAX)
 ORDER BY LNAME, CNO
WE 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改写为:

代码语言:javascript
复制
-- SQL 14.8
DECLARE CURSOR141 CURSOR FOR
SELECT LNAME, FNAME, CNO
  FROM CUST
 WHERE LNAME >= :LNAMEPREV AND LNAME <= :LNAMEMAX
   AND (CNO > :CNOPREV OR LNAME <> :LNAMEPREV)
 ORDER BY LNAME, CNO
WE WANT 20 ROWS PLEASE

14.2 列出你正在使用的优化器具有的最常见的缺点。

  1. MySQL的表连接只有嵌套循环一种方式
  2. MySQL只有memory引擎支持HASH索引
  3. MySQL不支持位图索引和函数索引
  4. MySQL的分区表只有本地索引,没有全局索引
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档