在大型表上对ntext列进行缓慢的性能过滤

时间:2011-02-01 16:54:39

标签: sql-server performance

我有一个用这个定义记录用户更改的表:

audit_trail
(
   change_id int identity (1, 1) NOT NULL,
   change_date datetime NOT NULL,
   user_id int NOT NULL,
   record_id int NOT NULL,
   table_name nvarchar(50) NOT NULL,
   field_name nvarchar(50) NOT NULL,
   new_value ntext NULL
)

此查询在此表上运行非常慢(15分钟以上):

SELECT DISTINCT record_id
FROM audit_trail
WHERE table_name = 'jobs'
    AND field_name = 'status'
    AND new_value LIKE '157'

我的桌子有超过7000万条记录。这不是此表的常见查询。此表上的正常查询按日期排序或搜索日期范围内的更改,因此我在change_date列上有一个聚簇索引。此查询的执行计划显示它正在执行聚簇索引扫描。我认为我可以通过在(table_name, field_name)上添加非聚集索引来提高性能,但是甚至没有使用此索引。有关改进此查询性能的任何建议吗?

2 个答案:

答案 0 :(得分:0)

如果可以这样做,将nvarchar更改为varchar将改善大小,并可能改善表的性能。我还怀疑删除不必要的“DISTINCT”将允许优化器使用其他索引。

答案 1 :(得分:0)

尝试以下方法:

sp_tableoption N'audit_trail', 'text in row', '1024'

您可能还会考虑full-text search