Sql server 在SQL Server中的唯一非聚集索引中忽略\u DUP\u KEY=ON

Sql server 在SQL Server中的唯一非聚集索引中忽略\u DUP\u KEY=ON,sql-server,ignore,ignore-duplicates,Sql Server,Ignore,Ignore Duplicates,想询问SQL Server中具有IGNORE_DUP_密钥的唯一非聚集索引。以下是索引: /****** Object: Index [TIMESTAMP_NONCLUSTERED] Script Date: 1/7/2015 1:30:22 PM ******/ CREATE UNIQUE NONCLUSTERED INDEX [TIMESTAMP_NONCLUSTERED] ON [dbo].[Events] ( [Timestamp] ASC, [EventID]

想询问SQL Server中具有IGNORE_DUP_密钥的唯一非聚集索引。以下是索引:

/****** Object:  Index [TIMESTAMP_NONCLUSTERED]    Script Date: 1/7/2015 1:30:22 PM ******/
CREATE UNIQUE NONCLUSTERED INDEX [TIMESTAMP_NONCLUSTERED] ON [dbo].[Events]
(
    [Timestamp] ASC,
    [EventID] ASC
)
INCLUDE (   [Type],
    [Category],
    [Node],
    [DoID],
    [AssociatedDoID],
    [OpaqueData]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
请问这是否是忽略重复插入的最佳方式?此外,如果重新启动SQL Server,由于它是一个非聚集索引,这是否仍然有效?SQL Server将首先比较什么,时间戳然后是EventID?SQL是如何做到的?它就像一个SQL Server将查看时间戳然后查看EventID的查询一样

顺便说一句,EventID是guid格式的


谢谢

IMO表设计有点可疑-您有一个名为
Events
的表,它的Guid列
EventId
不能用作主键,即使将它与另一个字段组合后,它仍然不够唯一,无法用作唯一的NC索引?插入表的客户端具有重试机制,需要通过网络。在某些情况下(正常情况下不太可能发生),客户端会重试要插入的同一事件。@StuartLC,您知道SQL Server是否会先查看EventID之前的时间戳吗?是的,索引是按从左到右的顺序计算的。需要注意的一点是,所有非聚集索引上都存在clustereed键(由聚集索引使用)。因此,例如,如果EventId本身是主键,并且用作聚集索引,则时间戳的NC索引不需要显式地将
EventId
添加到NC索引中。除了@StuartLC提到的臭烘烘的设计之外,为了解决此问题,我将使用MERGE语句插入或更新行,取决于它是否已经存在。