在SQL Server中,我可以在“AS”列上编制索引吗?

问题描述:

我有这个表:在SQL Server中,我可以在“AS”列上编制索引吗?

CREATE TABLE [dbo].[Kanji] 
(
    [KanjiId] UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL, 
    [Text] NVARCHAR(5) NOT NULL, 
    [Freq] INT NULL, 
    [Grade] INT NULL, 
    [Hash] AS (CONVERT([bigint], hashbytes('md5', [Name])) % (5) + (5)), 
} 

我想指数Text然后Hash。但是有可能使用AS表达式计算出一列吗?如果有,我应该考虑哪些性能问题?

+2

https://docs.microsoft.com/en-us/sql/relational-databases/indexes/indexes-on-computed - 列 – artm

+7

你*尝试*吗?如果是这样,它是否成功或返回错误信息?这似乎比在互联网上询问随机陌生人更快。 –

有你的表中没有Name列,因此您的公式创建Hash文件...

假设你的意思是采取Text哈希,试试这个:

CREATE TABLE [dbo].[Kanji] 
(
    [KanjiId] UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL, 
    [Text] NVARCHAR(5) NOT NULL, 
    [Freq] INT NULL, 
    [Grade] INT NULL, 
    [Hash] AS (CONVERT([bigint], hashbytes('md5', [Text]) % (5) + (5))) PERSISTED 
) 

通过添加PERSISTED关键字与计算公式相关联,您实际上将那些计算值存储在磁盘上,并将其与表格行一起存储,就好像它是“正常”列一样。有了这个,你可以肯定(Text, Hash)添加一个索引到你的表:

CREATE NONCLUSTERED INDEX ix01_Kanji ON dbo.Kanji([Text], [Hash]) 
+0

如果我没有提到坚持计算列,并且我为该计算列创建索引,那么当时优化程序是否将在该计算列上使用索引? – RGS

+1

@RGS:不确定您是否可以在未保留的计算列上创建*索引.....查看[关于如何在计算列上创建索引的MSDN文档](https:// docs。 microsoft.com/en-us/sql/relational-databases/indexes/indexes-on-computed-columns) - 它能帮助你吗? –

+1

它帮助我了解在SQL Server中创建计算列上的索引。 – RGS