避免把判断处理放入WHERE 条件-金宇
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> ADP及SQL SERVER


避免把判断处理放入WHERE 条件

发表时间:2008/7/18 8:39:40 评论(0) 浏览(6052)  评论 | 加入收藏 | 复制
   
摘 要:避免把判断处理放入WHERE 条件
正 文:

问题描述

    业务需求如下:

    有表A,在查询的时候,需要根据标志确定是查询大于某个值的记录,还是小于某个值的记录

 

A、一般的处理方法

IF @a = 0

    Select [TranNumber] FROM A

    Where [TranNumber] < 10000

ELSE IF @a = 1

    Select [TranNumber] FROM A

    Where [TranNumber] > 10000

 

B、一句的处理方法

Select [TranNumber] FROM A

Where

    (@a = 0 AND [TranNumber] < 10000)

    or

    (@a = 1 AND [TranNumber] > 10000)

 

分析

    从语句的简捷性来看,方法B具有技巧性,它们两者之间,究竟那一个更好呢?你可能会从性能上来评估,以决定到底用那一种。单纯从语句上来看,两者的效率差别应该不会非常大,实际测试的结果会如我们想象吗?继续往下看

 

建立测试环境(注,此测试环境是为几个主题服务的,因此结构看起来有些怪异)

USE tempdb

GO

 

SET NOCOUNT ON

--======================================

--创建测试环境

--======================================

RAISERROR('创建测试环境', 10, 1) WITH NOWAIT

-- Table A

Create TABLE [dbo].A(

    [TranNumber] [int] IDENTITY(1, 1) NOT NULL,

    [INVNO] [char](8) NOT NULL,

    [ITEM] [char](15) NULL DEFAULT (''),

    PRIMARY KEY([TranNumber])

)

 

Create INDEX [indexONinvno] ON [dbo].A([INVNO])

Create INDEX [indexOnitem] ON [dbo].A ([ITEM])

Create INDEX [indexONiteminnvo] ON [dbo].A([INVNO], [ITEM])

GO

 

--======================================

--生成测试数据

--======================================

RAISERROR('生成测试数据', 10, 1) WITH NOWAIT

Insert [dbo].A([INVNO], [ITEM])

Select LEFT(NEWID(), 8), RIGHT(NEWID(), 15)

FROM syscolumns A, syscolumns B

GO

 

进行性能测试

DECLARE @a int

SET @a = 0

 

DECLARE @t TABLE(

    id int IDENTITY,

    a int, b int)

DECLARE @dt datetime, @loop int, @id int

SET @loop = 1

WHILE @loop < 10

BEGIN

    SET @loop = @loop + 1

    RAISERROR('test %d', 10, 1, @loop) WITH NOWAIT

    SET @dt = GETDATE()

        IF @a = 0

            Select * FROM A

            Where [TranNumber] < 10000

        ELSE IF @a = 1

            Select * FROM A

            Where [TranNumber] > 10000

    Insert @t(a) VALUES(DATEDIFF(ms, @dt, GETDATE()))

    Select @id = SCOPE_IDENTITY(), @dt = GETDATE()

        Select * FROM A

        Where

            (@a = 0 AND [TranNumber] < 10000)

            or

            (@a = 1 AND [TranNumber] > 10000)

    Update @t SET b = DATEDIFF(ms, @dt, GETDATE())

    Where id = @id

END

Select * FROM @t

UNION ALL

Select NULL, SUM(a), SUM(b) FROM @t

 

性能测试结果

id          a         &nb


Access软件网交流QQ群(群号:198465573)
 
 相关文章
判断InputBox界面点击了确定还是取消按钮的方法  【叶海峰  2013/4/20】
如何判断是否以独占方式打开当前数据库?  【杜超-2号  2013/4/27】
【Access基础】判断表中是否有负数存在  【缪炜  2013/5/3】
【Access基础】判断文本框中是否存在非数字字符/文本框只能输入...  【缪炜  2013/5/24】
sqlserver中判断表或临时表是否存在  【平常心  2013/7/22】
常见问答
技术分类
相关资源
文章搜索
关于作者

金宇

文章分类

文章存档

友情链接