Sql server 在SQLServer2000中对DateTime和VARCHAR字段进行索引,哪一个更有效?
我们在中有一个CallLog表。该表包含类型为的CallEndTime字段,它是一个索引列 我们通常删除免费呼叫并生成月费统计报表和报表,所有SQL都使用Sql server 在SQLServer2000中对DateTime和VARCHAR字段进行索引,哪一个更有效?,sql-server,datetime,optimization,indexing,varchar,Sql Server,Datetime,Optimization,Indexing,Varchar,我们在中有一个CallLog表。该表包含类型为的CallEndTime字段,它是一个索引列 我们通常删除免费呼叫并生成月费统计报表和报表,所有SQL都使用CallEndTime作为子句中的查询条件。由于CallLog表中存在大量记录,因此查询速度较慢,因此我们希望从索引开始对其进行优化 问题: 如果查询一个额外的索引列CallEndDate,会更有效吗? 比如 必须是日期时间。日期基本上是以数字形式存储在数据库中的,因此可以相对快速地查看该值是否介于两个数字之间 如果我是你,我会考虑把数据分割成
CallEndTime
作为子句中的查询条件。由于CallLog表中存在大量记录,因此查询速度较慢,因此我们希望从索引开始对其进行优化
问题:
如果查询一个额外的索引列CallEndDate,会更有效吗?
比如
必须是日期时间。日期基本上是以数字形式存储在数据库中的,因此可以相对快速地查看该值是否介于两个数字之间
如果我是你,我会考虑把数据分割成多个表(按月、每年的),并创建一个视图来组合所有表中的数据。这样,任何需要访问整个数据集的功能都可以使用该视图,任何只需要一个月数据的功能都可以访问特定的表,因为该表包含的数据要少得多,所以访问速度要快得多
DateTime
要比之类的操作符快得多
COUNT(*)
的查询,请检查执行计划
中是否有表查找
节点。如果是这样,这可能是因为您的CallEndTime列可为空。因为您说过在CallEndTime列上有一个[非聚集]索引。如果您使列不为空并重新生成索引,那么计算它将是一次索引扫描,速度不会太慢。我认为您将获得更快的结果
它会比上一个基于VARCHAR(7)的查询或基于VARCHAR(4)的查询更快吗?
-- 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'