计算大表中字段值的数量

时间:2013-07-04 13:06:05

标签: sql sql-server tsql optimization

我需要计算其中一个字段中具有特定值的行数。

让我们说:

SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'

问题是超过1.000.000行且执行时间太长(超过60秒)

在此specefic字段中我可以做些什么来使此请求运行得更快?

4 个答案:

答案 0 :(得分:5)

如果只搜索列的精确值('MyValue'),则应在MyField列上创建索引。

CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)

如果您想从列中搜索短语中的单词 - 创建全文搜索索引(如回答Mari)。

答案 1 :(得分:3)

你说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' 

答案 2 :(得分:0)

创建全文搜索

对于基于文本的列,始终需要多次执行全文搜索。在这种情况下,使用全文索引。

语法:

CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …

这会提高你的表现

答案 3 :(得分:-3)

你可以试试这个:

SELECT COUNT(*) FROM YOUR TABLE_NAME WHERE COLUMN_NAME LIKE 'MYFIELD%'