为什么数据库原来sql2000换成sql2005后查询会很慢?

时间:2022-11-30 20:43:57
最近有个系统数据库原来是sql2000的现在改成了sql2005后查询以前的历史记录会比原来sql2000时慢很多 。数据库的主表也就是几万条,关联的付表有7、8个,在查询时主表和付表用 left join连接查询的。没有用到索引,原来查询速度不快,现在换成了sql2005后,当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了,比原来sql2000时快很多。请问这是什么问题?现在查询我都是从客户端用jsp前台来查询的。

15 个解决方案

#1


脚本升级以后建议重建索引 重新更新统计信息。

#2


重建索引+更新统计信息。如果还慢,需要检查等待信息

#3


另外建议加一个完整备份+日志备份。

#4


引用 1 楼 fredrickhu 的回复:
以后建议重建索引 重新更新统计信息。



我是把sql2000的MDF文件在sql2005里附加的。你说的脚本升级和重新更新统计信息是什么意思?
还有我本来没有建索引查询不是太慢。

#5


那你BAIDU一下 SQL SERVER 更新统计信息

#6


当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢

#7


引用 6 楼 wufeng4552 的回复:
当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?

#8


引用 7 楼 a2048 的回复:
Quote: 引用 6 楼 wufeng4552 的回复:

当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?


附加mdf肯定没影响了
置于慢的原因,你要具体分析是哪个sql,不会是整体上所有sql都慢吧?

#9


引用 4 楼 a2048 的回复:
Quote: 引用 1 楼 fredrickhu 的回复:

以后建议重建索引 重新更新统计信息。



我是把sql2000的MDF文件在sql2005里附加的。你说的脚本升级和重新更新统计信息是什么意思?
还有我本来没有建索引查询不是太慢。
统计信息方面的问题,我博客有几篇:
1: http://blog.csdn.net/dba_huangzj/article/details/8702293
2: http://blog.csdn.net/dba_huangzj/article/details/8702320
3: http://blog.csdn.net/dba_huangzj/article/details/8702351
4: http://blog.csdn.net/dba_huangzj/article/details/8702359
另外你的索引问题,注意,主键默认就是聚集索引。你要考虑对主键重建一下聚集索引。

#10


引用 7 楼 a2048 的回复:
Quote: 引用 6 楼 wufeng4552 的回复:

当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?
你可以想象成,当你在北京地下室住了很久,突然给了个环境很好的别墅,你可能一时间也适应不了。SQL SERVER 从2000到2005,是目前所有版本中变化最大的。所以很多东西需要重新维护,自定义函数主要是调用底层代码,对性能一般没有影响,除非用了一些低效的写法,索引就很有关系。

#11


的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844

#12


引用 11 楼 DBA_Huangzj 的回复:
的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?

#13


引用 12 楼 a2048 的回复:
Quote: 引用 11 楼 DBA_Huangzj 的回复:

的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?
可以

#14


引用 13 楼 DBA_Huangzj 的回复:
Quote: 引用 12 楼 a2048 的回复:

Quote: 引用 11 楼 DBA_Huangzj 的回复:

的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?
可以


我更新后还是老样子,但我现在加上了一些索引后就很快了。请问版主我原来sql2000里是没有加索引查询还是可以的,但到了sql2005里就很慢了,这是为什么?

#15


两者机制不一样了,算法那些也有很大改进,你可以挑个比较慢的语句,右键空白处,然后选择用【数据库引擎优化顾问】来分析一下,是否有一些include索引建议

#1


脚本升级以后建议重建索引 重新更新统计信息。

#2


重建索引+更新统计信息。如果还慢,需要检查等待信息

#3


另外建议加一个完整备份+日志备份。

#4


引用 1 楼 fredrickhu 的回复:
以后建议重建索引 重新更新统计信息。



我是把sql2000的MDF文件在sql2005里附加的。你说的脚本升级和重新更新统计信息是什么意思?
还有我本来没有建索引查询不是太慢。

