以最快的方式扫描SQL Server表的列有2个不同的值?

时间:2013-11-05 06:04:07

标签: sql sql-server performance select indexing

我有一个有10列的表。第一个是主键,是一个名为" key"的序列int。另一个名为" status"。一个名为" test_reference",一个名为"仓库",一个名为"启用" (一只旗)。其他列可以忽略。

我需要扫描整个表并获得表中具有"状态"的所有行的结果集。任何" 6"或" 7","启用"是1(启用)。状态"状态"仅范围为0-7(仅限整数值)。

此结果集需要经常确定(每5分钟一次),并且可能需要200k +记录。我确信这比以下更快:

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

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

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

添加一个持久的计算[bit]列MyFlag,如果status为8或9且enabled = 1则为1,否则将其设置为0,在其上创建索引,然后进行查询“...其中MyFlag = 1” 。这样,比较将在您需要之前完成。应该更快地工作。如果有帮助,请告诉我。

答案 1 :(得分:1)

您可以尝试过滤索引,该索引仅存储与您要查找的子集匹配的行。假设您在示例中选择的两列是您真正想要的两列,您还可以添加INCLUDE子句以使其成为覆盖索引(因此您甚至不需要返回到表中来获取这些值)。过滤的索引是在SQL Server 2008,btw。

中引入的
CREATE NONCLUSTERED INDEX IX_lgvftchinv_status_enabled
    ON lgvftchinv ( [status], [enabled] ) 
    INCLUDE ( warehouse, test_reference )
    WHERE [status] IN (8, 9)
        AND [enabled] = 1