我需要计算其中一个字段中具有特定值的行数。
让我们说:
SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'
问题是超过1.000.000行且执行时间太长(超过60秒)
在此specefic字段中我可以做些什么来使此请求运行得更快?
答案 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%'