2

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

让我们说:

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

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

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

4

4 回答 4

5

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

CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)

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

于 2013-07-04T13:25:44.160 回答
3

您说 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' 
于 2013-07-04T13:51:36.957 回答
0

创建全文搜索

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

句法:

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

这将提高你的表现

于 2013-07-04T13:15:26.277 回答
-3

你可以试试这个:

SELECT COUNT(*) FROM YOUR TABLE_NAME WHERE COLUMN_NAME LIKE 'MYFIELD%'
于 2013-07-04T13:16:17.790 回答