Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库表中的可搜索日期字段是否应始终编制索引?_Sql_Database_Datetime_Clustered Index - Fatal编程技术网

Sql 数据库表中的可搜索日期字段是否应始终编制索引?

Sql 数据库表中的可搜索日期字段是否应始终编制索引?,sql,database,datetime,clustered-index,Sql,Database,Datetime,Clustered Index,如果我在某个日期类型的表中有一个字段,并且我知道我将始终使用比较来搜索该字段,如、或如果每次都要扫描整个表,请不要对其进行索引。我希望数据库尝试进行范围扫描,因此我会添加索引,但我使用SQL Server,在大多数情况下它都会使用索引。但是不同的数据库都不使用索引。根据数据的不同,我会更进一步,并建议如果要在查询之间执行,可以使用聚集索引,以避免表扫描。还有更多不好的原因 但是,如果索引是非聚集的且不可用,则搜索列上的索引可能不够。像这样的查询通常很适合使用聚集索引,但是覆盖索引也同样适用。虽然

如果我在某个日期类型的表中有一个字段,并且我知道我将始终使用比较来搜索该字段,如、
如果每次都要扫描整个表,请不要对其进行索引。我希望数据库尝试进行范围扫描,因此我会添加索引,但我使用SQL Server,在大多数情况下它都会使用索引。但是不同的数据库都不使用索引。

根据数据的不同,我会更进一步,并建议如果要在查询之间执行
,可以使用聚集索引,以避免表扫描。

还有更多不好的原因


但是,如果索引是非聚集的且不可用,则搜索列上的索引可能不够。像这样的查询通常很适合使用聚集索引,但是覆盖索引也同样适用。

虽然索引有助于查询表,但它也会降低插入、更新和删除的速度。如果表中的更改比查询中的更改多得多,索引可能会影响整体性能。

不在要搜索的字段上添加索引的唯一原因是维护索引的成本超过了它的好处

这可能发生在以下情况:

  • 您的桌上有一个非常棘手的
    DML
  • 该指数的存在使其速度慢得令人无法忍受,而且
  • 使用fast
    DML
    比使用fast查询更重要

如果不是这样,那么就创建索引。如果优化器认为不需要它,它就不会使用它。

这是一个很好的例子,说明了为什么这既是科学又是艺术。一些考虑:

  • 数据多久添加一次到此表中?如果读取/搜索的次数远远多于添加/更改的次数(将数据转储到某些表中以进行报告的整个时间点),那么您可能会对索引发疯。ID字段可能需要更多的聚集索引,但可以有很多多列索引(其中日期字段较晚,索引中较早列出的列可以很好地减少结果集)和覆盖索引(所有返回的值都在索引中,因此速度非常快,就像您开始搜索聚集索引一样)

  • 如果表经常被编辑/添加到,或者您的存储空间有限,因此无法拥有大量索引,那么您必须更加小心地使用索引。如果您的日期条件通常提供大量数据,并且您不经常在其他字段上搜索,那么您可以为该日期字段提供聚集索引,但请考虑以下问题:在此之前的每一次。聚集索引位于一个简单的自动编号字段上对所有索引都是一种奖励。非覆盖索引使用聚集索引压缩到结果集的记录。不要将聚集索引移动到日期字段,除非搜索的大部分都在该日期字段上。这是核选择

  • 如果您不能拥有大量的覆盖索引(表中的数据变化很大,空间有限,结果集很大且多种多样),和/或您确实需要另一列的聚集索引,并且典型的日期条件提供了广泛的记录,您必须进行大量搜索,您会遇到问题。如果您可以将数据转储到报告表中,请这样做。如果您不能,则您必须仔细平衡所有这些竞争因素。可能对于前2-3个搜索,您需要尽可能地最小化结果集列,并配置覆盖索引,剩下的部分则通过一个简单的非聚集索引来完成


你可以看到为什么优秀的db人员应该得到很好的报酬。我知道很多因素,但我羡慕人们能够快速、正确地平衡所有这些因素,而不必进行大量分析。

如果表很小,它可能永远不会使用索引,因此添加索引可能只是浪费资源

有些数据类型(如SQL Server中的图像)和数据分布不太可能使用或无法使用索引。例如,在SQL Server中,索引位字段是没有意义的,因为数据中没有足够的可变性,索引无法发挥任何作用


如果您通常使用like子句和通配符作为第一个字符进行查询,则不会使用索引,因此创建索引是另一种浪费资源的行为。

您能解释一下为什么每次都要扫描整个表吗?您的意思是如果我有其他参数已经需要扫描,如
Active=1
?抓起电话簿,然后执行以下操作:对“琼斯”进行范围扫描,现在假设电话簿是随机排列的,并进行一次完整的表格扫描(从封面到封面),查找所有“琼斯”的名字。哪一个更快?当然是范围扫描。我问的是“如果你想每次扫描整个表格,请不要索引它。”有什么理由我每次都要扫描整个表吗?不是我,我说,
我会添加索引
@gbn提出了关于覆盖其他列的有效观点,但是问题没有足够的信息来进行完整的索引分析。我的错。误解了语气。+1谢谢你的帮助。数据操作语言(插入、更新、删除、选择)与DDL(数据定义语言)相反,如创建、删除等。