索引结构以最大化索引列的任何组合



我有一个数据库,其中大约五个可能的索引列,所有这些都以不同的方式有用。让我们称它们为系统,来源,热量,时间和行。使用系统和行在一起将制作一个唯一的密钥,如果通过系统行对五个索引变量的任何组合进行排序(以我上面列出的顺序)。

我的问题是我使用以下列的所有组合:有时我想将每个系统行连接到下一个系统 - (行 1),有时我想分组或通过系统源源,有时我想查看系统源的所有条目,其中时间在特定窗口中,等等。

基本上,我想要一个索引结构,该索引结构与这五个索引的每一个可能的排列相似(当然是正确的顺序),而无需实际进行所有排列(尽管如有必要,但我愿意这样做)。我正在进行统计/分析,而不是传统的数据库工作,因此索引的大小和创建/更新的速度不是问题。我只关心加速即兴查询,因为我倾向于思考它们,运行它们,等待5-10分钟,然后再也不会使用它们。因此,我主要关心的是将"等待5-10分钟"减少到更"等待1-2分钟"之类的东西。

我的分类数据看起来像这样:

Sys So H Ti R
1   1  0 .1 1
1   1  1 .2 2
1   1  1 .3 3
1   1  2 .3 4
1   2  0 .5 5
1   2  0 .6 6
1   2  1 .8 7
1   2  2 .8 8

编辑:它可能会简化一些系统,即系统几乎需要将系统作为第一列包括在其他4列中以排序顺序进行。

如果您是与SELECT SPEED有关,并且不在乎插入,则可以将所有组合物质化为索引视图。您只需要原始表存储的24倍,每张表格和23个索引视图,每列5列。

,例如

create table data (
    id int identity primary key clustered,
    sys int,
    so int,
    h float,
    ti datetime,
    r int);
GO
create view dbo.data_v1 with schemabinding as
    select sys, so, h, ti, r
    from dbo.data;
GO
create unique clustered index cix_data_v1 on data_v1(sys, h, ti, r, so)
GO
create view dbo.data_v2 with schemabinding as
    select sys, so, h, ti, r
    from dbo.data;
GO
create unique clustered index cix_data_v2 on data_v2(sys, ti, r, so, h)
GO
-- and so on and so forth, keeping "sys" anchored at the front

请注意,但是
问:为什么我的索引视图不在查询计划中使用的查询优化器拾取?(在链接文章中搜索)


如果空间是一个问题,那么下一个最好的事情是在4个列中的每个列中创建单个索引,以系统为导向,即(sys,ti),(sys,r)等。查询,否则它将恢复到全表扫描。

很抱歉花了一段时间才能回到这一点,我必须花几个星期的其他工作。无论如何,在尝试了一堆事情之后(包括这里建议的所有内容,甚至是蛮力的"为每一个置换方法制作索引"),我没有找到任何索引方法可以显着提高性能。

但是,我找到了一个替代的,非索引的解决方案:仅选择我感兴趣的行和列,然后使用这些列表,然后使用这些行,而不是完整的表(因此,我使用了约500万行的行6个COLS,而不是35个COLS的30 mil行)。最初的选择和表创建有点慢,但是之后的步骤要快得多,我实际上节省了时间,即使我只运行一次(并且考虑我的频率,通常都超过一次)。p>我怀疑大多数SQL用户(可能与PageFile大小有关)这一巨大改进的原因将是显而易见的,如果是这样,我深表歉意。我唯一的借口是,我是一个统计学家,试图自学,我在做自己想做的事情(最终)时,我对的机制的理解很不错,的完成方式非常痛苦地接近"这是一个神奇的黑匣子,不用担心。"

最新更新