Sql server 针对包含表的所有列的索引的查询是否与针对表本身的查询一样高效?
我在SQL Server中创建了如下表:Sql server 针对包含表的所有列的索引的查询是否与针对表本身的查询一样高效?,sql-server,sql-server-2014,database-performance,Sql Server,Sql Server 2014,Database Performance,我在SQL Server中创建了如下表: CREATE TABLE [dbo].[WordForm] ( [WordFormId] VARCHAR (20) NOT NULL, [Ascii] AS (ascii([WordFormId])) PERSISTED, [WordId] VARCHAR (20) NOT NULL, [Primary] BIT DEFAULT ((0)
CREATE TABLE [dbo].[WordForm] (
[WordFormId] VARCHAR (20) NOT NULL,
[Ascii] AS (ascii([WordFormId])) PERSISTED,
[WordId] VARCHAR (20) NOT NULL,
[Primary] BIT DEFAULT ((0)) NOT NULL,
[PosId] INT NOT NULL,
[Definition] VARCHAR (MAX) NULL,
[Sample1] VARCHAR (MAX) NULL,
[Synonym] VARCHAR (100) NULL,
[CreatedBy] INT NOT NULL,
[CreatedDate] DATETIME NOT NULL,
[ModifiedBy] INT NOT NULL,
[ModifiedDate] DATETIME NOT NULL,
[Version] ROWVERSION NOT NULL,
[Sample2] VARCHAR (MAX) NULL,
[Sample3] VARCHAR (MAX) NULL,
[Sample4] VARCHAR (MAX) NULL,
[Sample5] VARCHAR (MAX) NULL,
PRIMARY KEY CLUSTERED ([WordFormId] ASC),
CONSTRAINT [FK_WordFormPos] FOREIGN KEY ([PosId]) REFERENCES [dbo].[Pos] ([PosId]),
CONSTRAINT [FK_WordFormWord] FOREIGN KEY ([WordId]) REFERENCES [dbo].[Word] ([WordId])
);
我使用了WordFormId
作为主键,因为它是唯一的,很容易查找
现在在我的前端,我意识到创建一个身份密钥可能有一个优势
并将其用作此表的主键,而不是WordFormId。请注意,要将事物放在透视图中,此表将
最多可容纳9000行。数据很少被插入、添加和更新,所以我不关心更新索引所花费的时间
我现在想做的是:
a) 添加标识列作为主键
b) 按WordId为每一列和顺序创建索引
如果我要做这两件事(a)和(b),这对查询是否同样有效?我的想法是
查询大部分时间都会使用索引,这与
以前,我使用WordId作为主键。目前,您有
WordFormID
的聚集索引。如果所有查询都使用WordFormID
作为条件并返回大多数字段,那么当前的解决方案可能是最好的。而且,9000条记录几乎什么都不是。包含表中所有列的索引就是表本身,或者说只是表的一个副本。这就是聚集索引。我忘了-如果你想使用另一个字段(ID
)作为主键,不要将其聚集-保持聚集索引不变,一切都会好起来:)@jeroenmoster-谢谢。因此,如果索引更新时间不是问题,您认为查询会使用该索引吗。例如,如果我做了一个查询,其中WordFormId是>“a”和<“D”?@Arvo-我认为你有一个很好的观点。我没想过。目前你有WordFormID
的聚集索引。如果所有查询都使用WordFormID
作为条件并返回大多数字段,那么当前的解决方案可能是最好的。而且,9000条记录几乎什么都不是。包含表中所有列的索引就是表本身,或者说只是表的一个副本。这就是聚集索引。我忘了-如果你想使用另一个字段(ID
)作为主键,不要将其聚集-保持聚集索引不变,一切都会好起来:)@jeroenmoster-谢谢。因此,如果索引更新时间不是问题,您认为查询会使用该索引吗。例如,如果我做了一个查询,其中WordFormId是>“a”和<“D”?@Arvo-我认为你有一个很好的观点。我没有想到这一点。