SQL Server海量数据查询代码优化建议

1.尽量避免在WHERE子句中对字段进行NULL值判断

在WHERE子句中对字段进行NULL值判断会导致引擎放弃使用索引而进行全表扫描。如:

SELECT id FROM t WHERE num IS NULL

可以在num字段设置默认值0,确保表中 num字段没有NULL值,然后这样查询:

SELECT id FROM t WHERE num=0

2.尽量避免在WHERE子句中使用!=或<>操作符

在WHERE子句中使用!=或<>操作符将导致引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

3.尽量避免在WHERE子句中使用OR来连接条件

在WHERE子句中使用OR连接条件,将会导致引擎放弃使用索引而进行全表扫描,如:

SELECT id FROM t WHERE num=10 OR num=20

可以改成:

SELECT id FROM t WHERE num=10
UNION ALL
SELECT id FROM t WHERE num=20

 4.慎用IN和NOT IN

因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:

SELECT id FROM t WHERE num in(1,2,3)

对于连续的数值,能用BETWEEN就不要用IN

SELECT id FROM t WHERE num BETWEEN 1 AND 3

 5.尽量避免在索引过的字符数据中,使用‘%‘开头搜索。

此情况下引擎无法利用索引,如:

SELECT * FROM t WHERE name Like ‘%Jhon%‘

建议使用全文检索。

6.必要时强制查询优化器使用某个索引

如在WHERE子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能讲访问计划的选择推迟到运行时,它必须在编译时进行选择。然而,如果在编译时简历访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句会进行全表扫描:

SELECT id FROM t WHERE num = @num

可以改为强制查询使用索引:

SELECT id FROM t WITH(INDEX(索引名)) WHERE [email protected]

 7.尽量避免在WHERE子句中对字段进行表达式操作

这将导致引擎放弃使用索引而进行全表扫描。如:

SELECT * FROM t WHERE num/2=100

应该为:

SELECT * FROM t WHERE num=100*2
SELECT* FROM t WHERE SUBSTRING(num,1,4)=‘5678‘

应该为:

SELECT * FROM t WHERE num LIKE ‘5678%‘
SELECT * FROM t WHERE DATEDIFF(yy,num,GETDATE())>21

应该为:

SELECT * FROM t WHERE num<DATEADD(yy,-21,GETDATE())

即任何对列的操作都将导致表扫描,包括数据库函数、计算表达式等;查询时要尽可能将操作移至右边。

时间: 2024-11-09 10:48:07

SQL Server海量数据查询代码优化建议的相关文章

SQL Server 海量数据查询代码优化以及建议

1.应尽量避免在  where  子句中对字段进行   null  值推断,否则将导致引擎放弃使用索引而进 行全表扫描,如: select id from t where num is null 能够在num 上设置默认值0 ,确保表中num 列没有null 值,然后这样查询: select id from t where num=0 2.应尽量避免在  where  子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫 描.优化器将无法通过索引来确定将要命中的行数, 因此须要搜索该

在SQL Server中为什么不建议使用Not In子查询

原文:在SQL Server中为什么不建议使用Not In子查询     在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下       下面我们来看一下为什么尽量不使用Not In子句.   结果不准确问题     在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是"Unknow",可以理解为未定义或者未知,因此任何与Null值

Sql Server参数化查询之where in和like实现详解

来自:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html#wherein 文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以

【转载】Sql Server参数化查询之where in和like实现详解

文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以避免的要和where in和like打交道,在大多数情况下我们传的参数不多简单做下单引号.敏感字符转义之后就直接拼进了SQL,执行查询,搞定.若有一天

转载 50种方法优化SQL Server数据库查询

原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷

【转】Sql Server参数化查询之where in和like实现详解

转载至:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以避免的要和wh

【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参

转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和like实现详解中介绍了在Sql Server使用参数化查询where in的几种实现方案,遗漏了xml和表值参数,这里做一个补充 文章导读 方案5使用xml参数 方案6 使用表值参数TVP,DataTable传参 6种实现方案总结 方案5 使用xml参数 对sql server xml类型参数不熟悉的

sql server 阻塞查询

原文:sql server 阻塞查询 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后.就需要检查数据库是否有出现阻塞 当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁.再加上做了同步镜像,很消耗资源. 这时就要新建一个会话,大概需要了解以下几点: 1.当前活动会话量有多少? 2.会话运行时间? 3.会话之间有没有阻塞? 4.阻塞时间 ? 查询阻塞的方法有很多.有sql 2000 的sp_l

在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题

原文:在 SQL Server 中查询EXCEL 表中的数据遇到的各种问题 SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="D:\KK.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$] 问题: 消息 15281,级别 16,状态 1,第 1 行 SQL Server 阻止了对组件 'Ad Hoc Di