我正在尝试在两个表之间进行单列合并。第一个表 ( VisitorSession
) 有 40,000,000 行。第二个 ( ShoppingCart
) 有 9,000,000 行。
在我的开发环境中,查询只需不到 8 分钟。但是在生产环境中,它应该占用更少(更强大的机器)。但是,我预计该查询至少需要 2 分钟才能在生产中运行。我知道这个查询会导致开发环境中的其他开发人员超时,这意味着它很容易导致客户超时。是否有更安全和/或更快的方法来执行此查询?
declare @dt datetime = cast(dateadd(month, -6, getdate()) as date);
merge ShoppingCart as TargetTable -- 07:55 to complete in Dev
using
(
select * from -- 04:55 to run select, resulting in 12,727,927 rows in Dev
(
select
visitorid -- int, not null, foreign key
,useripaddress -- varchar(55), null
,row_number() over
(partition by visitorid order by createdate desc) as [row]
from VisitorSession (nolock) …
Run Code Online (Sandbox Code Playgroud) 我们每秒从不同的平面文件导入多条记录。有时我们会遇到赛车条件,并重复唯一错误约束。我们正在插入和检索记录,
我听说有两种方法可以解决这个问题。这是更好的方法,我听说UPDLOCK,SERIALIZABLE是标准方法。但是,try catch 会阻止检查附加的 If 语句。两种方式都是完全证明,并且会停止重复插入吗?什么是最佳编码实践明智的,并且表现更好?
CREATE TABLE dbo.Customer
(
RowId bigint IDENTITY(1,1) NOT NULL,
CustomerId guid NOT NULL,
Name varchar(255) NOT NULL,
CONSTRAINT PK_RowId PRIMARY KEY CLUSTERED([RowId] ASC)
)
create unique nonclustered index [UN_CustomerId] ON [dbo].[Customer] ([CustomerId] ASC) include (Name)
create nonclustered index [UN_Name] ON [dbo].[Customer] ([Name] ASC) include (CustomerId)
Run Code Online (Sandbox Code Playgroud)
方法一:
IF NOT EXISTS
(
SELECT *
FROM dbo.Customer WITH (UPDLOCK, SERIALIZABLE)
WHERE Name = @Name
)
BEGIN
INSERT INTO dbo.Customer(CustomerId, Name) VALUES (@CustomerId, @Name)
SELECT @CustomerId
END
ELSE …
Run Code Online (Sandbox Code Playgroud)