sql-server - sql性能问题

标签 sql-server sql-server-2000 query-performance

我在 SQL Server 2000 中有一个包含 24M 记录的数据库。

当我运行这个查询时

select * from cdr
where starttime between '2011-05-15 00:00:00.000' and '2011-05-16 00:00:00.000'

甚至这个

declare @MinDate char(30) ,@MaxDate char(30)
set @MinDate=substring(convert(char,(getdate()-1), 120),1,10)+' 00:00:00.000'
set @MaxDate=substring(convert(char,(getdate()), 120),1,10)+' 00:00:00.000'
select * from cdr
where starttime between '2011-05-15 00:00:00.000' and @MaxDate

它运行速度非常快,前 10 秒返回 3500 条记录,注意 starttime 是数据库中的 char(30)

但是当我运行这个查询时,它只在 10~60 秒内返回了 32 条记录

declare @MinDate char(30), @MaxDate char(30)

set @MinDate = substring(convert(varchar, (getdate()-1), 120),1,10)+' 00:00:00.000'
set @MaxDate = substring(convert(varchar, (getdate()), 120),1,10)+' 00:00:00.000'

select * from cdr

where starttime between @MinDate and @MaxDate

::@MinDate 值为 2011-05-15 00:00:00.000

请注意,starttime 在我的数据库中已编入索引

我想知道我的问题是什么?

最佳答案

Sql server 可能有一个为查询缓存的查询计划,其中包含 2 个参数,这对于您的参数值来说不是最优的。在 sqlserver 2008 中,您可以使用优化未知提示。 http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx 在 SQL Server 2000 中,您可以尝试本文中提到的其他选项之一。

关于sql-server - sql性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6015053/

相关文章:

mysql - Group by select 基于 OR 条件

c# - SQL 服务器的连接超时

tsql - 如果函数已经存在,如何删除它?

sql - 如何从sql语句返回常量?

sql - 索引没有被使用

SQL - 在不存在的地方插入

sql - 使用 TSQL 确定表的主键

sql - 将分隔字符串传递给存储过程以搜索数据库

mysql - 为 mySQL 中的特定查询优化索引

MySql 与 SQL-Server 的性能问题