我需要计算在其中一个字段中具有特定值的行数。
让我们说:
SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'
问题是有超过 1.000.000 行并且执行时间太长(超过 60 秒)
我可以在这个特定字段中做些什么来使这个请求运行得更快?
我需要计算在其中一个字段中具有特定值的行数。
让我们说:
SELECT COUNT(1) FROM MyTable WHERE MyField = 'MyValue'
问题是有超过 1.000.000 行并且执行时间太长(超过 60 秒)
我可以在这个特定字段中做些什么来使这个请求运行得更快?
如果只搜索列 ('MyValue') 的确切值,则应在 MyField 列上创建索引。
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField ASC)
如果您想从列中搜索词组中的单词 - 创建全文搜索索引(如 Mari 的回答)。
您说 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'
创建全文搜索
对于基于文本的列,全文搜索总是需要执行几次。在这种情况下,使用全文索引。
句法:
CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …
这将提高你的表现
你可以试试这个:
SELECT COUNT(*) FROM YOUR TABLE_NAME WHERE COLUMN_NAME LIKE 'MYFIELD%'