查看: 462|回复: 0

Sql Server 多条件查询优化

 关闭 [复制链接]

签到天数: 2596 天

连续签到: 10 天

[LV.Master]至尊海神IIIIII

发表于 2010-10-19 20:53 | 显示全部楼层 |阅读模式
Sql Server 多条件查询优化

      在存储过程中编写多条件的查询语句,很多人习惯用字符串拼接去做,字符串的拼接虽然灵活但是效率却不是很理想,因为查询语句属于字符串拼接出来,每次调用存储过程需要重新编译查询语句。
      如果需要高效的查询,告别拼接吧,废话不多说,看下面的代码:
USE [MASTER]
GO
IF  EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME = N'TEST')
DROP DATABASE [TEST]
CREATE DATABASE TEST
GO
USE [TEST]
GO
CREATE TABLE [TAB1]
(
A VARCHAR(10),
B VARCHAR(10),
C VARCHAR(10),
D VARCHAR(10),
)
GO
INSERT INTO [TAB1] VALUES('A','B','C','D')
GO
/*
1.字符串拼接查询语句
*/
CREATE PROC [PROC1]
@A VARCHAR(10)=NULL,
@B VARCHAR(10)=NULL,
@C VARCHAR(10)=NULL,
@D VARCHAR(10)=NULL
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT * FROM [TAB1] WHERE 1=1 '
IF @A IS NOT NULL
  SET @SQL=@SQL+'AND [A]='''+@A+''''
IF @B IS NOT NULL
  SET @SQL=@SQL+'AND [B]='''+@B+''''
IF @C IS NOT NULL
  SET @SQL=@SQL+'AND [C]='''+@C+''''
IF @D IS NOT NULL
  SET @SQL=@SQL+'AND [D]='''+@D+''''
EXEC(@SQL)
END
GO
/*
2.高效的查询语句
*/
CREATE PROC [PROC2]
@A VARCHAR(10)=NULL,
@B VARCHAR(10)=NULL,
@C VARCHAR(10)=NULL,
@D VARCHAR(10)=NULL
AS
BEGIN
SELECT * FROM [TAB1] WHERE
  ((@A IS NOT NULL AND [A]=@A) OR (@A IS NULL)) AND
  ((@B IS NOT NULL AND [B]=@B) OR (@B IS NULL)) AND
  ((@C IS NOT NULL AND [C]=@C) OR (@C IS NULL)) AND
  ((@D IS NOT NULL AND [D]=@D) OR (@D IS NULL))
END
代码不多,下面测试一下两个存储过程的性能
proc1 循环100次 耗时:0.156秒
proc1 循环200次 耗时:0.373秒
proc1 循环300次 耗时:0.733秒
proc2 循环100次 耗时:0.106秒
proc2 循环200次 耗时:0.326秒
proc2 循环300次 耗时:0.623秒
备注:此结果不能作为性能提升依据
<
PCOS系统下载站:http://zhuangji.wang

本版积分规则