12
返回列表 发新帖
楼主: ZALBB

[讨论] 关于标量子查询的看法

[复制链接]
论坛徽章:
289
蛋疼蛋
日期:2013-03-29 13:46:58优秀写手
日期:2013-12-24 06:00:12福特
日期:2014-02-17 17:30:59生肖徽章:兔
日期:2012-05-24 19:03:36SQL极客
日期:2013-12-09 14:13:35ITPUB季度 技术新星
日期:2014-02-24 11:00:06IT宝贝
日期:2014-08-27 10:32:17马上加薪
日期:2014-08-05 09:18:33SQL数据库编程大师
日期:2016-01-13 10:30:43玉石琵琶
日期:2014-03-04 16:46:07
11#
发表于 2014-7-29 13:59 | 只看该作者
除非能利用到标量子查询的cache,其他时候都不会用

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2014-7-29 19:07 | 只看该作者
标量子查询可转换为等价的外链接写法

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
13#
发表于 2014-7-29 22:31 | 只看该作者
TOM的高效设计上提到这个话题,但那是9i的时候了,现在12C都会自动平坦化了。
TOM的说法总结如下:
可以避开外连接;
SELECT里面有聚合的时候,用标量子查询可以避免多列GROUP BY;
尽量利用行间缓存,先排序后再用标量子查询;
一般在结果集比较小(几百行)的时候用。


使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
14#
发表于 2017-8-21 10:43 | 只看该作者
表量子查询是不是天然的nest loop连接,
因为看起来很显然:主查询每执行1行,标量子查询遍历一次,

如果标量子查询是天然的nest loop,那么在mysql,标量子查询就没必要优化了?因为mysql的连接只有nest loop

我一看到标量子查询,就想把它掰下来,做成连接,现在我怀疑我这样做是否有意义。

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
15#
发表于 2017-8-21 22:01 | 只看该作者
XQKA 发表于 2017-8-21 10:43
表量子查询是不是天然的nest loop连接,
因为看起来很显然:主查询每执行1行,标量子查询遍历一次,

标量子查询经常还有聚合功能,比如SELECT COUNT(*),  SELECT SUM(), 这个就不是nest loop可比的。
MYSQL的连接功能竟然这么弱? 这可没有想到。

使用道具 举报

回复
论坛徽章:
73
2010新春纪念徽章
日期:2010-03-01 11:06:132011新春纪念徽章
日期:2011-02-18 11:43:332012新春纪念徽章
日期:2012-01-04 11:55:422013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:44:08马上有车
日期:2015-01-19 09:45:33最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-11-27 10:16:10问答徽章
日期:2013-10-23 15:13:22林肯
日期:2013-11-02 08:34:46
16#
发表于 2017-8-21 22:22 | 只看该作者
newkid 发表于 2017-8-21 22:01
标量子查询经常还有聚合功能,比如SELECT COUNT(*),  SELECT SUM(), 这个就不是nest loop可比的。
MYSQL ...

mysql只支持nest loop是官文上说的,我也是昨天才看到。
MySQL resolves all joins using a nested-loop join method.
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

在oracle环境下,如果有大量的latch竞争,多半是nest loop造成的,
但mysql仅用nest loop却很少碰到CPU飙高的情况。mysql如果连接的表很多,那么嵌套的层次很深的,
有类似下面的效应
int main()  
{  
    int i, j,k;  
    for ( i = 1; i <= 10; ++i )
    {  
        for ( j = 1; j <= 10; ++j )
        {  
            for (k=1; k <=10; ++k)
            {
            printf("%d ", i * j * k);
            printf("\n");            
            }
        }  
    }  
    return 0;  
}
这样的sql有的会执行好几秒,但不觉得CPU有多高。这估计是mysql的和oracle的缓存机制造成的
mysql的简单粗暴的query cache基本上是不开的。
我对mysql的了解还不是很深刻,不知道mysql的部署是不是很强调磁盘的速度和IO,比如建议ssd等。



使用道具 举报

回复

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

本版积分规则 发表回复

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