首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大表中字段的值的计数

大表中字段的值的计数
EN

Stack Overflow用户
提问于 2013-07-04 21:06:05
回答 4查看 193关注 0票数 2

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

让我们说:

代码语言:javascript
复制
SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'

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

在这个特定的字段中,我可以做些什么来让这个请求运行得更快?

EN

回答 4

Stack Overflow用户

发布于 2013-07-04 21:25:44

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

代码语言:javascript
复制
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)

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

票数 5
EN

Stack Overflow用户

发布于 2013-07-04 21:51:37

您说NCI将速度提高到不到一秒,并且表有1,000,000行和6个不同的值,因此这仍然意味着平均需要计算167,000个索引行才能回答查询。

此外,这种非选择性列上的非覆盖索引不太可能对满足其他查询有用。

具有预计算计数的索引视图将允许SELECT或多或少是即时的,并且具有更少的空间需求和维护开销(不需要使用MyValue1存储167,000行,然后使用MyValue2存储167,000行,依此类推)

代码语言:javascript
复制
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)

然后

代码语言:javascript
复制
SELECT Count
FROM   MyView WITH ( NOEXPAND)
WHERE  MyField = 'MyValue' 
票数 3
EN

Stack Overflow用户

发布于 2013-07-04 21:15:26

创建全文搜索

对于基于文本的列,全文搜索总是需要执行几次。在这种情况下,将使用全文索引。

语法:

代码语言:javascript
复制
CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …

这将提高您的性能

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17471104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档