SQL中WHERE变量IS NULL条件导致全表扫描问题的解决方法


本文整理自网络,侵删。

代码如下:

SET @SQL = 'SELECT * FROM Comment with(nolock) WHERE 1=1
    And (@ProjectIds Is Null or ProjectId = @ProjectIds)
    And (@Scores is null or Score =@Scores)'


印象中记得,以前在做Oracle开发时,这种写法是会导致全表扫描的,用不上索引,不知道Sql Server里是否也是一样呢,于是做一个简单的测试
1、建立测试用的表结构和索引:

代码如下:

CREATE TABLE aaa(id int IDENTITY, NAME VARCHAR(12), age INT)
go
CREATE INDEX idx_age ON aaa (age)
GO

2、插入1万条测试数据:

代码如下:

DECLARE @i INT;
SET @i=0;
WHILE @i<10000
BEGIN
  INSERT INTO aaa (name, age)VALUES(CAST(@i AS VARCHAR), @i)
  SET @i=@i+1;
END
GO

3、先开启执行计划显示:
在SQL Server Management Studio的查询窗口里,右击窗口任意位置,选择“包含实际的执行计划”:

4、开始测试,用下面的SQL进行测试:

代码如下:

DECLARE @i INT;
SET @i=100
SELECT * FROM aaa WHERE (@i IS NULL OR age = @i)
SELECT * FROM aaa WHERE (age = @i OR @i IS NULL)
SELECT * FROM aaa WHERE age=isnull(@i, age)
SELECT * FROM aaa WHERE age = @i

测试结果如下:

阅读剩余部分

相关阅读 >>

mysql中 char 和 varchar的区别

mysql数据库存储过程和事务的区别讲解

mybatis动态sqlif的test写法及规则详解

navicat for mysql怎么导入sql

鲜为人知的10条sql语句优化

spark学习笔记之spark sql的具体使用

c#如何实现对sql server数据库的增删改查

sql server之数据类型详解

字段值包含一批延续的字符串

关于windows server 2012上安装.net framework 3.5的问题

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...