Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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_Sql Server_Sql Server 2008_Indexing - Fatal编程技术网

Sql 这个索引是多余的吗?

Sql 这个索引是多余的吗?,sql,sql-server,sql-server-2008,indexing,Sql,Sql Server,Sql Server 2008,Indexing,最近对相当高的流量表进行了审查,定义如下: CREATE TABLE [dbo].[SomeTable]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [SomeId] [bigint] NOT NULL, [Time] [time](0) NOT NULL, [InsertTime] [datetime] NOT NULL, [SequenceNumber] [int] NOT NULL, [OtherId] [i

最近对相当高的流量表进行了审查,定义如下:

CREATE TABLE [dbo].[SomeTable](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [SomeId] [bigint] NOT NULL,
    [Time] [time](0) NOT NULL,
    [InsertTime] [datetime] NOT NULL,
    [SequenceNumber] [int] NOT NULL,
    [OtherId] [int] NULL,
 CONSTRAINT [PK_Tracks] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
显示以下索引定义:

CREATE NONCLUSTERED INDEX [i1] ON [dbo].[SomeTable] 
(
    [SomeId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
-及-


这一方面并不是我的强项,但索引不是多余的吗?

是的,它是多余的。当有人添加了一个新索引而没有检查是否使任何现有索引冗余时,通常会出现这种情况

您会发现,描述明显冗余索引有用的情况是值得一读的。但是,由于您的表不包含大列,因此它不适用于您


作为参考,介绍如何从数据库中消除冗余索引。

是的,它是冗余的。当有人添加了一个新索引而没有检查是否使任何现有索引冗余时,通常会出现这种情况

您会发现,描述明显冗余索引有用的情况是值得一读的。但是,由于您的表不包含大列,因此它不适用于您


为了便于参考,介绍了如何从数据库中消除冗余索引。

可能,也可能不是。如果您是优化器,您将使用哪个索引进行以下查询:

select [SomeId]
from [dbo].[SomeTable]

如果该查询对于您的应用程序来说非常关键,并且表很大,那么有针对性的索引可能会很有用。但你是对的,任何可以由i1满足的查询也可以由i2满足(可能更昂贵)。

可能,可能不是。如果您是优化器,您将使用哪个索引进行以下查询:

select [SomeId]
from [dbo].[SomeTable]

如果该查询对于您的应用程序来说非常关键,并且表很大,那么有针对性的索引可能会很有用。但是你是对的,任何可以由i1满足的查询也可以由i2满足(可能更昂贵)。

在加权索引的冗余度时,你不仅应该考虑i2中额外列的宽度,还应该考虑它相对于第一列的粒度


如果
OtherId
对于
SomeId
列的每个值都有很多值,并且需要很多值,那么在where中仅使用
SomeId
进行查询将比使用它花费更多的时间,而不使用看似冗余的索引

在对索引的冗余度进行加权时,不仅要考虑
i2
中额外列的宽度,还要考虑它相对于第一列的粒度


如果
OtherId
对于
SomeId
列的每个值都有很多值,并且需要很多值,那么在where中仅使用
SomeId
进行查询将比使用它花费更多的时间,而不使用看似冗余的索引

表定义,包括聚集索引键和数据类型?第一个稍微窄一点,因此如果
OtherId
非常宽,则可以选择第一个。或者,如果
OtherId
是CI密钥的一部分,那么它也将是第一个NCI密钥的隐藏部分。对我来说,它看起来是多余的
[SomeId]
[i2]
中的前导列,可以有效地用于与
[i1]
相同的查询@spender-看不到任何关于数据类型或CI键的信息。@spender-
其他ID
只有4个字节,因此基本上是冗余的。仅通过
SomeId
查找的查询可能会从使用中获得略微减少的读取次数,但可能不值得额外的开销,除非您的数据库或多或少是只读的,并且都适合缓存,因此拥有两个非常相似的副本不会取代任何更有用的内容。。但仍然可能是冗余的。表定义包括聚集索引键和数据类型?第一个稍微窄一点,因此如果
OtherId
非常宽,则可以选择第一个。或者,如果
OtherId
是CI密钥的一部分,那么它也将是第一个NCI密钥的隐藏部分。对我来说,它看起来是多余的
[SomeId]
[i2]
中的前导列,可以有效地用于与
[i1]
相同的查询@spender-看不到任何关于数据类型或CI键的信息。@spender-
其他ID
只有4个字节,因此基本上是冗余的。仅通过
SomeId
查找的查询可能会从使用中获得略微减少的读取次数,但可能不值得额外的开销,除非您的数据库或多或少是只读的,并且都适合缓存,因此拥有两个非常相似的副本不会取代任何更有用的内容。。但可能还是多余的。