不要在中盲目地追求一句计划

文章来源:延庆文学网  |  2021-10-29

在日常的学习和工作中,我们可以经常发现在处理SQL Server的时,很多人都会有一句出结果的习惯,但值得注意的是,不恰当的合并处理语句,往往会产生负面的性能,本篇针对使用 UNION ALL 代替 IF 语句的合并处理做出一个简单的事例,用来说明这种方法会所带来的负面结果。

示例:

表A和表B,这两个表结构一致,为不同的业务服务,现在写一个存储过程,存储过程接受一个参数,当参数为0时,查询表A,参数为1时,查询表B。

1:一般处理方法:

演示中心:会议厅、演播厅、展示厅、购物中心、车站、机场等 IF @Flag = 0 SELECT * FROM LSE IF @Flag = 1 SELECT * FROM dbo.B

2、一句处理方法:

SELECT * FROM HERE @Flag = 0UNION ALLSELECT * FROM HERE @Flag = 1

细化分析:

从语句的简捷性来看,方法b具有技巧性,它们两者之间,究竟那一个更好呢?你可能会从性能上来评估,以决定到底用那一种。单纯从语句上来看,似乎两者的效率差不多,下面通过数据测试来反映结果似乎和想像的一样。

建立测试环境:(注,此测试环境主要是为几个主题服务,因此结构看起来稍有差异)

USE tempdbGO SET NOCOUNT ON--======================================--创建测试环境--======================================RAISERROR(\"创建测试环境\", 10, 1) WITH NOWAIT-- Table ACREATE 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 -- Table BCREATE TABLE [dbo].B( [ItemNumber] [char](15) NOT NULL DEFAULT (\"\"), [CompanyCode] [char] (4) NOT NULL, [OwnerCompanyCode] [char](4) NULL, PRIMARY KEY([ItemNumber], [CompanyCode])) CREATE INDEX [ItemNumber] ON [dbo].B([ItemNumber])CREATE INDEX [CompanyCode] ON [dbo].B([CompanyCode])CREATE INDEX [OwnerCompanyCode] ON [dbo].B([OwnerCompanyCode])GO --======================================--生成测试数据--======================================RAISERROR(\"生成测试数据\", 10, 1) WITH NOWAITINSERT [dbo].A([INVNO], [ITEM])SELECT LEFT(NEWID(), 8), RIGHT(NEWID(), 15)FROM syscolumns A, syscolumns B INSERT [dbo].B([ItemNumber], [CompanyCode], [OwnerCompanyCode])SELECT RIGHT(NEWID(), 15), LEFT(NEWID(), 4), LEFT(NEWID(), 4)FROM syscolumns A, syscolumns BGO

重庆治疗妇科医院哪家好
短效降压药和长效哪个副作用大
重庆包皮包茎治疗多少钱
友情链接