小编Maj*_*j0r的帖子

SQL 中的有限状态机

我想就我遇到的问题提供一些意见。我们有一段代码在我们的存储过程中重复,每次都需要相当长的时间来处理,当合并时读取的数量会在数十万个项目上达到数亿。基本上我们有一个项目,并且项目可以有多达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

7
推荐指数
1
解决办法
3216
查看次数