查看: 2655|回复: 9

使用绑定变量就一定比不适用绑定变量好吗?

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2013-5-1 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


如题

有使用绑定变量还不如不使用绑定变量的情况吗?

主要是执行效率方面
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
2#
发表于 2013-5-1 12:25 | 只看该作者
有skew data的时候,不使用绑定变量可能更好

因为你一旦使用绑定变量,peeking的话,就把计划固定了,比如where col=1,第一次硬解析固定了,走全表,col=1返回很多。但是万一我以后再经常查的col=2...都要求走索引好,那完蛋了。

所以有了cursor_sharing=similar,但是有BUG,也不好用。后来11g有adaptive cursor sharing,cardinality feedback...类似于similar.但是这东西也不能非常好滴解决这玩意,因为他要经常算你返回的基数来比较啊,比较完了,可能子游标生成很多啊。。。

都不能很好滴解决,当然11g的话,也只能用这个解决了,如果你的值类型很少,那么就不要绑定变量了,反而性能好

使用道具 举报

回复
论坛徽章:
0
3#
 楼主| 发表于 2013-5-1 12:41 | 只看该作者
2楼的意思是说:如果一个列上,数据严重倾斜,那么在这一列上就不适合用绑定变量吗?

照这么说,在主键上用绑定变量,就一定效率高吗?

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
4#
发表于 2013-5-1 12:58 | 只看该作者
hack3389 发表于 2013-5-1 12:41
2楼的意思是说:如果一个列上,数据严重倾斜,那么在这一列上就不适合用绑定变量吗?

照这么说,在主键上 ...

那肯定不一定,只不过一个稳定的系统,搜索谓词应该搜索的行数差不多,计划应该一样,这样才用绑定变量

where id <:vid;

第一次传入个:vid =1,第2次传入个:vid=1000 0000; 你这表可能就100万行,还要绑定变量吗?用绑定变量,两次计划一样,不糟糕了吗?当然,在事实中,比如OLTP系统,应该是均衡的,应该计划一样,一般是id = :vid.这样的当然要绑定变量。

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
5#
发表于 2013-5-1 12:59 来自手机 | 只看该作者
绑定变量加直方图,具体问题具体分析,任何东西都有两面性

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
6#
发表于 2013-5-1 13:07 | 只看该作者
为什么说skew data的要特别注意,因为常常是skew data引起的绑定变量问题,在OLTP中,我们使用绑定变量,除了skew data之外,一般执行计划共享没有啥问题,像上面的虽然是主键,但是你每次搜索差别太大,这共享也有问题,当然在OLTP中很少有这样的情况,OLTP我们搜索的数据量一般是很小的,基本都要求走索引,是吧。非要弄个极端出来,那很多种的。

OLAP不同,处理的数据量大,也耗时多,一般解析时间相对于处理时间忽略不计,因此不用绑定变量,因为每次处理的数据情况可能不同,计划很可能不同,你用了绑定变量,OLAP处理的量有很大,你把要走hash join的变成了前一次的nested loops,那不是跑不出来了啊!

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
7#
发表于 2013-5-1 13:22 | 只看该作者
如果你不能理解楼上兔子说的skew data的话,有个简单点的判定方法,当不存在null时,count(distinct col)/count(col)的比值越大(至少超过80%),就意味着使用绑定变量的效果越好。

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
8#
发表于 2013-5-1 19:55 | 只看该作者
dingjun123 发表于 2013-5-1 13:07
为什么说skew data的要特别注意,因为常常是skew data引起的绑定变量问题,在OLTP中,我们使用绑定变量,除 ...

学习了

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
9#
发表于 2013-5-1 22:25 | 只看该作者
如果是用PLSQL,要想不用绑定变量还真麻烦,必须写成动态SQL。

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
10#
发表于 2013-5-1 22:43 | 只看该作者
newkid 发表于 2013-5-1 22:25
如果是用PLSQL,要想不用绑定变量还真麻烦,必须写成动态SQL。

是啊,PL/SQL得搞个关闭的参数啊

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表