转载:http://www.cnblogs.com/xuxiaona/p/4962727.html
近期做了一个存储过程,执行时发现非常的慢,竟然需要6、7秒!
经排查,发现时间主要都耗在了其中一段查询语句上。这个语句用于查出结构相同的两个表中,其中两个字段的任一个字段数据相同的记录。
例如,A表的结构如下所示:
--会员表 CREATE Table Member ( MemberID int, --会员ID MemberName varchar(50), --会员姓名 MemberPhone varchar(50) --会员电话 ) go
B表的结构与A表完全相同,假设表名为Member_Tmep。
现在Member表中有7000条不重复的数据,Member_Tmep表中有2000条数据,需要查出这两张表中,会员姓名或会员电话相同,但会员ID不相同的记录。
按照普通的逻辑,我一开始是这样写的:
select a.MemberID,a.MemberName,a.MemberPhone from Member a,Member_Tmep b where (a.MemberName = b.MemberName or a.MemberPhone = b.MemberPhone) and a.MemberID <> b.MemberID
这条语句看上去逻辑很清晰,写出来也很简洁,但执行起来为什么却那么耗费时间呢?
虽然我不清楚这条语句错在哪里,但也想到试着用另一种方式来实现这个查询,于是我把这段查询语句改成了下面这样:
--查询出会员姓名相同但ID不同的记录 select a.MemberID,a.MemberName,a.MemberPhone from Member a inner join Member_Tmep b on a.MemberName = b.MemberName and a.MemberID <> b.MemberID union --再查询出会员电话相同但ID不同的记录,进行合并 select a.MemberID,a.MemberName,a.MemberPhone from Member a inner join Member_Tmep b on a.MemberPhone = b.MemberPhone and a.MemberID <> b.MemberID
这样再执行,秒秒钟就执行完了。
其实之前也写过很多类似第一种写法的SQL语句,一直没出过这种问题,那是因为数据量没有这么大。
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。而改用union之后,性能就大大提高了。
使用"union all"的性能比"union"更高一些。因为当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序。 如果用UNION ALL替代UNION, 这样排序就不是必要了,效率就会因此得到提高。
而在上面这个例子里使用"union"而不是"union all",是因为“会员姓名相同但ID不同的记录”和“会员电话相同但ID不同的记录”可能有重复,使用"union"可以去掉重复的记录。
其实这个道理之前也有看到过,但是在编写语句的时候经常习惯性的就用了简洁的or语句,慢慢也就忘了这回事了。。。
除了上述这种情况,还有一种常见的会使用or语句的情景,那就是:查询出某字段的值等于某几个特定值的记录。
例如,需要查询出会员姓名为“张三”、“李四”的记录。我们可能会这样写:
select * from Member where MemberName = '张三' or MemberName = '李四'
通常情况下,这种写法是看不出有什么问题的,但是在数据量很大的情况下,一样会非常影响执行速度。
还有一种写法是使用in语句,例如下面这样:
select * from Member where MemberName in ('张三','李四')
但是有些说法认为in语句一样会导致全表扫描。in和not in的写法都是应该尽量避免的。
如果需要查询的特定值是连续的数值范围,如90--100,可以改用bwteen...and语句。例如:
select * from Member where MemberID between 90 and 100
如果无法使用bwteen...and,那么仍然需要使用union方法了,如:
select * from Member where MemberName = '张三' union all select * from Member where MemberName = '李四'
这里因为会员姓名为“张三”的和为“李四”的不可能有重复记录,因此可以使用性能更高的union all,而不是union了。
相关推荐
标题中的“Sql server一些常见性能问题的解决方法”是指针对SQL Server数据库系统,在处理查询和数据操作时可能会遇到的性能瓶颈及其对应的优化策略。描述提到的文档详细记载了解决这些问题的方法,旨在帮助用户提高...
标题和描述均提到了"SQL SERVER中一些常见性能问题的总结",这表明文章旨在讨论并提供解决SQL Server数据库性能瓶颈的方法。以下是对文件中提到的关键知识点的详细阐述: 1. **查询优化与索引使用**:为了避免全表...
在Oracle的编程环境中,动态SQL作为一种灵活的解决方案,能够根据不同的业务需求动态构建SQL语句,从而提供更加个性化的数据操作能力。本文将深入探讨Oracle中动态SQL的基本概念、执行原理以及具体的开发实践,旨在...
总结来说,SQL Server性能调优涉及多个层面,从使用DMV进行基础分析,到借助APM工具获取详细报告,再到利用扩展事件进行深度监控,每个方法都有其适用场景和优势。在选择调优策略时,应根据实际需求和环境来决定最...
- **问题**:在`WHERE`子句中使用`OR`可能会导致全表扫描。 - **建议**:使用`UNION ALL`来代替。 ```sql SELECT ID FROM T WHERE Num = 10 UNION ALL SELECT ID FROM T WHERE Num = 20; ``` 5. **IN和NOT ...
2. **反射调用**:对于 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 类型的对象,使用 Java 反射机制调用 `getVendorObj()` 方法,该方法返回一个 `oracle.sql.CLOB` 类型的对象。 3. **CLOB 数据读取**:无论是...
SQL性能优化是数据库管理中的关键任务,它直接影响到应用程序的响应时间和整体效率。本文主要讨论了几种常见的SQL性能优化策略。 首先,对于查询的模糊匹配,应尽量避免使用LIKE '%parm1%'这样的语法,因为百分号在...
在SQL Server中,当面临复杂的查询,特别是涉及`OR`条件的查询时,性能往往成为关注的重点。在给定的场景中,用户权限基于`site`字段中的代码来确定,`site`字段包含逗号分隔的上下级关系。原始查询语句尝试获取用户...
在SQL Server数据库管理系统中,死锁是一个常见的性能问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。死锁不仅影响数据库的正常运行,还可能导致数据一致性问题。本文将详细介绍如何在...
5. **查询重构**:优化查询逻辑,如避免在WHERE子句中使用NOT IN、IN和OR操作,转而使用JOIN或EXISTS。 6. **聚合函数与子查询优化**:合理使用GROUP BY、HAVING和子查询,避免在子查询中返回大量数据,尽量减少...
SQL优化是数据库性能优化的关键技术之一,本文将详细介绍SQL优化的各种技术和方法。 索引 索引是SQL优化的基础技术之一,索引可以加速查询速度、提高数据检索效率。常见的索引类型有: 1. 普通索引(Normal Index...
### SQL优化大全 #### 1. 优化 WHERE 子句中的 ORDER BY 和其他过滤条件 在 SQL 查询中,WHERE 子句...这些优化策略不仅可以帮助开发者解决日常工作中遇到的 SQL 性能问题,还能提升整个系统的响应速度和用户满意度。
10. SQL语句优化的技术手段:技术手段包括但不限于使用子查询优化、使用JOIN代替子查询、避免SELECT *、使用更有效的查询方法(如IN代替OR)、利用数据库提供的存储过程和函数减少网络往返次数等。 11. 经验与实践...
本篇文章将探讨如何正确地在SQL语句中混合使用`AND`和`OR`,并提供一个小技巧来解决特定场景下的问题。 首先,我们了解`AND`和`OR`的优先级。在SQL中,`AND`的优先级高于`OR`。这意味着当一个查询包含`AND`和`OR`时...
在SQL*PLUS 中使用变量453 DEFINE 454 ACCEPT 455 NEW_VALUE457 DUAL 表458 DECODE 函数459 日期转换462 运行一系列的SQL 文件465 在你的SQL 脚本中加入注释466 高级报表467 总结469 问与答469 校练场469 练习470 第...
SQL优化是提升数据库性能的关键环节,它涉及到对SQL语句的改进、索引的合理使用以及数据库配置的调整等多个方面。下面将详细讲解SQL优化的一些关键步骤和策略。 首先,了解SQL执行频率和类型是优化的第一步。通过`...
这包括如何在WHERE子句中使用子查询来过滤结果,或者在FROM子句中使用子查询来作为查询的一部分。 #### 5.2 子查询的一般用法 提供了一些关于如何编写有效子查询的实际示例,包括如何嵌套多个子查询以解决更复杂的...
15. **参数化查询**:使用参数化查询可以避免全表扫描,但如果直接在WHERE子句中使用变量,可能无法利用索引,这时可以考虑使用WITH(INDEX())来指定索引。 16. **索引的使用规则**:复合索引中,只有第一个字段被...
4. **适应性**:对于不喜欢使用其他数据库映射框架的开发者,SqlBuilder提供了一个轻量级的解决方案,可以在不影响现有架构的情况下快速集成。 在实际应用中,SqlBuilder通常包含以下几个核心功能: - **条件构造*...
2. 查询优化:分析执行计划,找出性能瓶颈,使用JOIN优化、索引策略等方法提升查询效率。 3. 存储策略:探讨行存储与列存储的区别,根据业务需求选择合适的存储方式。 五、安全性与备份恢复 1. 用户权限管理:设置...