SQL Server优化之SQL语句优化

合集下载

sql server 语句优化题目

sql server 语句优化题目

题目:SQL Server 语句优化随着数据量的增加和数据库应用的复杂化,SQL Server 数据库在使用过程中可能会出现性能下降的情况,而对于性能下降的根本原因通常可以追溯到 SQL 语句的性能不佳。

对 SQL Server 数据库中的 SQL 语句进行优化显得尤为重要。

本文将从 SQL 语句的优化方法、常见优化技巧和注意事项等方面展开探讨。

一、SQL 语句优化的方法1. 了解执行计划在进行 SQL 语句优化时,首先需要了解 SQL 语句的执行计划。

执行计划是 SQL Server 生成的一份详细的指导书,用于指导 SQL Server 如何执行查询。

通过查看执行计划,可以清晰地了解 SQL 语句的执行过程,找到执行效率低下的地方并进行相应的优化。

2. 使用索引索引是提高 SQL 查询效率的重要手段之一。

在 SQL 查询过程中,如果涉及到大量的数据表,没有索引的情况下,数据库引擎将对整个数据表进行扫描,导致查询性能低下。

正确使用索引可以大大提高 SQL 查询的效率。

但是,过多的索引也可能会导致性能下降,因此需要根据实际情况进行合理的索引设计和使用。

3. 优化 SQL 语句在编写 SQL 语句时,应尽量避免使用 SELECT *,而是明确指定需要查询的字段,减少不必要的数据传输和计算。

尽量将复杂的逻辑操作放到数据库层面完成,减少数据传输和网络开销,提高查询效率。

二、常见的 SQL 语句优化技巧1. 避免在 WHERE 子句中使用函数在 SQL 查询中,如果在 WHERE 子句中使用了函数,数据库引擎会对每一条记录都进行函数的计算,导致查询性能低下。

应尽量避免在WHERE 子句中使用函数,可以通过其他方法来达到相同的查询效果。

2. 使用 UNION ALL 替代 UNION在 SQL 查询中,如果使用 UNION 进行多个查询结果的合并,数据库引擎会进行重复数据的去重操作,导致性能下降。

而使用 UNION ALL 则可以避免重复数据的去重操作,提高查询效率。

sqlsqerver语句优化方法

sqlsqerver语句优化方法

sqlsqerver语句优化方法SQL Server是一种关系型数据库管理系统,可以使用SQL语句对数据进行操作和管理。

优化SQL Server语句可以提高查询和操作数据的效率,使得系统更加高效稳定。

下面列举了10个优化SQL Server语句的方法:1. 使用索引:在查询频繁的列上创建索引,可以加快查询速度。

但是要注意不要过度索引,否则会影响插入和更新操作的性能。

2. 避免使用SELECT *:只选择需要的列,避免不必要的数据传输和处理,提高查询效率。

3. 使用JOIN替代子查询:在进行关联查询时,使用JOIN操作比子查询更高效。

尽量避免在WHERE子句中使用子查询。

4. 使用EXISTS替代IN:在查询中使用EXISTS操作比IN操作更高效。

因为EXISTS只需要找到一个匹配的行就停止了,而IN需要对所有的值进行匹配。

5. 使用UNION替代UNION ALL:如果对多个表进行合并查询时,如果不需要去重,则使用UNION ALL操作比UNION操作更高效。

6. 使用TRUNCATE TABLE替代DELETE:如果要删除表中的所有数据,使用TRUNCATE TABLE操作比DELETE操作更高效。

因为TRUNCATE TABLE不会像DELETE一样逐行删除,而是直接删除整个表的数据。

7. 使用分页查询:在需要分页显示查询结果时,使用OFFSET和FETCH NEXT操作代替传统的使用ROW_NUMBER进行分页查询。

这样可以减少查询的数据量,提高效率。

8. 避免使用CURSOR:使用游标(CURSOR)会增加数据库的负载,降低查询效率。

如果可能的话,应该尽量避免使用游标。

