- 浏览: 2010895 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (1409)
- asp/asp.net学习 (241)
- oracle (10)
- delphi (295)
- java (27)
- pb (1)
- 每日点滴 (49)
- 学习方法 (40)
- 思想方面 (104)
- C语言 (5)
- C++ (1)
- 代码重构经验 (5)
- 软件工程 (3)
- 数据库 (99)
- 英语学习 (3)
- mysql (1)
- 该关注的网站或者网页 (42)
- 总结 (7)
- 要去做的事情 (33)
- 算法 (1)
- 网络方面 (29)
- 随感 (96)
- 操作系统 (36)
- UML (12)
- 常用工具的使用 (55)
- 脚本 (7)
- 汇编 (62)
- 数据结构 (2)
- 财务 (38)
- 语文作文 (16)
- 法律 (1)
- 股票 (88)
最新评论
-
devwang_com:
可以,学习了~~
列出文件夹下所有文件夹的树形结构--Dos命令 tree的使用 -
hvang1988:
不管用啊 frxrprt1.PreviewForm.Pare ...
fastReport预览时嵌入到别的窗体 -
00915132:
我也有这个疑问,非常 感 谢
left join加上where条件的困惑 --SQL优化 -
zhuyoulong:
学习了,高效读书
软件架构师要读的书 -
nTalgar:
非常感谢分享!
Application.ProcessMessages用法:
TSQL中 Count() 函数使用的一点小技巧
摘自:http://blog.csdn.net/plean/archive/2008/09/08/2900843.aspx
阅:使用子查询效率要高于外连接;
COUNT( * ) 返回组中项目的数量,这些项目包括 NULL 值和副本。
COUNT(ALL expression) 对组中的每一行都计算 expression 并返回非空值的数量。
COUNT(DISTINCT expression) 对组中的每一行都计算 expression 并返回唯一非空值的数量。
COUNT( expression ) 默认是ALL , COUNT( expression ) 其实相当于COUNT(ALL expression);
由于COUNT( * ) 和 COUNT( expression ) 返回的值会不一样,一些情况下就会有问题,比如下面的范例:
有以下两个表
Table1 有以下记录(类似一个分类表)
ID Title
1 aa
2 bb
3 cc
4 dd
5 ee
6 ff
Table2 有以下记录用来记录Table1中的分类具体出现,这里的ID对应Table1中的ID
ID
1
1
2
3
5
3
4
如果我们要统计每一个分类在Table2中的出现次数,(如果某个分类出现次数为0,也要统计出来)
可以用下面的SQL 语句
SELECT count(b.ID) as num ,a.ID as AnswerID
FROM Table1 a left OUTER JOIN Table2 b ON a.ID = b.ID
group by a.ID
如果是下面的写法,统计出来的结果就是错误的。:
SELECT count(*) as num ,a.ID as AnswerID
FROM Table1 a left OUTER JOIN Table2 b ON a.ID = b.ID
group by a.ID
另外这个统计可以通过下面的方式实现:
SELECT
CategoryID,
(SELECT COUNT(*) FROM Content WHERE CategoryID=c.CategoryID)
FROM
Category c
******************************************************************************
关于子查询和Join的比较
******************************************************************************
嗯,应该说在某些情况下还是会出现使用JOIN的效率不如使用子查询的情形,至少索引或统计的结构就可能引起这个差异。以Northwind数据库为例,如有下面两个逻辑相等的查询:
SELECT
c.CategoryID, COUNT(p.CategoryID)
FROM
Categories c LEFT JOIN Products p
ON p.CategoryID = c.CategoryID
GROUP BY
c.CategoryID
和:
SELECT
c.CategoryID,
(SELECT COUNT(*) FROM Products
WHERE CategoryID = c.CategoryID)
FROM
Categories c
在默认情况下,把两个查询放在一个批里查看执行计划,会发现各自都占50%的开销,而且执行计划完全相同——这就是你说的内部转换。然而,如果把主表(即Categories表)的主键索引删除,情况就不同了——两种查询的执行计划有了微妙的差异,且总是使用子查询的开销要小一些(我曾见过相同逻辑的两种查询开销之比达到7:3甚至更高)。
当然,一个好的DBA不会不给主表主键建立索引,但我想说的是,SQL Server内部对子查询向外连接的转换过程对某些情形来说还是有更好的优化策略的。另外从SQL程序员的角度说,对于这种应用场合应该首先考虑使用子查询,无论从可读性、执行效率还是功能来说,这种写法都有很大的优势。
专家就是专家,一针见血。不过我又确认了一下,发现就算写成这样:
SELECT
c.CategoryID, COUNT(p.CategoryID)
FROM
Categories c LEFT JOIN Products p
ON p.CategoryID = c.CategoryID
GROUP BY
c.CategoryID
和:
SELECT
c.CategoryID,
(SELECT COUNT(*) FROM Products
WHERE CategoryID = c.CategoryID)
FROM
Categories c
GROUP BY
c.CategoryID
在CategoryID字段没有索引的时候,还是使用子查询的开销更小一些——而此时两者的逻辑应该是一样的了。所以结论还是不变,就是在这种应用场合下,使用子查询的性能总是小于等于使用外连接的。而且在CategoryID是主键的前提下,使用子查询的时候可以不用写GROUP BY字句而获得同样的结果,这样可以不受GROUP BY对选择列的局限。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/plean/archive/2008/09/08/2900843.aspx
发表评论
-
sql 保留两位小数
2011-09-30 15:25 111841. ROUND(该函数,只是负责四舍五入到两位小数, ... -
Sql获取星期几的方法
2011-09-26 11:14 15331. select Datepart(weekday, ... -
SQL DATEDIFF语法及时间函数
2011-08-11 19:29 1440摘自:http://apps.hi.baidu.com/sha ... -
比较两个数据库的不同 包括表结构 视图 存储过程等
2011-07-22 18:02 986比较两个数据库的不同 包括表结构 视图 存储过程等 h ... -
SQL Server 2005调试触发器
2011-07-10 18:35 1314摘自:http://blog.csdn.net/zwk_9/a ... -
如何查找所有包含了某个文本的存储过程
2011-06-09 11:16 788select name from sysobjects o, ... -
使用pivot将行转成列
2011-05-17 16:46 1065摘自:http://blog.csdn.net/happy66 ... -
如何监控SQL Server (2005/2008) 的运行状况
2011-04-15 14:01 1135如何监控SQL Server (2005/2008) 的运行状 ... -
SQL中的各种JOIN(inner join,full outer join,left join,right join,cross join )
2011-04-14 13:43 978SQL中的各种JOIN(inner join,full ... -
MsSql2005数据库熟悉
2011-04-01 17:32 15632011-4-11. 终于把那个模 ... -
知道了远程服务器的IP,以及端口号 如何连接
2011-04-01 12:33 1584问题描述:知道了远程服务器的IP,以及端口号 如何连接 ... -
varchar(max) 定义最大化 MsSql2005
2011-03-31 10:54 1132在存储过程里: declare @CreateScript ... -
在存储过程里使用N前缀 Mssql
2011-03-31 10:16 19982011-3-31 摘自:Mssql 2005的帮助页 ... -
经典的三表练习 sql
2011-03-25 14:05 1165create table s --学生表( sid in ... -
sql 这样写,有什么好处?函数列在字段里
2011-03-24 18:34 1198表格:aat 两个字段:a,b select dbo.get ... -
批量导出sql server 的视图、表、存储过程脚本
2011-03-18 17:39 3118批量导出sql server 的视图、表、存储过程脚本 ... -
asp.net连接Access SQL SERVER Oracle
2011-03-11 16:14 1136摘自:http://blog.csdn.net/m ... -
left join加上where条件的困惑 --SQL优化
2011-03-10 15:29 36894left join加上where条件的困惑 摘自:http: ... -
sql server行级锁,排它锁,共享锁的使用
2011-03-08 08:36 1422sql server行级锁,排它锁 ... -
共享锁和排它锁的区别
2011-03-06 11:04 1109共享锁和排它锁的区别 这是个面试题;
相关推荐
sql 入门 tsql 入门 sql 实例,sql 简单教程 sql 教程
很详细的TSQL教程,对于学习TSQL的朋友会有用的
详细介绍了TSQL创建 使用 带N多实例
TSQL2012数据库脚本下载
把TSQL与PLSQL之间所有的信息按照不同功能进行了的描述。
TSQL语言,适合数据库初学者,及要设计到数据库开发的对数据库不太熟悉的。
TSQL_Programming_20061113
TSQL编程1-规则.pdf
《SQL SERVER 2008技术内幕:T-SQL语言基础》随书出来的源码。在学习这本书时,一定要在SQLSERVER2008上面创建这个数据库,供实验,一定要多做实验,才能有效掌握SQL语句的编写。
3,使用grouping sets 自定义分组集单个分组的集合是分组集, 分组集 grouping sets((a),(a,b)) :表示两个分组 (a,b),
数据库 TSQL程序设计基础PPT学习教案.pptx
基于Java+JavaScript+TSQL+Vue的电影购票小程序设计与实现
一些常用的SQL语法,PLSQL和TSQL的区别,方便数据库过渡
TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储...
1.between and方法 2.offset xx rows fetch next xx rows only方法
论坛里面找的 乘法表 比较有意思 大家看看
使用TSQL建库建表PPT课件.pptx
使用TSQL建库建表学习教案.pptx
详细介绍了存储过程和游标的使用 带N多个实例 一幕了然 学习存储过程必备
使用TSQL建库建表PPT学习教案.pptx