我们在Microsoft SQL Server 2000中有一个CallLog表。该表包含CallEndTime字段,该字段的类型为DATETIME
,并且是一个索引列。
我们通常删除免费呼叫并生成月费统计报告和呼叫详细记录报告,所有SQL都使用WHERE
子句中的CallEndTime
作为查询条件。由于CallLog表中存在大量记录,查询速度较慢,因此我们希望从索引开始对其进行优化。
问题
如果查询额外索引的VARCHAR
列CallEndDate,效率会更高吗?如
-- DATETIME based query
SELECT COUNT(*) FROM CallLog WHERE CallEndTime BETWEEN '2011-06-01 00:00:00' AND '2011-06-30 23:59:59'
-- VARCHAR based queries
SELECT COUNT(*) FROM CallLog WHERE CallEndDate BETWEEN '2011-06-01' AND '2011-06-30'
SELECT COUNT(*) FROM CallLog WHERE CallEndDate LIKE '2011-06%'
SELECT COUNT(*) FROM CallLog WHERE CallEndMonth = '2011-06'
它必须是日期时间。日期基本上是以数字的形式存储在数据库中的,因此可以相对快速地查看值是否在两个数字之间。
如果我是你,我会考虑将数据拆分到多个表中(按月份、年份或其他),并创建一个视图来组合所有这些表中的数据。这样,任何需要整个数据集的功能都可以使用该视图,任何只需要几个月数据的功能都能够访问特定的表,这将更快,因为它包含的数据要少得多。
- 我认为比较
DateTime
比LIKE
算子快得多 - 我同意DoctorMick关于将DateTime拆分为持久列Year、Month、Day的观点
- 对于选择
COUNT(*)
的查询,请检查execution plan
中是否有Table LookUp
节点。如果是这样,这可能是因为您的CallEndTime列可以为null。因为您说过在CallEndTime列上有一个[非聚集]索引。如果您将列设为NOT NULL并重新生成索引,那么计算它将是一个INDEX SCAN
,它不会那么慢。我认为您会得到更快的结果