相关疑难解决方法(0)

我可以优化这个 MERGE 语句吗?

我正在尝试在两个表之间进行单列合并。第一个表 ( 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)

sql-server optimization merge

6
推荐指数
1
解决办法
8298
查看次数

SQL Server 并发 Updlock Serializable 与 Try Catch

我们每秒从不同的平面文件导入多条记录。有时我们会遇到赛车条件,并重复唯一错误约束。我们正在插入和检索记录,

我听说有两种方法可以解决这个问题。这是更好的方法,我听说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)

sql-server insert concurrency

4
推荐指数
1
解决办法
1642
查看次数

标签 统计

sql-server ×2

concurrency ×1

insert ×1

merge ×1

optimization ×1