0

我创建了一个索引视图:

CREATE VIEW LogValueTexts WITH SCHEMABINDING AS
SELECT ISNULL(LRVS_SLOG_ID*256+LRVS_IDX,0) AS ID,LRVS_VALUE AS Value
FROM dbo.LRVS_LogRecordedValues WHERE LEN(LRVS_VALUE)>4

CREATE UNIQUE CLUSTERED INDEX IX_LogValueTexts ON LogValueTexts (ID)

在 SQL 2005 Standard SP3 上,在该视图上填充全文索引需要很长时间,因为全文索引对视图中的每一行执行以下查询:

SELECT COLUMN FULLTEXTALL FROM[dbo].[LogValueTexts] WHERE COLUMN FULLTEXTKEY = @p1

我假设COLUMN FULLTEXTALLandCOLUMN FULLTEXTKEY实际上是Valueand ID,但这就是 SQL Server Profiler 所显示的。问题是查询计划对大约 11M 行/1GB 数据使用聚集索引扫描,因为它不使用视图上的索引。我曾尝试为该查询创建计划指南,但由于它不是标准的 T-SQL 查询,因此不允许这样做 ( Incorrect syntax near the keyword 'FULLTEXTKEY')。

有没有办法让这个全文索引工作,除了:

  • 升级到运行良好的 SQL 2008(或 SQL 2005 Enterprise)。
  • 在基础表上创建唯一 ID 和覆盖索引。

升级将需要服务器停机,并且可能需要新的 SQL Server 许可证,同时创建唯一 ID 和覆盖索引会浪费大量空间,因为只有 11M 行中的一个子集需要全文索引(LRVS_VALUE通常NULL或具有非常短的文本价值)。

4

1 回答 1

1

我不知道你的数据;为什么不能把全文索引放在原表上?您可以将计算的列添加到表结构中。这样你就不会进行索引重建操作(我认为这是你扫描的原因)

如果您不能这样做,那么下一个最简单的更改可能是创建一个使用 sp 或触发器填充的查找表,这样您就可以更改表的索引,以便它们对您的查询有意义。

您的最后一个选择(您需要花一些时间才能做到正确)是使用分区表。您可以有一个分区来覆盖视图上过滤的数据。全文索引整个表格;您在运行时的查询将命中带有相关数据的分区表。

于 2009-11-26T18:31:39.270 回答