对SQL Server 2000中的DateTime和VARCHAR字段建立索引,哪一个更有效?

时间:2011-07-01 09:32:09

标签: sql-server datetime optimization indexing varchar

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

我们通常会删除免费电话并生成月费统计报告和call detail record报告,所有SQL都使用CallEndTime作为WHERE子句中的查询条件。由于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'

2 个答案:

答案 0 :(得分:1)

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

如果我是你,我会考虑将数据分成多个表(按月,无论什么年份),并创建一个视图来组合所有这些表中的数据。这样,任何需要整个数据集的功能都可以使用视图,只需要几个月数据的任何东西都可以访问特定的表,因为它将包含更少的数据,因此会更快。

答案 1 :(得分:1)

  1. 我认为比较DateTimeLIKE运营商要快得多。
  2. 我同意DoctorMick将您的DateTime拆分为持续列年,月,日
  3. 针对您选择COUNT(*)的查询,检查execution plan中是否有Table LookUp个节点。如果是这样,这可能是因为您的CallEndTime列可以为空。因为你说你在CallEndTime列上有一个[nonclustered]索引。如果你使你的列NOT NULL并重建那个索引,那么计算它将是INDEX SCAN并不是那么慢。我认为你会得到更快的结果。