【问题标题】:Count number of a value of a field in big table统计大表中某个字段的值的个数
【发布时间】:2013-07-04 22:29:44
【问题描述】:

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

让我们说:

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

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

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

【问题讨论】:

  • 您应该在“MyField”列的表格中添加索引。
  • 你经常运行这个查询吗?您总是查找相同的值还是不同的值?列中有多少不同的值?根据对这些问题的回答,还可以考虑使用索引视图或过滤索引。
  • 基本有 5 个不同的值和 NULL。我使用了这样的非聚集索引:CREATE NONCLUSTERED INDEX INDEX_NAME ON MyTable (MyField ASC)
  • @GMastros 对于上述基数,这有点浪费。
  • @MartinSmith 除了创建索引的执行时间从“(超过 60 秒)”到“不到 1 秒”。这里只是猜测,但我怀疑执行计划现在正在使用索引扫描,但索引只有这一列,因此扫描窄索引而不是扫描(可能是胖)表。

标签: sql sql-server tsql optimization


【解决方案1】:

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

CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)

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

【讨论】:

  • 太棒了! CREATE NONCLUSTERED 语句需要一些时间来执行,但我的查询现在运行不到一秒!谢谢!
【解决方案2】:

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

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

具有预先计算的计数的索引视图将允许SELECT 或多或少即时,并且具有更少的空间需求和维护开销(无需存储 167,000 行 MyValue1 然后再存储 167,000 行 MyValue2 等等)

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' 

【讨论】:

    【解决方案3】:

    创建全文搜索

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

    语法:

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

    这将提高你的表现

    【讨论】:

    • 我的机器上没有安装 FULLTEXT!
    【解决方案4】:

    你可以试试这个:

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

    【讨论】:

    • 我认为这不是很正确的答案。为什么您认为LIKE 会有所帮助?
    • SELECT COUNT(*) FROM YOUR TABLE_NAME WHERE COLUMN_NAME LIKE 'MYFIELD'SELECT COUNT(*) FROM YOUR TABLE_NAME WHERE COLUMN_NAME ='MYFIELD' 是一样的。当我们想使用通配符时使用LIKE。同样= 在执行时抑制字符串后的空格。所以它不会帮助性能。
    • 完全同意@Nithesh。
    • 完全同意 Devart & Nithesh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2013-06-10
    • 2022-11-16
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多