Sql 搜索时CONVERT()对索引有什么影响?

Sql 搜索时CONVERT()对索引有什么影响?,sql,sql-server,function,indexing,Sql,Sql Server,Function,Indexing,我正在使用SQLServer2008。我在DateTime列“DateFrom”上有一个非唯一的非聚集索引。我正在根据此列搜索表。我只是想知道CONVERT()函数对索引的影响见下: Query1: SELECT * FROM myTable WHERE CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01' Query2: SELECT * FROM myTable WHERE DateFrom >= '2011-

我正在使用SQLServer2008。我在DateTime列“DateFrom”上有一个非唯一的非聚集索引。我正在根据此列搜索表。我只是想知道CONVERT()函数对索引的影响见下:

Query1:
SELECT  *
FROM    myTable
WHERE   CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01'

Query2:
SELECT  *
FROM    myTable
WHERE   DateFrom >= '2011-01-01 00:00:00.000'
我已经检查过了,没有发现任何差异。但是我在想,因为列是转换的,所以SQL Server可能不会使用索引,对吗


如果这不是一个正确的问题,请原谅。

通常,当您在WHERE子句中比较的左侧有一个函数时,服务器将无法使用引用列上的索引

在第一个示例中,没有直接与DateFrom列进行比较。而是在列上使用函数。当服务器展开此操作时,它必须对每个列值执行该函数,并且结果值不会被索引。因此,不能使用索引来改进查询

另外,在第一个示例中,您指出DateFrom列是datetime列。然而,您正在将列转换为字符串并进行字符串比较。因此,服务器将不使用datetime索引

在第二个示例中,您直接将常量值与日期列进行比较,因此服务器可以利用索引。服务器将把比较右侧的字符串常量转换为日期时间值。但是,它不会在所有情况下都使用索引。例如,如果您的行数很少,服务器可能会决定不使用索引,而只扫描这几行


两个查询可能会产生相同的结果集,但它们仍然非常不同。

o.DateFrom-o没有别名-轻微输入错误?我检查并没有发现任何差异-您是说您实际比较了执行计划并发现它们相同吗?我对此表示怀疑;第一个查询使用字符串规则比较字符串,第二个查询比较日期。如果您在2008年,并将
datetime
转换为
date
,它仍然可以使用索引,但这在很大程度上是规则的例外。@Andrew。谢谢,我已经更新了我的question@GSerg,不是因为执行计划,我只是比较了两个SQL所花费的时间。谢谢,让我在大数据上尝试一下。将整型列转换为字符串型列是这样吗?查看正在执行
.Where(x=>x.Id.ToString().Equals(searchTerm))
的EF查询,并想知道这是否会使用索引。