【发布时间】:2010-04-15 00:02:10
【问题描述】:
我需要从一个表中获取一些数据(并在途中扩展一些 XML)并将其放入另一个表中。由于源表可能有数千条或导致超时的记录,我决定分批执行 100 条记录。该代码按计划运行,因此分批执行对客户来说可以。如果我在源数据库中有 200 条记录,则存储过程运行得非常快,但如果有数千条记录,则需要几分钟。我猜“TOP 100”只有在通过所有记录后才进入前100名。我需要在某个时候更改整个代码和 sproc,因为它无法扩展,但现在有快速修复方法可以让它运行得更快吗?
INSERT INTO [deviceManager].[TransactionLogStores]
SELECT TOP 100 [EventId],
[message].value('(/interface/mac)[1]', 'nvarchar(100)') AS mac,
[message].value('(/interface/device) [1]', 'nvarchar(100)') AS device_type,
[message].value('(/interface/id) [1]', 'nvarchar(100)') AS device_id,
[message].value('substring(string((/interface/id)[1]), 1, 6)', 'nvarchar(100)') AS store_id,
[message].value('(/interface/terminal/unit)[1]', 'nvarchar(100)') AS unit,
[message].value('(/interface/terminal/trans/event)[1]', 'nvarchar(100)') AS event_id,
[message].value('(/interface/terminal/trans/data)[1]', 'nvarchar(100)') AS event_data,
[message].value('substring(string((/interface/terminal/trans/data)[1]), 9, 11)', 'nvarchar(100)') AS badge,
[message].value('(/interface/terminal/trans/time)[1]', 'nvarchar(100)') AS terminal_time,
MessageRecievedAt_UTC AS db_time
FROM [deviceManager].[TransactionLog]
WHERE EventId > @EventId
--WHERE MessageRecievedAt_UTC > @StartTime AND MessageRecievedAt_UTC < @EndTime
ORDER BY terminal_time DESC
【问题讨论】:
-
EventId 是否在 TransactionLog 表中建立索引?
标签: sql sql-server