对SQLServer2000中的DateTime和VARCHAR字段进行索引,哪一个更有效



我们在Microsoft SQL Server 2000中有一个CallLog表。该表包含CallEndTime字段,该字段的类型为DATETIME,并且是一个索引列。

我们通常删除免费呼叫并生成月费统计报告和呼叫详细记录报告,所有SQL都使用WHERE子句中的CallEndTime作为查询条件。由于CallLog表中存在大量记录,查询速度较慢,因此我们希望从索引开始对其进行优化。

问题

如果查询额外索引的VARCHARCallEndDate,效率会更高吗?如

-- 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'

它必须是日期时间。日期基本上是以数字的形式存储在数据库中的,因此可以相对快速地查看值是否在两个数字之间。

如果我是你,我会考虑将数据拆分到多个表中(按月份、年份或其他),并创建一个视图来组合所有这些表中的数据。这样,任何需要整个数据集的功能都可以使用该视图,任何只需要几个月数据的功能都能够访问特定的表,这将更快,因为它包含的数据要少得多。

  1. 我认为比较DateTimeLIKE算子快得多
  2. 我同意DoctorMick关于将DateTime拆分为持久列Year、Month、Day的观点
  3. 对于选择COUNT(*)的查询,请检查execution plan中是否有Table LookUp节点。如果是这样,这可能是因为您的CallEndTime列可以为null。因为您说过在CallEndTime列上有一个[非聚集]索引。如果您将列设为NOT NULL并重新生成索引,那么计算它将是一个INDEX SCAN,它不会那么慢。我认为您会得到更快的结果

相关内容

  • 没有找到相关文章

最新更新