- 浏览: 1519370 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (532)
- 软件设计师 (7)
- PSP (5)
- NET MD (9)
- Hibernate (8)
- DIY (51)
- Work (43)
- GAME (24)
- 未分类 (44)
- iPod (6)
- MySQL (39)
- JSP (7)
- 日语能力考试 (36)
- 小说 (4)
- 豆包网 (23)
- 家用电脑 (7)
- DB2 (36)
- C/C++ (18)
- baby (9)
- Linux (13)
- thinkpad (23)
- OA (1)
- UML (6)
- oracle (24)
- 系统集成 (27)
- 脑梗塞 (6)
- 车 (8)
- MainFrame (8)
- Windows 7 (13)
- 手机 (8)
- git (12)
- AHK (2)
- COBOL (2)
- Java (9)
最新评论
-
安静听歌:
... ...
UUID做主键,好还是不好?这是个问题。 -
lehehe:
http://www.haoservice.com/docs/ ...
天气预报 -
lehehe:
[url http://www.haoservice.com/ ...
天气预报 -
liubang201010:
监控TUXEDO 的软件推荐用这个,专业,权威.并能提供报警和 ...
(转载)Tuxedo中间件简介 -
tinkame:
Next[j] =-1 当j=0时;=Max{k|0<k ...
KMP字符串模式匹配详解
请问在一个查询里表连接的顺序对查询的性能是否有影响?
如果有影响,我想问连接时的顺序是从左到右还是从右到左?
如: a inner join b on condition1 left outer join c on condition2
inner join d on condition3
其执行连接的顺序是什么?如果各个表的大小不一样,那么应该遵循什么规则才能达到最快速度?
不好意思,在书上找不到,就上来问啦。另外,where子句里的各个条件语句放置顺序是否对查询有影响?
问题点数:100、回复次数:21Top
1 楼CCEO(CSDN的CEO)回复于 2002-12-11 11:43:04 得分 20
sql server的自动优化机制使得这个次序是没有意义的,除非你自己指定了油画选项。
Top
2 楼CrazyFor(冬眠的鼹鼠)回复于 2002-12-11 11:45:06 得分 0
还是找书吧,清楚点
简单说一下,
A和B表
A left outer join B = B right outer join A
A left outer join B 适合A和B的一对多关系,即A的一条记录对应B的多条记录,如“-->” 如引号中的箭头,结果集中只包括A表中有的记录。Right outer join 如“<--”
A full outet join B 如“<-->”
Top
3 楼Chiff(~o~)回复于 2002-12-11 11:45:27 得分 30
where子句里的各个条件语句放置顺序是否对查询有影响?
据我观察没有。因为不管你怎样放,mssql最后都会按他的规则排顺序。
据我所知,所有常量逻辑总是会排在最前面。比方说:
where 1=1 and 列a='a'
sql在查询时总是会把1=1之类的放在前面。Top
4 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 11:51:16 得分 0
没有连接顺序?好象不对吧,我记得哪里说可以用括号来改变连接的顺序的。请各位明示。
to CCEO() :
请问油画机制是做什么用的?Top
5 楼Chiff(~o~)回复于 2002-12-11 11:53:40 得分 0
(油画)优化机制。Top
6 楼microd(重构一切)回复于 2002-12-11 11:55:08 得分 0
不用说,肯定有Top
7 楼Chiff(~o~)回复于 2002-12-11 11:58:26 得分 0
关于条件顺序判断,很容易测试的:
拿个除以零的条件放在条件列表里面。
Top
8 楼microd(重构一切)回复于 2002-12-11 12:00:45 得分 10
Where 后面的条件有影响,在同等条件,把记录多条件的放在最后面,因为Where 语句总是从最后面的语句开始执行,这样会减少过滤时间(也就是执行时间呢!)。Top
9 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 12:07:45 得分 0
ok,我可以测where后条件的执行顺序。
to microd(做人真累):
关于你说的从后到前的执行顺序你有没有测过,是否真的是这样?Top
10 楼mylovexs(不了塵)回复于 2002-12-11 12:35:27 得分 10
有影響,sql查詢優化器根據where循序採用索引,除非指定索引Top
11 楼Chiff(~o~)回复于 2002-12-11 12:37:00 得分 0
microd(做人真累):
“因为Where 语句总是从最后面的语句开始执行”
你试过吗?何以见得?Top
12 楼Chiff(~o~)回复于 2002-12-11 13:14:58 得分 0
关于条件执行的顺序,让我们来做一个测试!
create table test(id int)
insert into test values(1)
insert into test values(2)
------------------------------------------
select * from test where 1/0=1 or 1=1
--1
--2
select * from test where 1/0=1 or id in(1,2)
--遇到零除错误
select * from test where 1/0=1 and id = 3
--遇到零除错误
------------------------------------------
select * from test where id/0=id or id=id
--遇到零除错误
select * from test where id=id or id/0=id
--1
--2
-------------------------------------------
select * from test where 1/0=1 or id = 1
--遇到零除错误
-------------------------------------------
select * from test where id/0 = 1 or id = id
--遇到零除错误
select * from test where id = id or id / 0 = 1
--1
--2
-------------------------------------------
select * from test where id/0 =1 or 1=1 or id/0 = 4 or 1/0=1 or id=id/0
--1
--2
select * from test where id/0 =1 and 1=2 and id/0 = 4 and 1/0=1 and id=id/0
--没有结果,也没有报错
-------------------------------------------
至少可以看出:
sql在执行条件语句的时候是将条件分级别匹配的,级别最高的是:
常量与常量的比较
而且级别分得非常细,所以我也分析不出确切的机制。
只有在级别完全相同的时候,才是从左至右或从右至左来匹配。
不对之处请大家指正。Top
13 楼Chiff(~o~)回复于 2002-12-11 13:52:56 得分 0
大家来讨论一下。Top
14 楼xystarch(Cyan)回复于 2002-12-11 14:14:54 得分 0
我觉得对这个问题的分析需要对SQL语言的底层结构和它所基于的数学理论进行讨论,比如关系代数与集合演算.
但是SQLServer内置的查询优化器会改变实际查询的方式,在QA里面看到的
Executing Plan并不符合我们实际的sql语句
好像有个开关
set queryOptima=off(具体是什么我忘了)
将优化器关掉后就可以看到连接顺序和条件顺序对于性能优化的影响了.Top
15 楼wxbfly(背着黄金的飞鸟)回复于 2002-12-11 14:19:15 得分 0
谢谢Chiff(~o~) 的关心。
我想讨论对大家都会有好处,我可以加分,请各位高手继续。Top
16 楼xystarch(Cyan)回复于 2002-12-11 14:21:01 得分 30
SQL SERVER 的查询引擎是基于开销的查询引擎.
基于开销的查询优化器在备选计划中选择应答 SQL 查询的计划。选择是基于对执行特殊计划的开销估算(I/O 操作数、CPU 秒数,等等)而作出的。它通过记录表或索引中记录的数目和构成的统计数字估算这些开销。与基于语法的查询优化器不同,它不依赖于查询的确切语法或查询中的子句顺序。
Top
17 楼Chiff(~o~)回复于 2002-12-11 14:26:41 得分 0
xystarch说得有道理。Top
18 楼Chiff(~o~)回复于 2002-12-11 14:27:31 得分 0
问题是,mssql是怎样判断开销的呢?Top
19 楼zxdragon(zxdragon)回复于 2002-12-11 14:28:03 得分 0
实际上ON后面的条件内容也很重要。
通常在表连接时,一般采用
A LEFT JOIN B ON A.id=B.id
如果可能写成
A LEFT JOIN B ON A.id=B.id AND A.Name=B.Name AND A.Date=B.Date ...
虽然 A.id=B.id 就一定决定 A.Name=B.Name AND A.Date=B.Date
但是还是劝你写的繁一点,这样在你联接N多个表或数据量较大时,你的查询时间会少很多。
血的教训呀~~~Top
20 楼xystarch(Cyan)回复于 2002-12-11 14:39:49 得分 0
http://www.microsoft.com/china/technet/sql/Technote/dat411.asp
我们所写出的sql语句是一个查询计划,是抽象数学演算的实现,最值得信赖的优化还是要根据关系代数与集合演算来做
我的导师告诉我说:将你的sql语句转化成数学演算来分析怎么实现优化!
但是实际情况中我们又不得不考虑表中数据量对于性能的影响
基于开销和基于语法这两种模型的结合才是最理想的.
但是这个mssql是怎么实现的?的确是个问题(我想这个可能是mssql的核心所在吧).Top
21 楼xystarch(Cyan)回复于 2002-12-11 14:49:16 得分 0
我找到那条语句了
SET FORCEPLAN ON
将会强制查询基于语法而不是开销.
发表评论
-
MySQL配置文件my.cnf 例子最详细翻译
2009-07-20 11:58 1709http://www.blogjava.net/hunte ... -
MySQL :: @@Rowcount in MySQL
2009-03-02 15:39 2144@@Rowcount in MySQL? Posted ... -
MYSQL中删除重复记录的方法
2009-02-26 12:23 0MYSQL中删除重复记录的方法 2008 ... -
使用 MYSQLBINLOG 来恢复数据。
2009-02-26 12:21 0使用 MYSQLBINLOG 来恢复数据。 20 ... -
13.2.3. InnoDB Startup Options and System Variable
2009-02-20 13:37 1232http://dev.my ... -
mysql innodb 配置详解
2009-02-20 11:01 3540加为好友发送私信在线聊天 -
20.3.9 关于死锁 深入浅出MySQL——数据库开发、优化与管理维护
2009-02-20 10:50 3119深入浅出MySQL——数据库开发、优化与管理维护 回 ... -
mysql的临时表不支持自连接
2009-02-18 13:32 2312TEMPORARY TABLE ProblemsThe fol ... -
windows 下安装两个MySQL收藏
2009-02-03 16:28 2350由于两个MySQL进程需要不同的配置文件,以下所有操作均是在W ... -
1.4.1. What's New in MySQL 5.1
2009-02-03 16:25 11391.4.1. What's New in My ... -
查看mysql版本的四种方法
2009-02-02 10:57 9331:在终端下:mysql -V。 以下 ... -
Server SQL Modes
2009-02-01 11:06 13915.1.7. Server SQL Modes ... -
MySQL中的各种JOIN(CROSS JOIN, INNER JOIN, LEFT [OUTER]
2009-01-13 14:50 6172MySQL中的各种JOIN(CROSS JOIN, I ... -
[转]SQL Server 2000执行计划成本(5/5)
2009-01-09 15:26 1161[转]SQL Server 2000执行计划成本(5/5) ... -
SQL Server 2000执行计划成本(4/5)
2009-01-09 15:25 1068[转]SQL Server 2000执行计划成本(4/5) ... -
[转]SQL Server 2000执行计划成本(3/5)
2009-01-09 15:23 1495[转]SQL Server 2000执行计划成本(3/5) ... -
SQL Server 2000执行计划成本(1/5)
2009-01-09 14:52 1609[转]SQL Server 2000执行计划成本(1/5) ... -
浅谈MySQL数据库优化
2009-01-09 14:46 1296浅谈MySQL数据库优化 [收藏此页] [打印] ... -
sql server支持create table as ...建表么
2009-01-09 11:52 8967sql server支持create table as .. ... -
SQL Server如何识别自动创建的索引
2009-01-08 15:57 1267SQL Server如何识别自动创建的索引 http://w ...
相关推荐
子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能 频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理 解释:首先解释SQL语句【语法是否正确】 解析:检验语句的出现的对象是否有效...
sql学习 02_2表驱动顺序与性能之HASH连接.sql
XQuery是一个刚诞生不久的查询语言,与优化相关的很多问题还未解决。主要研究与XQuery语言相关的优化问题。对XQuery中的结构化连接算法进行了改进,通过比较,表明所进行的改进能提高性能。
sql学习 02_3表驱动顺序与性能指排序合并连接.sql
在开发代码的同时,如果你花费时间和精力来开发一个性能故障排错的方法。那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日...
在开发代码的同时,如果你花费时间和精力来开发一个性能故障排错的方法。那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日...
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. 2、WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的...
Oracle SQL性能优化 (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ...如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
优化表的关联顺序:在多表关联查询时,MySQL的查询优化器会自动决定表的连接顺序,但有时手动指定关联顺序可以提高查询效率。 合理使用索引:索引可以显著提高查询速度,但过多或不当的索引会导致写入操作变慢,因此...
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间...
6.5.9在同一个表上查询和更新232 6.6查询优化器的提示(hint)232 6.7优化特定类型的查询236 6.7.1优化COUNT()查询236 6.7.2优化关联查询239 6.7.3优化子查询239 6.7.4优化GROUPBY和DISTINCT239 6.7.5优化...
对于表A和表B、表C、表D,如果经常查询表A和表B中的数据,那么可以将他们放在同一个文件组M中;如果经常访问表C和表D中的数据可以将他们放在同一个文件组N中。这样读取效率就比较高,因为一次读取就可能包含了两个表...
象,从优化查询路径的角度提出一个基于代价的最优查询计划生成方法。首先,该方法设计一种有效的代价模型来 估算查询代价;然后,采用并行最大最小蚁群算法来搜索具有最小查询代价的连接顺序,即最优连接顺序;最后...
2.4.2 WHERE子句中的连接顺序 8 2.4.3 SELECT子句中避免使用 ‘ * ‘ 8 2.4.4 用EXISTS替代IN 8 2.4.5 用NOT EXISTS替代NOT IN 9 2.4.6 用表连接替换EXISTS 9 2.4.7 用EXISTS替换DISTINCT 10 2.4.8 减少对表的查询 ...
作为一个Oracle专业人员,你应该知道在SQL语句第一次进入库缓存时可能存在重大的启动延迟。...但是通过理解Oracle内部产生执行计划的机制,能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能。
查询表顺序的影响 在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据...
使用自连接的另一个实例是在包含工作任务的表格中追踪一个开发项目,在其他信息中,表格里包括一个TaskID专栏,他的每一行都有一个唯一的数字;一个DependenceID专栏,其中包括在现有任务可以开始之前必须完成的任务...
(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理...如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) (8) 删除重复记录:
SQL优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。这个资源整理了50个永不过时的SQL性能优化技巧,无论是在数据库表设计的时候,还是在SQL开发的时候,比较高频出现的优化点。 ...