WEB开发网
开发学院数据库MSSQL Server SQL开发中容易忽视的一些小地方 阅读

SQL开发中容易忽视的一些小地方

 2008-10-13 10:07:39 来源:WEB开发网   
核心提示: 我的观点:联接查询的时间复杂度并不是固定的,更不能说是由两种表现方式不同而决定的.join在查询的算法根据联接表的不同分三种情况:第一种算法:NESTED LOOP:定义: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择,SQL开发中容易忽视的一些小地方(6),在嵌套循环中,内

我的观点:联接查询的时间复杂度并不是固定的,更不能说是由两种表现方式不同而决定的.join在查询的算法根据联接表的不同分三种情况:

第一种算法:NESTED LOOP:

定义: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表。

示例:上面有了一个班级表,下面我再创建一个班级课程表,

CREATE TABLE [dbo].[course](
[ID] [int] IDENTITY(1,1) NOT NULL,
[sCourseName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL,--课程名称
[classID] [int] NULL,--所属班级ID
CONSTRAINT [PK_CKH] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
业务需求:查询所有班级对应的课程情况.

select sCourseName,sClassName from classInfo a
inner join course b
  
on a.classID=b.classID

执行计划效果图:

SQL开发中容易忽视的一些小地方

结论:通过查询执行计划可以非常清楚的看出,采用了嵌套查询,因为两表的数据量都不大,而且数据大小相当.此时的查询开销为n*n

第二种算法:HASH JOIN :

定义: 散列连接是做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。

结论:从图一中可能看出SQL在联接班级表和学生表是采用了hash join方式,因为班级表数据量大,班级表数据量小.这种方式的查询时间复杂度为2n.

注意点:hash join可能非常容易的变成nested loop,下面的查询为hash join

select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
inner join student a on
  
a.classID=b.classID

转换(hash join变nesteed loop):如果在后面组加上排序呢?此是会变成嵌套查询

select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
inner join student a on
a.classID=b.classID
order by a.ID

转换(nesteed loop变hash join):上面的嵌套查询又可以改选成hash join

select * from(
select top 10000 a.ID,a.sUserName,b.sClassName from classInfo b
inner join student a on
a.classID=b.classID) as tbl
order by ID

第三种算法:排序合并连接

定义:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。

网络观点二结论:inner join和where 在查询效率上没有区别,只是体现形式不同而已.

总结:我们可以通过查看SQL的执行计划来分析SQL的性能,一句话正确与否不在于说话的人,而在于实践验证结果.本人就表联接谈了自己的理解,如果有不对的地方还望各们指教.

上一页  1 2 3 4 5 6 

Tags:SQL 开发 容易

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接