我需要计算其中一个字段中具有特定值的行数。
让我们说:
SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'问题是超过1.000.000行,执行时间太长(超过60秒)
在这个特定的字段中,我可以做些什么来让这个请求运行得更快?
发布于 2013-07-04 21:25:44
如果只搜索列的精确值('MyValue'),则应在MyField列上创建索引。
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)如果您想从列中搜索短语中的单词-创建全文搜索索引(如Mari的答案)。
发布于 2013-07-04 21:51:37
您说NCI将速度提高到不到一秒,并且表有1,000,000行和6个不同的值,因此这仍然意味着平均需要计算167,000个索引行才能回答查询。
此外,这种非选择性列上的非覆盖索引不太可能对满足其他查询有用。
具有预计算计数的索引视图将允许SELECT或多或少是即时的,并且具有更少的空间需求和维护开销(不需要使用MyValue1存储167,000行,然后使用MyValue2存储167,000行,依此类推)
CREATE VIEW dbo.MyView
WITH SCHEMABINDING
AS
SELECT COUNT_BIG(*) AS Count,
MyField
FROM dbo.MyTable
GROUP BY MyField
GO
CREATE UNIQUE CLUSTERED INDEX IX ON dbo.MyView(MyField)然后
SELECT Count
FROM MyView WITH ( NOEXPAND)
WHERE MyField = 'MyValue' 发布于 2013-07-04 21:15:26
创建全文搜索
对于基于文本的列,全文搜索总是需要执行几次。在这种情况下,将使用全文索引。
语法:
CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …这将提高您的性能
https://stackoverflow.com/questions/17471104
复制相似问题