2017-04-20 77 views
0

我有這個表:在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

你*嘗試*嗎?如果是這樣,它是否成功或返回錯誤信息?這似乎比在互聯網上詢問隨機陌生人更快。 –

回答

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]) 
+0

如果我沒有提到堅持計算列,並且我爲該計算列創建索引,那麼當時優化程序是否將在該計算列上使用索引? – RGS

+1

@RGS:不確定您是否可以在未保留的計算列上創建*索引.....查看[關於如何在計算列上創建索引的MSDN文檔](https:// docs。 microsoft.com/en-us/sql/relational-databases/indexes/indexes-on-computed-columns) - 它能幫助你嗎? –

+1

它幫助我瞭解在SQL Server中創建計算列上的索引。 – RGS

相關問題