SQL数据库查询效率的研究
2016-03-09姚曦
姚曦
(福建卫生职业技术学院公共基础部,福建 福州 350101)
SQL数据库查询效率的研究
姚曦
(福建卫生职业技术学院公共基础部,福建 福州 350101)
本文介绍了SQL中连接的种类,连接的操作步骤,连接的语法。重点解析了在基于多表连接的查询中如何提高效率,并通过学生数据库的实例进一步说明。
连接;多表;优化查询
1 概论
数据库性能问题一直是决策者及技术人员共同关注的焦点,影响数据库性能的一个重要因素就是SQL查询语句的效率。SQL是结构化查询语言(Structured Query Language)的缩写,SQL语言的功能包括数据查询、数据操纵、数据定义和数据控制等部分,主要应用于关系数据库,实现了关系数据库中的数据检索。数据库一般是由多张表来实现存储,并通过多张表之间的连接关系建立完整有效的数据查询。作为数据查询语言SQL,提供了功能强大的数据表连接查询功能。那么如何将这些表高效地有机地联系起来,就成为设计关系数据库的一个重要指标。
2 多表连接的类型
在关系数据库应用中,由于需要经常对多个关联表进行操作,可以通过同时检索多个表来获取所需的数据。一般分为三种连接的模式:内连接(INNER JOIN),外连接(OUTER JOIN),交叉连接(CROSS JOIN)。语法的连接格式如下:
<连接>::=
{
<表名>[{INNER
|{{LEFT|RIGHT|FULL}[OUTER]}
|CROSS
}]
JOIN<表名>
ON<连接条件>
}
2.1 内连接(INNER JOIN)
内连接使用比较运算符进行表间某(些)列数据的比较操作,并列出与连接条件相匹配的数据行。根据所使用的比较方式的不同,内连接又分为等值连接、不等连接和自然连接三种。
等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,也包括重复列。
不等连接:在连接条件使用除等于运算符以外的其它比较运算符比较被连接列的列值。这些运算符包括>、>=、< =、<、!>、!<和<>。
自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,查询结果不包括重复列。
2.2 外连接(OUTER JOIN)
内连接返回满足查询条件的数据,不满足的数据不会保留。而外连接则返回查询条件中一个表或视图的所有数据行。
外连接包括三种模式:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全连接(FULL OUTER JOIN)。
左外连接:保留左表中的所有数据,如果左表与右表的某些数据不匹配,则在结果集中右表不匹配的数据列均为空值。
右外连接:同左外连接相反,右外连接保留右表中的所有数据,如果左表与右表的某些数据不匹配,则在结果集中左表不匹配的数据列为空值。
全连接:也称完整外连接,返回左表与右表中的所有数
据行,如果左表与右表达某些数据不匹配,则在结果集中的对应列均为空值。
2.3 交叉连接(CROSS JOIN)
交叉连接不使用WHERE子句,返回涉及表的笛卡儿积。如查询表1及表2,表1有m行,表2有n行,查询结果集有m×n行。
3 多表连接的优化查询
联接查询操作的前提是笛卡儿积,从中找出符合条件的记录,所以我们在做优化时尽量避免联接查询。如果避免不了的联接操作要遵循以下2个原则从而达到优化时间和空间的目的。
给定三个关系模式:(以下实例均以此为例)
s(sno,sname,sex,birthday,email)
c(cno,cname,creadit)
sc(sno,cno,score)
3.1 选择最有效率的表名顺序(只在基于规则的优化器中有效)
在进行多表连接查询时,解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表将被优先处理。因此在FROM子句中含多个表的情况下,须选择元组数最少的表作为基础表。例如s表有1000条数据,c表有10条数据。语句select*from s,c(选择c为基础表)比语句select*from c,s(选择s为基础表)更高效。
如果有3个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表是指那个被其他表所引用的表。例如sc表的sno和cno列分别在s表和c表中出现,sc表是s表和c表的交叉表。因此SQL语句
SELECT*FROM S,C,SNO
WHERE SC.CNO=C.CNOAND SC.SNO=S.SNO
将比下列语句更高效
SELECT*FROM SNO,S,C
WHERE SC.CNO=C.CNOAND SC.SNO=S.SNO
3.2 注意WHERE子句中的连接顺序
SQL采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。如果需要查询成绩为90分以上的学生信息。
SQL语句1:SELECT*FROM S,SC WHERE SCORE> 90 AND S.SNO=SC.SNO因为SQL自右向左进行执行,因此查询语句先将两张表按照学号进行连接,然后筛选出符合条件的记录,表的连接是基于表的笛卡尔运算,消耗的时间会随着记录个数的增加很快地增长,因此SQL语句1是低效语句。
SQL语句2:SELECT*FROM S,SC WHERE S.SNO= SC.SNOAND SCORE>90此连接查询语句克服了SQL语句1的缺点,首先筛选出符合条件的记录,减少了进行联接的记录个数,然后再执行连接查询,大大提高了查询效率,是高效语句。
4 结论
本文介绍在数据库的开发和维护过程中,多表连接查询的优化设计可以提高系统性能,对于数据量大的数据库系统更为重要。本文介绍了的几种优化策略,在时间和空间上提高了系统的性能,在一定程度上提高了查询效率。
[1]李丹.SQL Server2005数据库管理与开发实用教程[M].北京:机械工业出版社,2010.
[2]吴洁明,周锦.基于Oracle数据库SQL查询语句优化规则的研究[J].陕西理工学院学报(自然科学版),2013(4):34-38.
Research on the Query Efficiency of SQL Database
Yao Xi
(Fujian Medical College,Fuzhou 350101,Fujian)
This paper introduces the type of connections,the operation steps of connections,and the connection syntax in SQL. It analyzes how to improve the query efficiency based on the multi-table connection,and further explains with the examples of the student database.
connections;multi-table;optimized query
TP311.13
A
1008-6609(2016)07-0108-02
姚曦,女,福建福州人,本科,讲师,研究方向:计算机应用技术。