`

MS SQL 技巧系列(二)SQL查询的性能大PK之:or vs. union

阅读更多

  在sql查询的where条件语句中,可以使用and和or实现逻辑的判断。如果where比较复杂的话,就会产生and 和 or的嵌套使用,写起来会很费力气,看起来就更是一头雾水了。

  于是有人就想起了union,其实它是可以替代or的,反正就是把结果串联起来,貌似应该可以。而且,写起来更加容易,看起来也很清晰。但是不知道两个的性能如何呢?下面我就做一个比较,建立三张表,分别插入10万,100万和1000万的数据,每张表格都有8个字段,然后在三种数据量下,做三个字段的or和union,五个字段的or和union,然后通过查询时间比较一下他们的效率吧。

  硬件环境:Q8200  4GB 内存

  操作系统:Windows2003 R2

  数据库:SQL SERVER 2005

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->create database test
go
use test
go
--建立测试表1
create table table1
(
  col1 
varchar(20),
  col2 
varchar(20),
  col3 
varchar(20),
  col4 
varchar(20),
  col5 
varchar(20),
  col6 
varchar(20),
  col7 
varchar(20),
  col8 
varchar(20)
)
go
--插入10万数据
declare @i int
set @i=1
while(@i<100000)

  begin
    insert into table1 values('123','123','123','123','123','123','123','123')
    set @i=@i+1
  end

go
--建立测试表2
create table table2
(
  col1 
varchar(20),
  col2 
varchar(20),
  col3 
varchar(20),
  col4 
varchar(20),
  col5 
varchar(20),
  col6 
varchar(20),
  col7 
varchar(20),
  col8 
varchar(20)
)
go
--插入100万数据
declare @i int
set @i=1
while(@i<1000000)

  begin
    insert into table2 values('123','123','123','123','123','123','123','123')
    set @i=@i+1
  end

go
--建立测试表3
create table table3
(
  col1 
varchar(20),
  col2 
varchar(20),
  col3 
varchar(20),
  col4 
varchar(20),
  col5 
varchar(20),
  col6 
varchar(20),
  col7 
varchar(20),
  col8 
varchar(20)
)
go
--插入1000万数据
declare @i int
set @i=1
while(@i<1000000)

  begin
    insert into table3 values('123','123','123','123','123','123','123','123')
    set @i=@i+1
  end

go
--耗时4秒
select * from table1 
where col1='123' or col2='123' or col3='123' 
go
--耗时11秒
select * from table1
where col1='123' 
union all
select * from table1
where col2='123' 
union all
select * from table1
where col3='123' 
go
--耗时4秒
select * from table1 
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123' 
go
--耗时19秒
select * from table1
where col1='123' 
union all
select * from table1
where col2='123' 
union all
select * from table1
where col3='123' 
union all
select * from table1
where col4='123' 
union all
select * from table1
where col5='123' 
go

--耗时37秒
select * from table2 
where col1='123' or col2='123' or col3='123' 
go
--耗时1分53秒
select * from table2
where col1='123' 
union all
select * from table2
where col2='123' 
union all
select * from table2
where col3='123' 
go
--耗时38秒
select * from table2 
where col1='123' or col2='123' or col3='123' or col4='123' or col5='123' 
go
--耗时2分24秒
select * from table2
where col1='123' 
union all
select * from table2
where col2='123' 
union all
select * from table2
where col3='123' 
union all
select * from table2
where col4='123' 
union all
select * from table2
where col5='123' 
go


drop table table1
drop table table2
drop table table3
drop database test

 

  从上面的可以看出来使用or和union连接where条件的话,数据10w和100w没有差距,只是在1000w的时候急速增大,但是同等数据量的话,使用or和union就表现了很大的差距,尽管union写起来和看起来都比较好理解。

  结论:我想是因为每次使用union都会扫描一次表结构,or虽然难些难看,但是只扫描一次表结构,所以数据量上去的话,就会体现出来更大的优势。

  结论仅供参考,欢迎大家一起讨论。

  刚才看见一篇极限挑战—100万条数据导入SQL SERVER数据库仅用4秒 (附源码),好文章,转载一下地址。感谢作者的无私分享。

分享到:
评论

相关推荐

    sqlserver驱动包:sqljdbc4.jar

    5. **结果集处理**:`java.sql.ResultSet`接口代表了执行SQL查询后的结果。开发人员可以遍历结果集,获取和处理数据。 6. **事务管理**:JDBC驱动支持事务控制,包括开始、提交、回滚事务。这通过`Connection`对象...

    MS.SQL.Server.2008.查询性能优化.part1.rar

    MS.SQL.Server.2008.查询性能优化.part1.rar; 查询; 优化; 第一部分(共两部分)

    java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方案

    `BasicDataSource`是实现`javax.sql.DataSource`接口的一个类,用于创建和管理数据库连接池。通过配置它可以设置连接池的大小、超时时间、验证查询等参数。 3. **commons-pool.jar**:Apache Commons Pool是对象...

    信息安全技术:SQL基础.doc

    它被广泛应用于各种数据库管理系统,如MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase等。SQL主要包含两个核心部分:数据操作语言(DML)和数据定义语言(DDL)。 **数据定义语言 (DDL)** DDL用于创建...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第一卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

    Microsoft.SqlServer.Diagnostics.STrace.dll

    Sql Server 2008安装完后,Management Studio...解决办法:将Microsoft.SqlServer.Diagnostics.STrace.dll复制到C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE这个目录即可。祝大家成功!

    经典SQL语句大全 高级SQL查询技巧

    本节内容将详细介绍经典SQL语句大全 高级SQL查询技巧,涵盖了数据库的创建、删除、备份、创建新表、删除新表、增加列、添加主键、创建索引、创建视图等基本操作,还包括了高级查询运算词,如UNION、EXCEPT、...

    MS.SQL.Server.2008.查询性能优化.part2.rar

    MS.SQL.Server.2008.查询性能优化.part2.rar; 中文版

    MS SQL全系列教程

    【MS SQL全系列教程】 本教程全面覆盖了Microsoft SQL Server(简称MS SQL)的各种核心概念和技术,旨在帮助学习者从入门到精通,掌握数据库管理和开发的必备技能。SQL(Structured Query Language)是用于管理和...

    DB2 SQL性能调优秘笈

    ### DB2 SQL性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...

    《SQL Server 2008查询性能优化》扫描版[PDF] 第二卷

    《SQL Server 2008查询性能优化》(SQL Server 2008 Query Performance Tuning Distilled)扫描版[PDF] 个人感觉不错,对Sqlserver优化很有帮助,主要都是我们经常犯的错,值得借鉴:如:低性能的查询、索引、死锁等等...

    sql server 2005 技术内幕t-sql查询源码

    《SQL Server 2005 技术内幕:T-SQL查询源码》是一本深入探讨SQL Server 2005中T-SQL查询技术的专业书籍。T-SQL(Transact-SQL)是Microsoft SQL Server数据库管理系统中使用的SQL扩展版本,它在标准SQL的基础上增加...

    MS SQL SERVER 数据库技巧总结.chm

    MS SQL SERVER 数据库技巧总绍.chm &lt;br&gt;欢迎访问我的博客: http://workhelper.blogbus.com

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是SQL性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖Oracle SQL优化与调优技术,主要内容包括: 第一篇“执行计划”...

    基于MS SQL Server数据库的查询优化方法.pdf

    本文 Introduced基于MS SQL Server数据库的查询优化方法,讨论了查询优化的基本原理和MS SQL Server的查询优化方法,并提出了查询优化的指导性策略和实用方法,以提高MS SQL Server数据库的查询效率。

    sql server字段保存文件,blob操作

    在SQL Server数据库中,存储文件或二进制大对象(Binary Large Object,简称BLOB)是一种常见的需求。这里我们主要关注如何使用SQL Server中的特定字段类型来存储文件,并结合Delphi进行操作。在SQL Server 2000及...

    sql-map-2.dtd和sql-map-config-2.dtd

    在IT行业中,数据库操作是核心任务之一,而Ibatis作为一款优秀的Java持久层框架,极大地简化了数据库操作。本文将深入探讨与“sql-map-2.dtd”和“sql-map-config-2.dtd”相关的知识点,以及它们在Ibatis中的作用。 ...

    如何导入、导出 MS SQL 2000 数据库.doc

    * 高性能:MS SQL 2000 数据库提供了高性能的数据库管理功能,能够快速地处理大量数据。 * 安全:MS SQL 2000 数据库提供了多种安全机制,包括身份验证、权限控制和加密等,能够保护数据库的安全。 * 可扩展性:MS ...

Global site tag (gtag.js) - Google Analytics