9. 使用参数化查询:使用参数化查询可以减少SQL注入的风险,同时也可以提高查询的效率。

因为参数化查询会对SQL语句进行预编译,可以复用执行计划。

10. 定期维护数据库:定期清理过期数据、重建索引、更新统计信息等维护操作可以提高数据库的性能。

SQLSERVERSQL性能优化技巧

SQLSERVERSQL性能优化技巧

SQLSERVERSQL性能优化技巧1.选择最有效率的表名顺序(只在基于规则的优化器中有效)SQLSERVER的解析器按照从右到左的顺序处理FROM⼦句中的表名,因此FROM⼦句中写在最后的表(基础表driving table)将被最先处理,在FROM⼦句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER处理多个表时,会运⽤排序及合并的⽅式连接它们,⾸先,扫描第⼀个表(FROM⼦句中最后的那个表)并对记录进⾏排序;然后扫描第⼆个表(FROM⼦句中最后第⼆个表);最后将所有从第⼆个表中检索出的记录与第⼀个表中合适记录进⾏合并例如: 表 TAB1 16,384 条记录表 TAB2 5 条记录,选择TAB2作为基础表 (最好的⽅法) select count(*) from tab1,tab2 执⾏时间0.96秒,选择TAB2作为基础表 (不佳的⽅法) select count(*) from tab2,tab1 执⾏时间26.09秒;如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引⽤的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L,CATEGORY C,EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCN将⽐下列SQL更有效率SELECT *FROM EMP E ,LOCATION L ,CATEGORY CWHERE E.CAT_NO = C.CAT_NOAND E.LOCN = L.LOCNAND E.EMP_NO BETWEEN 1000 AND 20002.WHERE⼦句中的连接顺序SQLSERVER采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾例如:(低效,执⾏时间156.3秒)SELECT *FROM EMP EWHERE SAL > 50000AND JOB = 'MANAGER'AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(⾼效,执⾏时间10.6秒)SELECT *FROM EMP EWHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)AND SAL > 50000AND JOB = 'MANAGER';3.SELECT⼦句中避免使⽤'*'。

SQLServer数据库性能调优技巧

SQLServer数据库性能调优技巧

SQLServer数据库性能调优技巧第一章:SQLServer数据库性能调优概述SQLServer是一种常用的关系型数据库管理系统,在大型企业和云计算环境中广泛应用。

为了确保数据库的高性能和可靠性,进行数据库性能调优非常重要。

本章将介绍SQLServer数据库性能调优的概念和目标。

1.1 数据库性能调优的概念数据库性能调优是指通过分析和优化数据库的结构、查询、索引、存储和配置等方面的问题,以提高数据库系统的效率和性能。

优化数据库性能可以显著提升数据的访问速度、减少系统响应时间和提高数据库的处理能力。

1.2 数据库性能调优的目标数据库性能调优的主要目标是提高数据库的运行效率和用户的体验,具体目标包括:- 提高数据的访问速度:通过合理的查询优化和索引设计,加快数据的检索速度。

- 减少系统响应时间:通过调整数据库配置、优化SQL 查询和提高硬件性能等措施,缩短系统响应时间。

- 提高数据库的处理能力:通过合理的分区设计、并行处理和负载均衡等措施,提高数据库的并发处理能力。

第二章:SQLServer数据库性能调优基础在进行SQLServer数据库性能调优之前,有几个基础概念需要了解,包括数据库的结构、查询执行计划和索引等。

2.1 数据库的结构SQLServer数据库由多个表组成,每个表由多个行和列组成。

表有一定的关系,通过主键和外键来建立关联。

了解数据库的结构对于进行性能调优非常重要。

2.2 查询执行计划查询执行计划是SQLServer数据库执行查询语句时的执行路径和操作过程的详细描述。

通过分析查询执行计划,可以找到潜在的性能问题,并进行相应的优化。

2.3 索引索引是一种特殊的数据库对象,用于加快查询速度。

常见的索引类型包括聚集索引、非聚集索引和全文索引等。

