我的表才50万条记录,为何这么慢? 同意gzhughie(hughie)的意见.同时试试:导入数据后重新更新索引 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 to: gzhughie(hughie) 1、高水位是什么概念我不太明白,望指教。我在导入完成后做过[重新组织数据及索引页],但速度还是比较慢。2、字段数差不多为20个,但字段的长度都不大,基本没有冗余。3、查询的索引是针对例如编号的,重复记录不多,而且主键的速度也不快。 硬件升级的空间不大,但我想SQL_SERVER不至于这么弱吧?我用过informix的,在30万条记录级的情况下查找还是很快的。 望指教! 你的数据库是恢复过来的吗?SQL2000好象是有这问题。 我试了下,赛扬1.3G,128M,WINXP,SQLSERVER2000专业版98万条记录,60个FIELD ,主键索引select * from tablename时间:2~4分钟!机器性能第一啊! 如果是通过网络存取sql的话可能会因为网络速度的影响而变慢 数据量太大,除了升级硬件或拆表的办法,可能没有更好的主意了。(什么SQL的优化,我现在都不相信了,厚厚的资料书上说这样可以优化那样可以优化,但对相同的语句来说事实上效果不会明显) 高水位是一个抽象的概念, 举个例子说一下,比如你有一个水池,当水涨到一个高度的时候,就会在水池的壁上留下一个痕迹(嘻,因为水很脏),就算以后把水池里的水放掉,痕迹依然存在。 数据表的高水位就是类似这个原理,当你的表曾经到达过一个数据量的时候,就会在你的物理空间上有一个记录,就算你删除了一些数据,这个痕迹也不会改变。 当你在插入数据时,如果你是用insert int ... values...这种方法插入时,系统会自动找那些你删除数据的存储块,把记录插进去,不会改变高水位; 但是如果是批量倒入,或者使用insert int ... select ...这种方法批量插入时,系统就会新开辟物理空间,这样高水位就会增加,那么水位越高,系统在查询的时候,要访问的数据存储块就越多,所以导致影响速度。 另外,查询很浪费内存,因为做查询计划,还要把查询出的数据放到内存中,如果内存不够大,你查询的数据量又多,就会导致你查出的结果集,只能有部分放到内存中,到要显示全部数据时,就会不停的从硬盘上一部分一部分的读取、写入、再读取、再写入,这样严重的影响速度,所以如果你的内存不够大,最好不要使用这么大的数据量。 To gzhughie(hughie):你的高水位说法很有意思。我觉得你可以看一下查询的数据表,是否有主键?有时没有主键的数据表查询时会很慢。再者,你的内存太少了! to gzhughie(hughie) :多谢指导!我的导入是通过存储过程一条一条从文件导入的,所以应该不会存在高水位的问题。系统设计的数据量为100万条,机器性能可以提高,但照目前的情况如此数据级我怕再好的PC机也顶不住。另,我的查询是对主键的精确匹配查询,所以每次返回的记录数只有1,对索引字段查询时也是选了TOP 100,请问除了硬件升级外还有办法解决这种性能问题吗? 你的内存实在太少了,SQL Server在内存不足时就会导致分块现象,发生分块现象时,SQL server需要频繁的进行页面置换,这是很耗资源的,当然会影响到SQL的性能了。再者使用varchar作为主健也会也会比较耗时,如果能找到你一个整形的列替代她,最好用整形的。此外,影响系统性能的还有很多,比如系统的虚拟内存大小(1.5倍物理内存最佳),磁盘速度,你的数据库文件分布,日志文件分布,tempdb设置等等都会影响到系统的性能。我的系统主表已经三千万条了,而且还有频繁的插入,查询包括大批量的查询,性能还可以,不过我的机器时p4 2G两,2G内存 建议加大内存(sql server是很吃内存的) 如何控制表中的数据被一个用户查询取出后,其他的用户就不能再查询取得? sql 新手求存储过程 sql server 2000 的 问题。 数据库文件中的数据居然可以用记事本查看? 怎么sql查询统计的横排显示 备份日志 BACKUP LOG的问题,请各位老大看看 帮忙看一下这个问题,我想与数据库有关,谢谢 sql问题,进来看下。 MSSQL 如何记录Enter(换行)这个键? 请高人摆平这个视图的问题 我的进销存系统的一点开发想法。大家帮我看看。 哪位仁兄有MCSE2000中文版教材,请联系我,本人愿以高价买下,只限于上海地区,
1、高水位是什么概念我不太明白,望指教。我在导入完成后做过[重新组织数据及索引页],但速度还是比较慢。
2、字段数差不多为20个,但字段的长度都不大,基本没有冗余。
3、查询的索引是针对例如编号的,重复记录不多,而且主键的速度也不快。 硬件升级的空间不大,但我想SQL_SERVER不至于这么弱吧?我用过informix的,在30万条记录级的情况下查找还是很快的。
望指教!
赛扬1.3G,128M,WINXP,SQLSERVER2000专业版
98万条记录,60个FIELD ,主键索引
select * from tablename
时间:2~4分钟!
机器性能第一啊!
举个例子说一下,比如你有一个水池,当水涨到一个高度的时候,就会在水池的壁上留下一个痕迹(嘻,因为水很脏),就算以后把水池里的水放掉,痕迹依然存在。
数据表的高水位就是类似这个原理,当你的表曾经到达过一个数据量的时候,就会在你的物理空间上有一个记录,就算你删除了一些数据,这个痕迹也不会改变。
当你在插入数据时,如果你是用insert int ... values...这种方法插入时,系统会自动找那些你删除数据的存储块,把记录插进去,不会改变高水位;
但是如果是批量倒入,或者使用insert int ... select ...这种方法批量插入时,系统就会新开辟物理空间,这样高水位就会增加,那么水位越高,系统在查询的时候,要访问的数据存储块就越多,所以导致影响速度。 另外,查询很浪费内存,因为做查询计划,还要把查询出的数据放到内存中,如果内存不够大,你查询的数据量又多,就会导致你查出的结果集,只能有部分放到内存中,到要显示全部数据时,就会不停的从硬盘上一部分一部分的读取、写入、再读取、再写入,这样严重的影响速度,所以如果你的内存不够大,最好不要使用这么大的数据量。
To gzhughie(hughie):
你的高水位说法很有意思。
我觉得你可以看一下查询的数据表,是否有主键?有时没有主键的数据表查询时会很慢。再者,你的内存太少了!
多谢指导!
我的导入是通过存储过程一条一条从文件导入的,所以应该不会存在高水位的问题。系统设计的数据量为100万条,机器性能可以提高,但照目前的情况如此数据级我怕再好的PC机也顶不住。
另,我的查询是对主键的精确匹配查询,所以每次返回的记录数只有1,对索引字段查询时也是选了TOP 100,请问除了硬件升级外还有办法解决这种性能问题吗?