0

你好 SQL 大师在那里......我有这个月之久的问题,我似乎无法解决。我有这个非常宽的(报告)表大约。100多个领域。目前,它有大约 200 万条记录,并且随着数据的出现速度,它可能会在未来 1-2​​ 个月内翻一番。目前运行可以接受。但在接下来的几个月里不再那么确定了。基本上,我只想知道这种类型的表的最佳索引计划是什么。这不是实际的表格,但非常接近。我只是想说明使用的各种数据类型。

    ID bigint IDENTITY (UNIQUE CLUSTERED INDEX)
    Column1 varchar(4000) NULL
    ...
    Column50 varchar(1000) NULL
    Column60 int NULL
    ...
    Column60 nvarchar(max) NULL

现在,当前以这种方式查询此表:

    SELECT <ALL COLUMNS EXCEPT ID>
    FROM ThisTable WITH(NOLOCK)     --i know how this works dont warn me :)
    WHERE 
        (@Column1 IS NULL OR  CHARINDEX('|' + [Column1] + '|', @Column1) > 0))
        ...
        AND (@Column99 IS NULL OR  CHARINDEX('|' + [Column99] + '|', @Column99) > 0))

每个参数/字段的可能值为:

    @Column1 = '|value1|value2|value3|'

    Column1
    value1
    value2

我知道基本的执行计划阅读和我所看到的......有很多扫描正在进行。但正如我所说,似乎我已经碰壁了,这就是我现在在这里寻求帮助的原因:)。我知道如何根据小表的用途来索引小表,但表这么宽?我只能对自己哈哈大笑:D

有什么想法吗?我已经阅读了一些关于 Columnstore INDEX 的内容。这是我能想到的最可行的解决方案。但目前关于这种方法的可用信息非常少。

如果你想知道我是怎么想出这张桌子的。那么它的内容来自不同的表(展平)。每晚进行处理。结果被导出到 CSV 文件中,然后该文件将用作另一个报告应用程序的数据源。

提前致谢!

4

1 回答 1

0

好的,如果您已经有一个表值函数,您可能可以使用它来加快速度。但请注意,直接在查询中使用它是没有意义的。首先从函数中选择一个 #temp 表,然后加入它。

要处理 OR,请使用带有sp_executesqlor的动态 sql(有关示例,option(recompile)请参阅我对类似问题的回答) 。

如果您可以缩小选择列表的范围,您可能会使用覆盖索引。

列存储索引非常适合在单个列上进行聚合(因为对于 CSI,列的所有值都被分组在一起,而不是面向行的存储),但对您的情况没有帮助。

于 2014-05-07T13:41:31.503 回答