我想就我遇到的问题提供一些意见。我们有一段代码在我们的存储过程中重复,每次都需要相当长的时间来处理,当合并时读取的数量会在数十万个项目上达到数亿。基本上我们有一个项目,并且项目可以有多达12台机器,每一个都有自己的状态。
这些是(简化的)表结构:
CREATE TABLE dbo.ItemMachineState
(
[itemID] [int],
[machineID] [int],
[stateID] [int]
)
CREATE TABLE dbo.Transition
(
[machineID] [int] NOT NULL,
[eventID] [int] NOT NULL,
[stateID] [int] NOT NULL,
[nextStateID] [int] NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
发生的情况是,在处理过程中,我们创建了一个我们针对的 #temp 表,并且最终每个项目都有一个 eventID。然后将该临时表连接回 ItemState 和 Transition,如下所示:
UPDATE dbo.ItemState
SET stateID = tr.nextStateID
FROM #temp t
JOIN dbo.ItemMachineState ist ON ist.itemID = t.itemID
JOIN Transition tr ON tr.stateID = ist.stateID AND
tr.machineID = ist.machineID AND
tr.eventID = t.eventID
Run Code Online (Sandbox Code Playgroud)
因此,我们计算的 eventID 决定了给定项目的机器会发生什么,这取决于它们各自所处的状态。 问题是一个事件可以在一个运动中操纵零个或多个机器状态,如果该事件是相关的到状态和机器的特定组合。
以下是这些状态转换之一的示例:
ItemID …
performance sql-server sql-server-2012 enterprise-edition query-performance