我有一个具有以下结构的 SQL Server 表:
CREATE TABLE [dbo].[Log](
[LogID] [bigint] IDENTITY(1,1) NOT NULL,
[A] [int] NOT NULL,
[B] [int] NOT NULL,
[C] [int] NOT NULL,
[D] [int] NOT NULL,
[E] [int] NOT NULL,
[Flag1] [bit] NOT NULL,
[Flag2] [bit] NOT NULL,
[Flag3] [bit] NOT NULL,
[Counter] [int] NOT NULL,
[Start] [datetime] NOT NULL,
[End] [datetime] NOT NULL)
该表用于记录事件。 A
-E
列表示外键,Flag1
-Flag3
表示某些日志状态,Start 列
和 End
标记事件的开始和结束。
平均而言,该表每约 30 秒更新一次,更新会进行约 50 次插入/更新。
用户可以从 UI 进行查询并过滤任何给定列以及列和列类型的所有组合上的数据。
优化该表数据检索的最佳方法是什么:
- 创建一个“主”索引来保存所有这些列
- 确定一些最常用的过滤器组合,例如[
A,D,E
]、[A, Start, End
] 等并为它们创建索引 - 还有别的事...
最佳答案
我怀疑这里的任何人都只能猜测 - 您需要记录表的使用情况,并从该使用情况中查看正在查询哪些列组合。
- Create one "master" index that would hold all these columns
这绝对不是一个好主意 - 如果您在 (A,B,C,D,E) 上有一个索引,并且您通过 B 和 D 的值限制查询,则该索引完全是无用。只是有用而已
- 如果您经常按所有五列进行查询
- 经常使用 (A,B)、(A,B,C)、(A,B,C,D) 等组合
在任何其他情况下,这都是一种浪费 - 不要使用它。
- Identify some of the most used filter combinations e.g. [A,D,E], [A, Start, End] etc. and create indexes for them
是的,这确实是保证成功的唯一方法。您需要查看实际发生的查询类型,然后进行调整。
关于sql - 为 SQL Server 表选择最佳索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064996/