在部分 CHAR 列上创建索引

Posted

技术标签:

【中文标题】在部分 CHAR 列上创建索引【英文标题】:Create Index on partial CHAR Column 【发布时间】:2010-10-26 23:31:26 【问题描述】:

我有一个 CHAR(250) 列用作 varchar(24) 列的外键。

我记得在 mysql 中,我可以创建一个指定 column(24) 的索引,以便在最左边的 24 个字符上创建一个索引。这在 MS SQL Server 上似乎是不可能的。

我的问题是这样的:

是否可以在 SQL Server 2008 上使用索引视图来索引该列的子字符串,如果可以,是否会对表的性能产生任何副作用?

【问题讨论】:

【参考方案1】:

您可以创建一个持久化计算列,然后对其进行索引,请参阅Creating Indexes on Computed Columns

alter table add newcolumn as cast(oldcolumn as varchar(24)) persisted;
create index table_newcolumn on table (newcolumn);

【讨论】:

谢谢!我没有提到的是,有问题的表格是第 3 方应用程序的一部分,因此更改表格本身是严格禁止的。 我不确定 FK 是否会从索引视图中受益。查询和连接可能从中受益,但 FK 强制执行本身可能会忽略您的索引视图,从而导致 FK 强制验证的性能不佳。 很公平,我想我只需要尝试一下。【参考方案2】:

我希望你有一个很好的关系理由这样做。我猜供应商提供的表的前 24 个字符实际上构成了一个离散属性,并且应该首先放在单独的列中。

所以……

创建供应商表的视图。如果您愿意,请对其进行索引。我怀疑你可以在视图上指向一个 FK 约束,但你当然可以编写一个触发器来达到同样的效果。针对索引视图的触发器检查将非常快,但代价是视图基表的更新时间略有增加。

HTH。

【讨论】:

没有好的关系原因,这是在我或多或少坚持之前做出的决定。无需担心实际 FK 约束。它已经在同一服务器上的一个完全独立的数据库中。我有一个需要 40 分钟才能运行的存储过程,我主要关心的是。在该字段上放置索引似乎过大(~400mb)。不过,磁盘空间并不是什么大问题,所以如果没有任何其他性能优势可言,那我只是在浪费时间。

以上是关于在部分 CHAR 列上创建索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中的 json 列上创建索引?

决定何时在数据库中的表列上创建索引?

在已经存在主键或唯一键约束的列上创建索引

您是不是需要在 Hibernate 表的 @id 列上创建索引

如何在 NULL 列上创建唯一索引?

如何使用 xpath 表达式在 PostgreSQL 中的 XML 列上创建索引?