合理设计索引可以提高查询的性能。

第三章:SQLServer数据库性能调优技巧本章将介绍一些常用的SQLServer数据库性能调优技巧,包括查询优化、索引优化、配置优化和硬件优化等。

SQL Server数据库性能优化之SQL语句篇

SQL Server数据库性能优化之SQL语句篇

SQL Server数据库性能优化之SQL语句篇sqlserver数据库性能优化之sql语句篇sqlserver数据库性能优化之sql语句篇(转自重名鸟bolgjava)近期项目须要,搞了一段时间的sqlserver性能优化,碰到了一些问题,也累积了一些经验,现总结一下,与君共享资源。

sqlserver性能优化牵涉至许多方面,例如较好的系统和数据库设计,优质的sql撰写,最合适的数据表索引设计,甚至各种硬件因素:网络性能、服务器的性能、操作系统的性能,甚至网卡、交换机等。

这篇文章主要谈至如何提升sql语句,还将存有另一篇探讨如何提升索引。

如何改善sql语句的一些原则:1.按须要索要字段,跟“select*”说道拜拜字段的提取一定要按照“用多少提多少”的原则,避免使用“select*”这样的操作。

做了这样一个实验,表tbla有1000万数据:selecttop10000c1,c2,c3,c4fromtblaorderbyc1desc--用时:4673毫秒selecttop10000c1,c2,c3fromtblaorderbyc1desc--用时:1376毫秒selecttop10000c1,c2fromtblaorderbyc1desc--用时:80毫秒由此看来,我们每少提取一个字段,数据的提取速度就会有相应的提升。

但提升的速度还要看您舍弃的字段的大小来判断。

另外,关于“select*“的问题,可以参照这篇文章:2.字段名和表名要写规范,注意大小写这一点必须多特别注意,如果大小写弄错的话,虽然sql仍然能够正常继续执行,但数据库系统会花一定的开支和时间先要把您写下的规范成恰当的,然后再继续执行sql。

写下对的话,这个时间就省了。

正常的:selecttop10dtetransaction,txtsystem_idfromtbltransactionsystem不小心的:selecttop10dtetransaction,txtsystem_idfromtbltransactionsystem3.适度采用过渡阶段表中把表的一个子集进行排序并创建临时表,有时能加速查询。

SQL Server语句优化

SQL Server语句优化

THANKS
谢谢观赏
很多时候用 exists 代替 in 是一个好的选择
SQL Server语句优化
LIKE操作符可以应用通配符查询,里面的通配符组合可能达 到几乎是任意的查询,但是如果用得不好则会产生性能上的问 题。 like ‘a%’ 使用索引, like ‘%a’ 不使用索引, 尽量避免用select * from t where name like '%x%'类型的模糊 查询,因为%在前面的话是无法利用到索引,应该找寻替代方 式或用前置条件语句把like查找之前的行数减到最低。
SQL Server语句优化
select count(*) from table;这样不带任何条件的count会引起 全表扫描,并且没有任何业务意义,是一定要杜绝的。用 count(1)代替count(*)
任何地方都不要使用 select * from t ,用具体的字段列表代替 “*”,不要返回用不到的任何字段。
SQL Server语句优化
注意Union和Union all 的区别。 union和union all的区别是,union会自动压缩多个结果集合 中的重复结果,而union all则将所有的结果全部显示出来,不管 是不是重复。 Union:对两个结果集进行并集操作,不包括重复行,同 时进行默认规则的排序; Union All:对两个结果集进行并集操作,包括重复行,不 进行排序; 推荐方案:采用UNION ALL操作符替代UNION,因为 UNION ALL操作只是简单的将两个结果合并后就返回。
SQL Server语句优化
避免频繁创建和删除临时表,以减少系统表资源的消耗。临时 表并不是不可使用,适当地使用它们可以使某些例程更有效, 例如,当需要重复引用大型表或常用表中的某个数据集时。但 是,对于一次性事件, 最好使用导出表。

