原帖地址:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207897
环境:Sql Server2000 +sp4
问题:
select datediff(day,'20040910','20040920') --这句可以执行
--而下面这句不能执行(有时也可以执行)
--sub_para为varchar(8),错误信息是:从字符串转换为 datetime 时发生语法错误。
select * from T_SUB
where item_local_code='03004'
and datediff(day,sub_para,getdate())=29
and (sub_del_flag<>1)
--而且不能执行的时候,这个语句不会返回任何记录集
select * from t_sub
where item_local_code='03004'
and isDate(sub_para)=0
-------------------------------------------------------------------------
--原因,表中创建的索引影响了条件的执行顺序
--导致先执行了 datediff(day,sub_para,getdate())
--下面的测试说明了这个问题
--测试表及数据
create table tb(
item_local_code char(5),
sub_del_flag int,
sub_para varchar(10),
constraint PK_t primary key(sub_para,item_local_code)
)
insert tb select '03004',1,'2003-1-1'
union all select '03005',1,'2003a1-1'
go
--查询语句
select * from (
select * from tb
where item_local_code='03004'
and sub_del_flag<>0
and isdate(sub_para)=1
) A where datediff(day,sub_para,getdate())>29
go
--删除测试
drop table tb
/*--测试结果
item_local_code sub_del_flag sub_para
--------------- ------------ ----------
03004 1 2003-1-1
服务器: 消息 241,级别 16,状态 1,行 3
从字符串转换为 datetime 时发生语法错误。
--*/
分享到:
相关推荐
#### 查询条件顺序对查询性能的影响 假设我们需要执行以下查询: ```sql SELECT * FROM TABLE1 WHERE A >= 1 AND B = '1' AND C ; ``` 这个查询会先检查`A >= 1`,然后是`B = '1'`,最后是`C 。这种查询条件的...
这意味着查询条件必须从索引的第一列开始,并按照索引列的顺序匹配,直到遇到范围查询(如`, `LIKE`等)或者中间缺失某列。例如,对于`name, age, id`的多列索引,查询条件`name='nginx.cn' and age in(15,16,17)`...
- **更新性能**:由于聚集索引会影响数据行的物理顺序,因此在插入、删除或更新操作时可能会引起更多的页面分裂或重组,而非聚集索引则相对较少受到影响。 - **存储空间**:聚集索引由于包含实际的数据行,因此通常...
本文将深入探讨`ORDER BY`子句在Oracle中的排序机制,以及查询时根据`IN`条件顺序输出的方法。 首先,`ORDER BY`用于指定查询结果的排序方式,可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。然而,...
- **复合索引**:如果一个查询涉及多个列,可以创建复合索引,其中列的顺序至关重要,应将最常用于筛选的列放在前面。 - **NULL值与索引**:对于包含NULL值的列,B-Tree索引可能会降低性能,因为NULL在索引中被视为...
而有了索引,数据库系统可以更快地定位到所需数据,尤其在查询条件为索引列时,执行效率显著提高。索引的存在类似于书籍的目录,帮助我们迅速找到所需内容。 8.1.2 何时使用索引 - 主键列:通常主键列自动创建聚集...
由于索引文件很小,而且索引有顺序,可以极大地提高查询的效率。 索引的存放内容 ------------------ 索引列的值(有序) 物理行地址 索引的分类 ------------- ### 聚集索引与非聚集索引 聚集索引中键值的逻辑...
本指南将深入探讨SQLServer中的索引原理及其对查询优化的影响。索引是数据库性能的关键因素,它能显著提高数据检索的速度,从而提升应用程序的响应速度。 1. **索引的基本概念** - 索引是一种数据结构,类似于书籍...
非聚焦索引则是一种索引,其中索引的逻辑顺序与磁盘上数据行的物理存储顺序不一致。在非聚焦索引中,索引结构与数据分开存储,索引条目包含了指向实际数据行的指针。 - **定义**:非聚焦索引中,索引条目包含了指向...
2. 复合索引:当多个列共同决定查询效率时,可以创建复合索引,即包含多个列的索引,顺序很重要,应根据查询条件选择最佳顺序。 3. 覆盖索引:如果查询只需要索引中的列,覆盖索引可以避免回表操作,提高查询速度。 ...
这里涉及到了“最左前缀原则”,即在使用组合索引时,查询条件必须与索引定义的字段顺序一致,并且至少包含索引的第一个字段。例如,上述索引支持如下查询: ```sql SELECT * FROM ds_order WHERE create_time = '...
- 查询模式:索引应覆盖经常出现在查询条件中的列。 - 表大小:对于小表,索引可能带来的性能提升不明显。 - 索引宽度:窄索引占用空间少,维护成本低,但可能无法覆盖更多查询;宽索引则相反。 - 使用工具:SQL...
- **背景**:在传统的索引访问路径中,如果索引列顺序与查询条件顺序不一致,则可能导致全表扫描或全索引扫描,这将大大降低查询效率。 - **解决方案**:索引跳跃扫描通过跳过不必要的索引条目,只访问那些可能...
MySQL索引是数据库中用于提高查询效率的重要组成部分。在面试过程中,常常会涉及到MySQL索引的相关问题,包括索引的原理、...避免对索引列进行函数操作或者表达式计算,尽量保持查询条件与索引列的数据类型一致。同时
* 聚簇索引与基表的物理顺序相同,非聚簇索引与基表的物理顺序不相同。 * 索引既可以直接创建,也可以间接创建。 * 可以在优化隐藏中使用索引。 * 使用查询处理器执行 SQL 语句,在一个表上一次只能使用一个索引。 *...
当查询条件与索引列的顺序不匹配,或者使用了函数或表达式来处理索引列时,MySQL同样可能无法利用索引。例如,如果索引按`timestamp`类型建立,但在查询时对`timestamp`列使用了函数处理,则索引将无法被利用。 **...
选择索引列时,应关注查询的WHERE和JOIN子句,并通过实验来评估索引对查询性能的影响。同时,注意避免在单个表上创建过多索引,以及避免索引定义的重叠。 常见的索引类型包括: 1. **唯一索引**:不允许重复值。 2....