【发布时间】:2016-01-31 05:03:51
【问题描述】:
我有以下查询脚本:
declare @tblSectionsList table
(
SectionID int,
SectionCode varchar(255)
)
--assume @tblSectionsList has 50 sections- rows
DELETE
td
from
[dbo].[InventoryDocumentDetails] td
inner join [dbo].InventoryDocuments th
on th.Id = td.InventoryDocumentDetail_InventoryDocument
inner join @tblSectionsList ts
on ts.SectionID = th.InventoryDocument_Section
这个脚本包含三个表,其中@tblSectionsList是一个临时表,它可能包含50条记录。然后我在与InventoryDocuments 表的连接条件中使用此表,然后进一步连接到InventoryDocumentDetails 表。所有连接都基于 INT 外键。
在周末,我将此查询放在服务器上,即使在 2 天 4 小时后它仍在运行......任何人都可以告诉我我是否做错了什么。或者有什么想法可以提高它的性能?甚至不知道还要多少时间才能给我结果。
在此之前,我还尝试使用以下脚本在 InventoryDocumentDetails 表上创建索引:
CREATE NONCLUSTERED INDEX IX_InventoryDocumentDetails_InventoryDocument
ON dbo.InventoryDocumentDetails (InventoryDocumentDetail_InventoryDocument);
但是这个脚本也需要一天多的时间并且没有完成所以我取消了这个查询。
附加信息:
- 我正在使用 MS SQL 2008 R2。
- InventoryDocuments 表包含 2108137 行,主键为“Id”。
- InventoryDocumentDetails 表包含 25055158 行,主键为“Id”。
- 两个表都定义了主键。
- CUP - Intel Xeon - 32 GB RAM
- 没有定义索引,因为现在当我要创建新索引时,该查询也会暂停。
以下查询为此提供一行并显示 status='suspended' 和 wait_type='LCK_M_IX'
SELECT r.session_id as spid, r.[status], r.command, t.[text], OBJECT_NAME(t.objectid, t.[dbid]) as object, r.logical_reads, r.blocking_session_id as blocked, r.wait_type, s.host_name, s.host_process_id, s.program_name, r.start_time
FROM sys.dm_exec_requests AS r LEFT OUTER JOIN sys.dm_exec_sessions s ON s.session_id = r.session_id OUTER APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS t
WHERE r.session_id <> @@SPID AND r.session_id > 50
【问题讨论】:
-
您应该在问题中包含查询计划。另外,您是否检查过没有阻塞导致删除等待?
-
下一个发布 RAM 的家伙 - 但不是在谈论数据库大小、查询计划和 DISC SUBSYSTEMS。服务器很可能在完全不合适的慢速硬盘上运行。请查询计划。和光盘布局。
-
它成功删除了其他查询,比如1分钟内从另一个表中删除了1000万行。数据库大小约为 15 GB。
-
快速说明:"
@tblSectionsList是一个临时表" 不正确。@tblSectionsList是一个TABLE变量,TABLE变量和临时表之间存在相当大的差异。 -
我在
InventoryDocumentDetailExtensions上看到聚集索引扫描...这是在做什么?
标签: sql-server tsql sql-server-2008-r2