【发布时间】:2023-12-04 14:19:01
【问题描述】:
A 表是巨大的(50+ 百万行)表。所以这种更新方式对于 MSSQL 服务器来说太慢了。除了它在存储过程的 while 循环中运行。我认为这个解决方案不是很有效。
有人有什么好主意来解决这个问题吗?
谢谢!
表的定义
CREATE TABLE [dbo].[A](
[E_NUM] [int] NOT NULL,
[ID] [char](1) NOT NULL,
[NUM] [int] NOT NULL,
[h_out] [smallint] NOT NULL,
[TAG] [smallint] NOT NULL,
[TAG1] [smallint] NOT NULL,
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED
(
[E_NUM] ASC,
[ID] ASC,
[NUM] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
B表的定义
CREATE TABLE [dbo].[B](
[NUM] [int] NOT NULL,
[NUM2] [int] NOT NULL,
[TYPE] [char](1) NOT NULL,
[R_DATE] [datetime] NULL,
[Note] [varchar](100) NULL,
CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED
(
[NUM] ASC,
[NUM2] ASC,
[TYPE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
更新
UPDATE A_1
SET A_1.TAG1 = -1
FROM A
INNER JOIN B ON A.NUM = B.NUM
INNER JOIN A AS A_1 ON B.NUM2 = A_1.NUM
WHERE A.TAG1 = -1 AND A.TAG = -1 AND B.TYPE='X'
AND A.E_num = A_1.E_num AND A.ID=A_1.[ID];
【问题讨论】:
-
索引和查询调优是提高性能的第一步。将实际执行计划上传到brentozar.com/pastetheplan,如果您需要帮助,请将链接添加到您的问题中。
-
顺便说一句,
A.TAG1 = -1 AND A.TAG = -1是多余的,但可能与性能问题无关,除非您的意图是B.TAG = -1。 -
为什么是多余的?它们是不同的列。
-
B.NUM, B.NUM2, B.TYPE 已经有索引了。感谢您的建议!
-
WHERE 子句中的列呢?他们也被编入索引了吗?
标签: sql sql-server performance query-optimization rows