SQLServer数据库sql语句性能优化

SQLServer数据库sql语句性能优化

SQLServer数据库sql语句性能优化分析⽐较执⾏时间计划读取情况1. 查看执⾏时间和cpuset statistics time onselect * from Bus_DevHistoryDataset statistics time off执⾏后在消息⾥可以看到2. 查看查询对I/O的操作情况set statistics io onselect * from Bus_DevHistoryDataset statistics io off执⾏之后的结果:扫描计数:索引和表执⾏次数逻辑读取:数据缓存中读取的页数物理读取:从磁盘中读取的页数预读:查询过程中,从磁盘放⼊缓存的页数lob逻辑读取:从数据缓存中读取image、text、ntext或⼤型数据的页数lob物理读取:从磁盘中读取image、text、ntext或⼤型数据的页数lob预读:查询过程中,从磁盘放⼊缓存的image、text、ntext或⼤型数据的页数如果物理读取次数和预计次数⽐较多,可以使⽤索引进⾏优化。

上述两种信息的查看如果不想写sql,可以通过设置完成:⼯具->选项3. 查看执⾏计划选中查询语句,点击⼀、数据库设计优化1、不要使⽤游标。

使⽤游标不仅占⽤内存,⽽且还⽤不可思议的⽅式锁定表,它们可以使DBA所能做的⼀切性能优化等于没做。

游标⾥每执⾏⼀次fetch就等于执⾏⼀次select。

2、创建适当的索引每当为⼀个表添加⼀个索引,select会更快,可insert和delete却⼤⼤变慢,因为创建了维护索引需要许多额外的⼯作。

(1)采⽤函数处理的字段不能利⽤索引(2)条件内包括了多个本表的字段运算时不能进⾏索引3、使⽤事务对于⼀些耗时的操作,使⽤事务可以达到很好的优化效果。

4、⼩⼼死锁按照⼀定的次序来访问你的表。

如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。

如果某个存储过程先锁定表B,再锁定表A,这可能会导致⼀个死锁。

SQLServer数据库的性能优化

SQLServer数据库的性能优化

SQLServer数据库的性能优化随着企业数据量不断增长,数据库系统已经成为企业不可或缺的一部分。

随之而来的问题是,在应对海量数据的同时,如何保证数据库系统的高效运行,以满足业务需要。

而数据库性能优化就是为了解决这一问题而存在的。

但是,由于SQLServer数据库系统具有复杂性和高度的可配置性,使得数据库性能优化成为了非常复杂的工作。

如果我们没有足够的知识与技巧,很容易导致不经意间影响数据库系统的正常工作。

本文将介绍SQLServer数据库性能优化的关键点。

1. 容量规划在数据库性能优化的开始阶段,我们需要明确数据库的容量规划,该规划应该包含这些内容:- 确认数据库的大小和增长趋势;- 选择合适的服务器硬件配置;- 选择合适的存储设备和存储配置;- 确认数据库备份和还原方案。

当确认好这些规划后,我们可以愉快地开启数据库系统的优化之旅了。

2. 关注I/O操作I/O操作是数据库性能优化中最重要的因素之一。

在SQLServer 中,我们需要通过以下几点来关注IO操作:- 确认合适的RAID配置;- 选择合适的磁盘类型;- 确认合适的磁盘块大小。

对于I/O操作的优化,我们可以在两个方面进行,一个是硬件方面,另一个则是SQLServer配置。

硬件方面,我们需要考虑到一下几个方面:- 升级服务器硬件设备;- 将磁盘储存设备升级为SSD硬盘;- 增加内存的容量。

对于SQLServer的配置,则可以通过以下几点进行:- 合适的磁盘和RAID配置;- 合适的max degree of parallelism 配置;- 合适的max server memory配;3. 使用合适的索引在SQLServer中,索引的作用是加速数据查询和数据修改,从而提高整个数据库系统的运行效率。

