求教:下面的话怎么理解

neverwin 2004-09-02 12:31:34
二、不充份的连接条件:
---- 例:表card有7896行,在card_no上有一个非聚集索引,
表account有191122行,在 account_no上有一个非聚集索引,
试看在不同的表连接条件下,两个SQL的执行情况:
select sum(a.amount) from account a, card b where a.card_no = b.card_no(20秒)
---- 将SQL改为:
select sum(a.amount) from account a, card b where a.card_no = b.card_no and a. account_no=b.account_no(< 1秒)
---- 分析:
---- 在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用 card上的索引,其I/O次数可由以下公式估算为:
---- 外层表account上的22541页+(外层表account的191122行*内层表card上对应外层 表第一行所要查找的3页)=595907次I/O
---- 在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用 account上的索引,其I/O次数可由以下公式估算为:
---- 外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一 行所要查找的4页)= 33528次I/O
---- 可见,只有充份的连接条件,真正的最佳方案才会被执行。
---- 总结:
---- 1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方 案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的 表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘 积最小为最佳方案。
---- 2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连 接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,30 2)。
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
neverwin 2004-09-03
  • 打赏
  • 举报
回复
最后一顶
playyuer 2004-09-02
  • 打赏
  • 举报
回复
单从 SQL 看,应该认为两句逻辑意义根本不同!所以不具可比性!

其他意见同上

hisi 2004-09-02
  • 打赏
  • 举报
回复
楼主可以针对性提问,哪一点不理解。
zjcxc 元老 2004-09-02
  • 打赏
  • 举报
回复
---- 可见,只有充份的连接条件,真正的最佳方案才会被执行。

这不是结论吗?
pbsql 2004-09-02
  • 打赏
  • 举报
回复
就是连接条件要充分
zonelive 2004-09-02
  • 打赏
  • 举报
回复
关注~!
ouyld 2004-09-02
  • 打赏
  • 举报
回复
同意第一个说的
neverwin 2004-09-02
  • 打赏
  • 举报
回复
up
neverwin 2004-09-02
  • 打赏
  • 举报
回复
感谢大家提出宝贵意见。

playyuer(退休干部 卧鼠藏虫) 说的有道理,想想那两句话确实没有可比性。。。。

其他问题: 1 怎么判断哪个是外层表,哪个是内层表?

2 “外层表页数+外层表中的匹配行数*内层表中每一次查找的次数”这句话怎么解释?
表连接查询是不是这样计算扫描次数的阿?

3 表连接查询中的where子句里面,查询条件排列顺序有什么要注意的地方没有?
rouqu 2004-09-02
  • 打赏
  • 举报
回复
所有意见同上^_^

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