Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > ADP及SQL SERVER

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

时 间:2008-07-18 08:39:40
作 者:邹建   ID:43  城市:江阴
摘 要:避免把判断处理放入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群 (群号:483923997)       Access源码网店


常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助