而在使用索引时,我们需要特别注意这些要素:- 创建索引可以减少IO操作;- 索引优化的关键点是选择合适的包含数据条目最多的列;- 在大型多元素表中使用Clustered Index;- 对于包含大量重复元素的列,可以直接采用非聚集索引。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一切都是为了性能,一切都是为了业务 (2)二、执行顺序 (3)三、只返回需要的数据 (4)四、尽量少做重复的工作 (5)五、注意临时表和表变量的用 (6)六、子查询的用法 (7)七:尽量使用索引 (10)八:多表连接的连接条件对索引的选择有着重要的意义,所以我们在写连接条件条件的时候需要特别注意。

(15)一切都是为了性能,一切都是为了业务一、查询的逻辑执行顺序(1) FROM left_table(3) join_type JOIN right_table (2) ON join_condition(4) WHERE where_condition(5) GROUP BY group_by_list(6) WITH {cube | rollup}(7) HAVING having_condition(8) SELECT (9) DISTINCT (11) top_specification select_list(9) ORDER BY order_by_list标准的SQL 的解析顺序为:(1) FROM 子句组装来自不同数据源的数据(2) WHERE 子句基于指定的条件对记录进行筛选(3) GROUP BY 子句将数据划分为多个分组(4) 使用聚合函数进行计算(5) 使用HAVING子句筛选分组(6) 计算所有的表达式(7) 使用ORDER BY对结果集进行排序二、执行顺序1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt12. ON: 对vt1表应用ON筛选器只有满足join_condition 为真的行才被插入vt23. OUTER(join):如果指定了OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束。

4. WHERE:对vt3应用WHERE 筛选器只有使where_condition 为true的行才被插入vt45. GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt56. CUBE|ROLLUP:把超组(supergroups)插入vt6,生成vt67. HAVING:对vt6应用HAVING筛选器只有使having_condition 为true的组才插入vt78. SELECT:处理select列表产生vt89. DISTINCT:将重复的行从vt8中去除产生vt910. ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc1011. TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者看到这里,那么用过Linq to SQL的语法有点相似啊?如果我们我们了解了SQL Server执行顺序,那么我们就接下来进一步养成日常SQL的好习惯,也就是在实现功能的同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实际就是批量运算,就是尽量减少在客户端进行大数据量的循环操作,而用SQL语句或者存储过程代替。

三、只返回需要的数据返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器、网络和客户端的无效劳动,其害处是显而易见的,避免这类事件需要注意:A、横向来看(1) 不要写SELECT * 的语句,而是选择你需要的字段。

(2) 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上。

这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

如有表table1(ID,col1)和table2(ID,col2)Select A.ID, A.col1, B.col2-- Select A.ID, col1, col2 –不要这么写,不利于将来程序扩展from table1 A inner join table2 B on A.ID=B.ID Where …B、纵向来看(1) 合理写WHERE子句,不要写没有WHERE的SQL语句。

(2) SELECT TOP N * –没有WHERE条件的用此替代。

四、尽量少做重复的工作A、控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的。

B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。

C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。

D、合并对同一表同一条件的多次UPDATE,比如UPDATE EMPLOYEE SET FNAME='HAIWER'WHERE EMP_ID=' VPA30890F'UPDATE EMPLOYEE SET LNAME='YANG'WHERE EMP_ID=' VPA30890F'这两个语句应该合并成以下一个语句UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG'WHERE EMP_ID=' VPA30890F'E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,虽然功能相同,但是性能差别是很大的。

五、注意临时表和表变量的用在复杂系统中,临时表和表变量很难避免,关于临时表和表变量的用法,需要注意:A、如果语句很复杂,连接太多,可以考虑用临时表和表变量分步完成。

B、如果需要多次用到一个大表的同一部分数据,考虑用临时表和表变量暂存这部分数据。

C、如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。

D、其他情况下,应该控制临时表和表变量的使用。

E、关于临时表和表变量的选择,很多说法是表变量在内存,速度快,应该首选表变量,但是在实际使用中发现:(1) 主要考虑需要放在临时表的数据量,在数据量较多的情况下,临时表的速度反而更快。

