当前位置: 首页 > 面试题库 >

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

左华灿
2023-03-14
问题内容

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

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'

我已经检查并发现没有区别。但是我在想,既然该列是CONVERTED的,那么SQL Server可能不会使用该索引,这是正确的吗?

如果这不是一个适当的问题,请原谅我。


问题答案:

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

在第一个示例中,没有直接与DateFrom列进行比较。相反,您在列上使用了一个函数。当服务器扩展它时,它必须对每个列值执行该功能,并且不对结果值建立索引。因此,不能使用索引来改善查询。

同样,在第一个示例中,您指出DateFrom列是datetime列。但是,您正在将列转换为字符串并进行字符串比较。因此,服务器将不使用您的日期时间索引。

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

这两个查询可能会产生相同的结果集,但是它们仍然有很大的不同。



 类似资料:
  • 下面是vb中的一个特殊情况。我搞乱了SuppressKeyPress属性,发现了一些奇怪的东西。 形势 假设我有一个名为的输入框,我希望名称不带任何数字,当插入数字时,会弹出一个MessageBox并报告错误。 在这种情况下,由于某种奇怪的原因,如果我键入一个数字,它将被写入文本框中,尽管我抑制了按键。 我发现,如果我删除MsgBox行,数字将不会出现在输入框中。 问题 这是怎么回事?为什么Msg

  • 我在Apache HttpClients教程中读到关闭并丢弃连接。我的问题是,当我们使用一个只管理单个连接的时,我调用我是否无法重用同一个HttpClient,因为连接已经关闭并被丢弃?

  • 当一个用户在使用_SearchAPI时,我试图收集数据,我无意中发现了一个可以放入搜索查询的标记,这可能会简化我的所有工作,但我找不到足够的信息。 a_search body中的stats标签是否会影响任何东西;结果出来了吗? 我能在上面找到的唯一信息就是这一页https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/c

  • 根据定义: noNamespaceSchema位置属性引用没有目标命名空间的XML Schema文档。 这个属性将如何改变解析的结果? 例如,以这个XML为例: 参考此模式: 我从架构中删除了以下命名空间声明: 即使在引用XML中不使用noNamespaceSchemaLocation属性,也不会引发错误。为什么我们一开始就需要这个属性?

  • 问题内容: 我确信这是有充分理由的,但是有人可以解释一下为什么缺少接口或任何类似方法吗? 集合似乎很适合放入东西,但我找不到从其中检索单个项目的优雅方法。 如果我知道我想要第一个项目,则可以使用,但否则似乎必须转换为数组才能在特定索引处检索项目? 从集合中检索数据的适当方法是什么?(除了使用迭代器之外) 我敢肯定,将其排除在API中这一事实意味着有充分的理由不这样做-有人可以启发我吗? 编辑: 这

  • 问题内容: 嵌入式注释如何影响数据库? SQL查询将如何改变? 使用注释的典型用例是什么? 问题答案: 嵌入式注释如何影响数据库? 它根本不影响它。在ORM提供程序层上,来自嵌入式实体的所有字段都 将 与父实体 合并 ,并像对待它们始终在其中声明一样。换句话说,它的工作方式就好像您将所有字段,获取器和设置器直接复制到包含嵌入式对象的实体中一样。 SQL查询将如何改变? 他们不会。您无需更改任何内容