#5


那你BAIDU一下 SQL SERVER 更新统计信息

#6


当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢

#7


引用 6 楼 wufeng4552 的回复:
当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?

#8


引用 7 楼 a2048 的回复:
Quote: 引用 6 楼 wufeng4552 的回复:

当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?


附加mdf肯定没影响了
置于慢的原因,你要具体分析是哪个sql,不会是整体上所有sql都慢吧?

#9


引用 4 楼 a2048 的回复:
Quote: 引用 1 楼 fredrickhu 的回复:

以后建议重建索引 重新更新统计信息。



我是把sql2000的MDF文件在sql2005里附加的。你说的脚本升级和重新更新统计信息是什么意思?
还有我本来没有建索引查询不是太慢。
统计信息方面的问题,我博客有几篇:
1: http://blog.csdn.net/dba_huangzj/article/details/8702293
2: http://blog.csdn.net/dba_huangzj/article/details/8702320
3: http://blog.csdn.net/dba_huangzj/article/details/8702351
4: http://blog.csdn.net/dba_huangzj/article/details/8702359
另外你的索引问题,注意,主键默认就是聚集索引。你要考虑对主键重建一下聚集索引。

#10


引用 7 楼 a2048 的回复:
Quote: 引用 6 楼 wufeng4552 的回复:

当输入一个条件第一次进行查询时比原来sql2000慢好几倍,但重复刚才的查询条件再查询时就很快了
第二次查询已经在缓存了

如果一开始很慢是正常现象因为很多数据和执行计划是事先没有缓存过的

建议正常运行一段时间后再观察是不是还是很慢


已经好几天了都是这个样子。请问一下如果在sql2000里建过的索引然后把MDF文件在sql2005里附加,原来的索引和自定义函数会有影响吗?
你可以想象成,当你在北京地下室住了很久,突然给了个环境很好的别墅,你可能一时间也适应不了。SQL SERVER 从2000到2005,是目前所有版本中变化最大的。所以很多东西需要重新维护,自定义函数主要是调用底层代码,对性能一般没有影响,除非用了一些低效的写法,索引就很有关系。

#11


的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844

#12


引用 11 楼 DBA_Huangzj 的回复:
的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?

#13


引用 12 楼 a2048 的回复:
Quote: 引用 11 楼 DBA_Huangzj 的回复:

的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?
可以

#14


引用 13 楼 DBA_Huangzj 的回复:
Quote: 引用 12 楼 a2048 的回复:

Quote: 引用 11 楼 DBA_Huangzj 的回复:

的确和附加还是还原,关系不大。但是文件的存放磁盘的I/O问题、内存有没有变化、CPU配置有没有变化都具有潜在的影响。如果上面维护操作都没用,那么可以看看我下面4篇文章,虽然是2012的,但是大部分在2005还是可行的:
http://blog.csdn.net/dba_huangzj/article/details/8634633
http://blog.csdn.net/dba_huangzj/article/details/8634678
http://blog.csdn.net/dba_huangzj/article/details/8634743
http://blog.csdn.net/dba_huangzj/article/details/8634788

最后,2005对tempdb的使用已经远远大于2000,所以tempdb所在的地方也有很大的嫌疑。如果你不知道怎么入手:
http://blog.csdn.net/dba_huangzj/article/details/7607844


请教版主:我用 
USE [bus] --需要更新统计信息的数据库
 GO
 EXEC [sys].[sp_updatestats] --@resample = '' -- char(8)
 GO
这句语句对吗?是可以更新统计信息吗?
可以


我更新后还是老样子,但我现在加上了一些索引后就很快了。请问版主我原来sql2000里是没有加索引查询还是可以的,但到了sql2005里就很慢了,这是为什么?

#15


两者机制不一样了,算法那些也有很大改进,你可以挑个比较慢的语句,右键空白处,然后选择用【数据库引擎优化顾问】来分析一下,是否有一些include索引建议