(2) 执行时间段与预计执行时间(多长)F、关于临时表产生使用SELECT INTO和CREATE TABLE + INSERT INTO的选择,一般情况下:SELECT INTO会比CREATE TABLE + INSERT INTO的方法快很多,但是SELECT INTO会锁定TEMPDB的系统表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用户并发环境下,容易阻塞其他进程。

所以我的建议是,在并发系统中,尽量使用CREATE TABLE + INSERT INTO,而大数据量的单个语句使用中,使用SELECT INTO。

六、子查询的用法子查询是一个SELECT 查询,它嵌套在SELECT、INSERT、UPDATE、DELETE 语句或其它子查询中。

任何允许使用表达式的地方都可以使用子查询,子查询可以使我们的编程灵活多样,可以用来实现一些特殊的功能。

但是在性能上,往往一个不合适的子查询用法会形成一个性能瓶颈。

如果子查询的条件中使用了其外层的表的字段,这种子查询就叫作相关子查询。

相关子查询可以用IN、NOT IN、EXISTS、NOT EXISTS引入。

关于相关子查询,应该注意:(1) NOT IN、NOT EXISTS的相关子查询可以改用LEFT JOIN代替写法。

比如:SELECT PUB_NAME FROM PUBLISHERS WHERE PUB_ID NOTIN (SELECT PUB_ID FROM TITL ES WHERE TYPE ='BUSINESS')可以改写成:SELECT A.PUB_NAME FROM PUBLISHERS A LEFTJOIN TITLES B ON B.TYPE ='BUSINESS' AND A.PUB_ID=B. PUB_ID WHERE B.PUB_ID IS NULL比如NOT EXISTS:SELECT TITLE FROM TITLESWHERE NOT EXISTS(SELECT TITLE_ID FROM SALES WHERE TITLE_ID = TITLES.TITLE_ID)可以改写成:SELECT TITLEFROM TITLES LEFTJOIN SALESON SALES.TITLE_ID = TITLES.TITLE_IDWHERE SALES.TITLE_ID ISNULL2)如果保证子查询没有重复,IN、EXISTS的相关子查询可以用INNER JOIN 代替。

比如:SELECT PUB_NAMEFROM PUBLISHERSWHERE PUB_ID IN(SELECT PUB_IDFROM TITLESWHERE TYPE ='BUSINESS')可以改写成:SELECT A.PUB_NAME --SELECT DISTINCT A.PUB_NAME FROM PUBLISHERS A INNERJOIN TITLES BON B.TYPE ='BUSINESS'ANDA.PUB_ID=B. PUB_ID(3) IN的相关子查询用EXISTS代替,比如:SELECT PUB_NAME FROM PUBLISHERSWHERE PUB_ID IN(SELECT PUB_ID FROM TITLES WHERE TYPE ='BUSINESS')可以用下面语句代替:SELECT PUB_NAME FROM PUBLISHERS WHERE EXISTS (SELECT1FROM TITLES WHERE TYPE ='BUSINESS'ANDPUB_ID= PUBLISHERS.PUB_ID)4)不要用COUNT(*)的子查询判断是否存在记录,最好用LEFT JOIN或者EXISTS,比如有人写这样的语句:SELECT JOB_DESC FROM JOBSWHERE (SELECTCOUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)=0应该改成:SELECT JOBS.JOB_DESC FROM JOBS LEFTJOIN EMPLOYEEON EMPLOYEE.JOB_ID=JOBS.JOB_IDWHERE EMPLOYEE.EMP_ID ISNULLSELECT JOB_DESC FROM JOBSWHERE (SELECT COUNT(*) FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)应该改成:SELECT JOB_DESC FROM JOBSWHEREEXISTS (SELECT 1 FROM EMPLOYEE WHERE JOB_ID=JOBS.JOB_ID)七:尽量使用索引建立索引后,并不是每个查询都会使用索引,在使用索引的情况下,索引的使用效率也会有很大的差别。

相关文档
最新文档