视图中计算列的索引

时间:2015-10-14 13:22:35

标签: sql-server tsql

我的视图定义如下:

CREATE VIEW dbo.v_ListingTestView
WITH SCHEMABINDING
AS 

SELECT 
[ListingID],
[BusinessName],
[Description], 
[ProductDescription],
[Website],
[ListingTypeID],
ISNULL([BusinessName], '') + ' ' + ISNULL([Description], '') + ' ' + ISNULL([ProductDescription], '') + ' ' AS [ComputedText]
FROM dbo.Listings;

当用户在数据库中搜索记录时,我会使用此视图。搜索时用户提供的关键字与计算列进行比较。计算列中包含的列都是NVARCHAR列。我想在此列上创建一个索引,以帮助加快搜索速度。

我正在按照教程向计算列添加索引,但我遇到了一个问题,我的计算列是非确定性的,无法完成教程。如果有人有关于如何实现这一点的建议,我将不胜感激。或者,如果我以不同的方式解决这个问题。

1 个答案:

答案 0 :(得分:1)

你的专栏有多长? ISNULL()deterministic函数,不应导致任何问题。

我猜你的列的长度导致了它。您可能知道,索引不能超过900个符号。由于您将它们存储为NVARCHAR,因此它需要两倍的空间作为varchar并需要额外的两个字节 - 这意味着您的索引最多可以存储448个符号。

  

可变长度的Unicode字符串数据。 n定义字符串长度和   可以是1到4,000之间的值。 max表示最大值   存储大小为2 ^ 31-1个字节(2 GB)。存储大小(以字节为单位)   输入数据的实际长度的两倍+ 2个字节。 ISO   nvarchar的同义词是national char vary和national character   变化

因此,请尝试按特定长度投射您的色谱柱,可能是400?

CREATE VIEW dbo.v_ListingTestView
WITH SCHEMABINDING
AS
SELECT [ListingID]
    , [BusinessName]
    , [Description]
    , [ProductDescription]
    , [Website]
    , [ListingTypeID]
    , CAST(ISNULL([BusinessName], '') + ' ' + ISNULL([Description], '') + ' ' + ISNULL([ProductDescription], '') AS NVARCHAR(400)) AS [ComputedText]
FROM dbo.Listings;

最重要的是,为什么你要创建一个视图?或许相应地改变你的表更有意义,然后才在其上添加索引:

ALTER TABLE dbo.Listings
ADD [ComputedText] AS CAST(ISNULL([BusinessName], '') + ' ' + ISNULL([Description], '') + ' ' + ISNULL([ProductDescription], '') AS NVARCHAR(400));

现在知道您的NVARCHARS存储为MAX,或许最好开始使用全文搜索?这个问题可能值得一看:How do you implement a fulltext search over multiple columns in sql server?