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

时间:2017-04-20 06:58:03

标签: sql-server

我有这张桌子:

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表达式计算的列是否可能?如果是这样,我应该考虑性能问题?

1 个答案:

答案 0 :(得分:3)

表格中没有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])