1

我在 sql server 2012 中有一个表,它在一周内获得近 6600 万次插入。我应该在哪些列上使用索引?

create TABLE [dbo].[Details](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [WorkflowContentMetricsID] [bigint] not null,
        [ContentType] [nvarchar](1000) NULL,
        [SourceID] [nvarchar](2000) NULL,
        [DestinationID] [nvarchar](2000) NULL,
        [ParentSourceID] [nvarchar](2000) NULL,
        [Title] [nvarchar](max) NULL,
        [Status] [nvarchar](max) NULL,
        [Debug] [nvarchar](max) NULL,
        [Metadata] [nvarchar](max) NULL,
        [StatusCategory] [nvarchar](max) NULL,
        [SangamWorkflowRunID] [nvarchar](1000) NULL,
        [StartDateTime] [nvarchar](1000) NULL,
     CONSTRAINT [PK_WorkflowContentDetails] 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] TEXTIMAGE_ON [PRIMARY]

    GO

我使用的查询是

SELECT ID
      ,WorkflowContentMetricsID
      ,ContentType
      ,SourceID
      ,DestinationID
      ,ParentSourceID
      ,Title
      ,[Status]
      ,Debug
      ,Metadata
      ,StatusCategory
FROM WorkflowContentDetails
WHERE ContentType NOT IN ('Image' , 'EntityList')
AND SangamWorkflowRunID = @SangamWorkflowRunID
And StatusCategory in (@StatusCategory)
4

2 回答 2

2

如果它仅用于插入(如您的问题所述),则不要在任何列上使用索引。表的索引越多,执行速度就越慢。

insert语句是唯一不能直接从索引中受益的操作,因为它没有WHERE子句。

于 2013-10-14T11:08:30.097 回答
0

索引对插入没有帮助——它们很痛苦,因为它们也必须被写入。如果您只使用提供的一个查询来查询表,请仅为该查询创建一个索引。它应该包括选择性列。SangamWorkflowRunIDStatusCategory并且ContentType在这里似乎很有用。

提供的信息不能说更多。我建议您花一点时间来了解索引的工作原理以及它如何影响SELECTDML 性能。

对于插入本身,使用 SQL Server 提供的批量插入工具的一种形式。插入 66m 行不会花费特别长的时间。

于 2013-10-14T12:17:53.130 回答