Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQLServer2000中对DateTime和VARCHAR字段进行索引,哪一个更有效?_Sql Server_Datetime_Optimization_Indexing_Varchar - Fatal编程技术网

Sql server 在SQLServer2000中对DateTime和VARCHAR字段进行索引,哪一个更有效?

Sql server 在SQLServer2000中对DateTime和VARCHAR字段进行索引,哪一个更有效?,sql-server,datetime,optimization,indexing,varchar,Sql Server,Datetime,Optimization,Indexing,Varchar,我们在中有一个CallLog表。该表包含类型为的CallEndTime字段,它是一个索引列 我们通常删除免费呼叫并生成月费统计报表和报表,所有SQL都使用CallEndTime作为子句中的查询条件。由于CallLog表中存在大量记录,因此查询速度较慢,因此我们希望从索引开始对其进行优化 问题: 如果查询一个额外的索引列CallEndDate,会更有效吗? 比如 必须是日期时间。日期基本上是以数字形式存储在数据库中的,因此可以相对快速地查看该值是否介于两个数字之间 如果我是你,我会考虑把数据分割成

我们在中有一个CallLog表。该表包含类型为的CallEndTime字段,它是一个索引列

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

问题: 如果查询一个额外的索引列CallEndDate,会更有效吗? 比如


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

如果我是你,我会考虑把数据分割成多个表(按月、每年的),并创建一个视图来组合所有表中的数据。这样,任何需要访问整个数据集的功能都可以使用该视图,任何只需要一个月数据的功能都可以访问特定的表,因为该表包含的数据要少得多,所以访问速度要快得多

  • 我认为比较
    DateTime
    要比
    之类的操作符快得多
  • 我同意Doctomick将日期时间拆分为年、月、日
  • 对于选择
    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'