1

我有一个有 10 列的表。第一个,主键,是一个名为“key”的序列 int。另一个被命名为“状态”。一个名为“test_reference”,一个名为“warehouse”,一个名为“enabled”(一个标志)。其他列可以忽略。

我需要扫描整个表并获取表中“状态”为“6”或“7”的所有行的结果集,并且“启用”为 1(启用)。“状态”中的状态仅在 0-7 范围内(仅限整数值)。

这个结果集需要经常确定(每 5 分钟一次),并且可能有 200k+ 条记录。我敢肯定有比以下更快的方法:

[select warehouse,
        test_reference
   from lgvftchinv
  where status in (8, 9)
    and enabled = 1]

我已经在(状态,启用)上创建了一个索引。但是,如果那里有更好的解决方案,请帮助我!

感谢您的时间。

4

2 回答 2

1

您可以尝试使用过滤索引,它只存储与您正在查找的子集匹配的行。并假设您在示例中选择的两列是您真正想要的唯一两列,您还可以添加一个 INCLUDE 子句以使其成为覆盖索引(因此您甚至不需要返回表来获取那些值)。顺便说一句,过滤索引是在 SQL Server 2008 中引入的。

CREATE NONCLUSTERED INDEX IX_lgvftchinv_status_enabled
    ON lgvftchinv ( [status], [enabled] ) 
    INCLUDE ( warehouse, test_reference )
    WHERE [status] IN (8, 9)
        AND [enabled] = 1
于 2013-11-05T06:31:49.467 回答
1

添加一个持久的计算 [bit] 列 MyFlag,如果状态为 8 或 9 并且启用 = 1,它将为 1,否则将其设置为 0,在其上创建索引,然后进行查询“...其中 MyFlag = 1”。这样,将在您需要它们之前进行比较。应该工作得更快。让我知道它是否有帮助。

于 2013-11-05T06:10:28.213 回答