【问题标题】:SQL Server index on optional columns可选列上的 SQL Server 索引
【发布时间】:2021-05-07 15:25:13
【问题描述】:

在我的场景中,我有一个包含很多可选列的表(总共 20 列,比如从 col00 到 col19,每一列都包含一个不可为空的整数)。 当列包含 0 时,它被认为是空的,任何其他值都有意义。 可以查询这 20 列的任何子集,所以我应该查询 col01 = int1 和 col17 = int2。

我需要提高此类查询的性能,但我不知道如何创建具有代表性的索引。 当然,我可以监视表格一段时间并查看哪些列子集最常搜索,但这对我来说不是一个令人满意的解决方案(表格每隔几个月定期重新生成......并且以这种方式编码的“标签”可能会改变)

【问题讨论】:

  • 是否有任何列总是通过?
  • 不,每列可能(并非每个客户都使用所有列)绑定到标签集,标签集是可用作该列中标签的允许值范围。例如:颜色标签的第一列,尺寸标签的第二列..等等。如果有人要查询红色项目,大小为 n 英寸,我将不得不检查第一列和第二列

标签: sql-server indexing query-optimization


【解决方案1】:

我认为您能做的最好的事情就是单独为每一列建立索引,然后在 where 子句的子查询中使用集合运算符 INTERSECT...。

INTERSECT 返回由左右输入查询运算符输出的不同行。因此,如果您在 INTERSECT 中选择表的主键,那么您应该有一个很好的子查询,可以在 where 子句中使用。但是,这将需要您重新编写查询。

例子:

SELECT * 
  FROM tablename
 WHERE primary_key = (
SELECT primary_key FROM tablename WHERE col01 = int1 
INTERSECT 
SELECT primary_key FROM tablename WHERE col17 = int2
)

如果 col01 和 col17 有自己的索引,那应该是 sargable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    相关资源
    最近更新 更多