常见的SQL SERVER错误————WHERE子句的函数
来源:互联网 发布:杯酒释兵权知乎 编辑:程序博客网 时间:2024/05/01 09:09
继续我的SQL SERVER常见错误系列,来看更多的T-SQL错误。
错在哪里?
如果你看到这样一个查询语句,你能看出问题来吗?
select
o.OrderID
, o.CustomerID
, o.Qty
from Orders o
where datepart( yyyy, o.OrderDate) = '2010'
o.OrderID
, o.CustomerID
, o.Qty
from Orders o
where datepart( yyyy, o.OrderDate) = '2010'
如果该表有1000条数据,这可能没有问题;但是该表若是有1,000,000条数据,那么这就有问题了。为什么呢?让我们来查看他们的执行计划。
该表有1000行数据,该查询没有使用索引查询OrderDate为2010年的记录,相反该查询使用的是表扫描。原因就是WHERE子句中使用了函数,这意味着索引不能再起作用。
应该用这样的查询代替:
select
o.OrderID
, o.*
, o.Qty
from [OrderItems] o
where o.OrderDate >= '20100101'
这样,可以去掉WHERE子句中的函数,以允许查询优化器应用OrderDate 列上的索引。
在下面查询中,您会发现类似的问题
select
lastname
from Person.Contact
where left(Lastname, 1) = 'S'
lastname
from Person.Contact
where left(Lastname, 1) = 'S'
这个可以修改为,
select
lastname
from Person.Contact
where Lastname like 'S%'
lastname
from Person.Contact
where Lastname like 'S%'
通常,不应该在列上使用函数而是用另一种方式实现,这样查询就可以使用索引了。
很多时候,我们都这样写查询语句,认为这些函数是高效的。但是,它们会执行表中的每一行;导致对于大量的数据来说,比扫描更高效的查找操作不能使用索引。
当我们写查询语句的时候,要尽量避免在列上应用函数。尽可能从查询中移除函数。下一博客将会讨论计算列的相关内容!
原址地址:http://www.sqlservercentral.com/blogs/steve_jones/archive/2010/10/27/common-sql-server-mistakes-_1320_-functions-in-the-where-clause.aspx
- 常见的SQL SERVER错误————WHERE子句的函数
- 在where子句中引用取别名的列—SQLcookbook
- where子句的运用
- MYSQL的WHERE子句
- where子句的使用
- MySQL的where 子句
- Oracle数据库 —— SQL之select语句(2) where子句和数据排序
- 尽量避免在SQL语句的WHERE子句中使用函数
- Oracle 尽量避免在 SQL语句的WHERE子句中使用函数
- MonetDB的SQL手册——Trace子句
- HAVING子句与WHERE子句的区别
- where子句与having子句的区别
- SQL 语句 Where 子句项的执行次序问题
- sql 在where子句中使用的运算符
- SQL使用where子句规定选择的标准
- sql语句where子句like的用法详解
- sql语句where子句like的用法详解
- sql语句where子句like的用法详解
- 无题
- TSP问题的模拟退火算法
- 使用Lua脚本为wireshark编写自定义通信协议解析器插件
- 关于右键菜单模型设计
- Rtional Rose出现java.lang.ClassNotFoundException及不正常关闭软件工程
- 常见的SQL SERVER错误————WHERE子句的函数
- .NET Winform 开发小贴士
- SciTE可以显示中日韩阿拉伯等字符的配置
- asp.net实现下载功能
- SQL Server 2008 存储结构之DCM、BCM
- Java数据库连接
- ahk模式窗口
- oracle事务的原子性
- Adobe Flash Builder 4 注册