none
SQL2005服务器上跑的比PC慢? RRS feed

  • 问题

  • 用SQL2005 SP2在一台IBM 3650(8核、16G内存、6块73G 15K做RAID 10)上做10W条会员数据插入,需要6~7分钟,而同样的操作在一台普通PC上只需要不到一分钟。操作系统是win2k3 sp2的,新装的,没有其他库在跑,没有杀毒软件。
    后来做成RAID 0试过了,速度没有任何提升。 换了几台不同的服务器,都需要6~10分钟,没有任何改善。
    请教各位是不是系统或者SQL有什么设置需要优化的?
    2009年10月10日 1:08

答案

  • 感谢大家参与这个话题。
    这个问题现在已经解决,造成服务器比PC缓慢的原因其实是硬件问题。IBM 3650配置的RAID卡8K-L这个型号性能极其低下。将数据库文件放在存储或者其他高性能RAID卡的服务器上后,同样的数据插入最快只需要40秒就搞定了!
    这个问题也给做DBA的朋友一些参考,有时候数据库效率低不一定是库结构不够优化、没有索引之类的问题。硬件问题也有可能导致问题发生。

    • 已标记为答案 黑衣人 2009年12月7日 6:31
    2009年12月7日 6:30

全部回复

  • Try run it with maxdop = 1 hint on the server.
    2009年10月10日 1:31
  • Try run it with maxdop = 1 hint on the server.

    能讲具体点儿么?不太明白你什么意思。谢谢!
    2009年10月10日 2:12
  • Most likely parallelism slowed down the process, limit it on 1 processor with maxdop = 1. Can find what maxdop means in books online.
    2009年10月10日 3:19
  • “10W条会员数据插入” 具体的操作是什么?
    2009年10月10日 3:20
  • 可能是驱动的原因
    2009年10月10日 3:37
  • 可能是驱动的原因

    您指RAID控制器驱动还是磁盘驱动?
    2009年10月10日 3:38
  • “10W条会员数据插入” 具体的操作是什么?

    循环10W次单条数据insert into插入 操作
    2009年10月10日 3:39
  • 表结构和表中的初始化数据是否一样?
    是否在操作的时候, 都没有其他进程使用这个服务器?
    是否都是跨机器插入的? (客户端网络到服务器)
    2009年10月10日 4:07
  • 全部是本地操作。没有任何其他进程使用该服务器。表是空的,什么都没有的。
    2009年10月10日 4:10
  • 数据库的恢复模型是什么?
    表的索引都一样吗?
    文件的增长的大小都一样吗?
    插入的完整sql语句贴出来。
    2009年10月10日 7:02
  • create table tbl
    (
        id int,
        username varchar(10)
    )

    go

    Declare @i int
    set @i=0
    WHILE(@i<=100000)
        BEGIN
            INSERT INTO tbl(id,username)
            values(@i,@i)
            SET @i=@i+1       
        END

    恢复模型、索引什么的都没有的。完全新装的,没有做过任何配置修改。
    2009年10月10日 7:10
  • 我在一台PC上跑下来的结果是24秒,服务器上跑下来的结果是12秒

    你这个5-6分钟有点扯蛋吧。
    2009年10月10日 7:20
  • 你还不信。我拉了好几台不同型号的服务器测试了。都是这样。你服务器什么配置?尤其是磁盘,是本地磁盘还是存储?多少块,RAID几,什么型号???
    2009年10月10日 7:23
  • PC是普通的PC,至于服务器,比PC肯定要好很多。所以你的很多不同型号的服务器,看来还是有点问题,即便它们和PC的配置一样,那也不应该比PC慢,所以你的机器的使用状态,和硬件的状态,是主要的疑点。
    2009年10月10日 7:25
  • 可否吧你的服务器硬件配置发出来,尤其是磁盘那一块的。
    我用服务器连接盘柜时候也是很快就出来了。我测试了很多服务器都不行,肯定排除服务器硬件故障等原因。所有系统都是新装的,SQL也是的。
    2009年10月10日 7:29
  • 或者你服务器操作系统做过什么配置?是不是windows 2003 enterprise sp2+sql 2005 sp2的??
    我测试过win2k3 sp1、sql 2005不打补丁的都测过。
    2009年10月10日 7:30
  • 24秒出来的PC机,是P4双核的,2G内存的,7200转sata硬盘的。


    肯定排除服务器硬件故障等原因。没那么肯定吧

    如果是闲置的机器,那你打开性能监视器看看吧。看看慢在哪里
    2009年10月10日 7:32
  • 性能监视器磁盘是跑满的,CPU和内存占用小的可怜。
    敢不敢贴出你服务器的配置??
    2009年10月10日 7:34
  • 你看一下这个几个参数
    PhysicalDisk/
       Disk Writes/Sec
       Avg. Disk Write Queue Length

    SQLServer:DataBases
       Transactions/sec

    Memory
       pages/sec

    运行脚本的时候,把你的PC和服务器的以上参数贴出来
    2009年10月10日 7:41
  • 另外再留意一下cpu的情况,有没有cpu升的很高,比如90%以上

    2009年10月10日 7:43
  • PhysicalDisk/                                                           _Total
       Disk Writes/Sec                                                    256.006
       Avg. Disk Queue Length                                        1.025 
       Avg. Disk Write Queue Length                              1.025

    SQLServer:DataBases                                             _Total
       Transactions/sec                                                   251.006

    Memory                                                                   
       pages/sec                                                               0.000
    2009年10月10日 8:09
  • 这个是服务的指标还是PC的?
    2009年10月10日 8:13
  • 服务器的。你看到了CPU和内存完全没负载。问题肯定是出在磁盘。话说您能不能贴出您服务器的配置啊?
    2009年10月10日 8:48
  • 服务器没有运行脚本的时候这些参数是不是都为0?

    PC和服务器做同样的操作,也贴出来。


    话说您能不能贴出您服务器的配置啊?
    你服务器的性能远远慢于PC,而不是快于PC慢于我的服务器,所以贴出来没有任何实际意义。

    2009年10月10日 9:04
  • 。。。。。。。
    同一台服务器,我要是把数据写到后面挂的盘柜上,马上就是几十秒了。所以我认为这个性能的差距主要是磁盘、RAID控制器或系统里面对于磁盘的配置造成的。所以才想看看你服务器是不是接的盘柜。此意义很大。
    2009年10月10日 9:07
  • 问题可能出在IO上,你检查一下你的服务器本地的磁盘和磁盘阵列吧。

    我的pc机跑这个脚本每秒都在4千左右的writes。

    不过你的存储阵列的性能也不怎么样,要几十秒呢,你要知道我的7200转的pc硬盘才24秒。
    2009年10月10日 9:19
  • LZ
    PC上和服务器上的OS以及SQL Server的版本都相同么?都是相同安装文件安装的么?
    2009年10月10日 9:22
  • 是相同的配置。

    我也知道问题可能在IO,但是服务器磁盘从性能上绝对在PC磁盘之上。只是我不是做DBA的,不知道SQL是否需要对系统或者SQL做什么配置以提高性能。
    2009年10月10日 9:37
  • 我想是这样的,IO的问题不在于配置的高低,而在于硬件是否有故障,我觉得多半是有故障。你说你用的是6快raid10,那么写入应该是单块不raid的3倍,但是为什么只有单块盘的1/10呢。这个只能说明硬件存在故障。我想你随便找一块好的盘,直接插在服务器上,即使不raid,也应该在20秒左右完成。

    2009年10月10日 9:44
  • 你别说,我还真能给你说我服务器(包括配件)无故障。我这里IBM 3650、硬盘都是N多的。已经更换了5台服务器做测试了,硬盘也是不同的。
    2009年10月10日 9:49
  • 那只能遗憾的告诉你,我猜你的5台服务器都有故障。
    2009年10月10日 9:54
  • 我raid10 的本地整列出来的数据是12秒完成
    2009年10月10日 9:54
  • 。。。。。。。
    2009年10月10日 9:55
  • 要么你试一下把整列删掉,重新建一下阵列。

    2009年10月10日 10:23
  • 早就试过了,无效的。
    2009年10月10日 10:55
  • Sounds server config issue, ask windows admin to check it. By the way, run 'sp_who2 active' to see if insert process waiting on any resource. 
    2009年10月11日 1:55
  • 你可以试一下能不能排除sql server的问题。 自己写一个程序,往磁盘上的某个文件,循环写数据,观察一下以下两个性能值,如果cpu使用不足,可以并发多个线程写。如果每秒的写入还是很慢,那就可以排除是sql server 的问题了。至于阵列的问题,要找硬件厂商了。

       Disk Writes/Sec                                                    256.006
       Avg. Disk Write Queue Length                              1.025
    2009年10月14日 3:24
  • Just use Microsoft's sqlio to do disk stress test.
    2009年10月14日 3:28
  • 用CrystalDiskMark测试下服务器和普通PC的读写速度

    2009年10月14日 3:32
    版主
  • Microsoft's sqlio的结果是如下:
    第一台服务器,使用存储:
    C:\Program Files\SQLIO>sqlio -kW -s60 -frandom -o8 -b1 -LS -Fparam.txt
    sqlio v1.5.SG
    using system counter for latency timings, -1494817296 counts per second
    parameter file used: param.txt
            file H:\testfile.dat with 2 threads (0-1) using mask 0x0 (0)
    2 threads writing for 60 secs to file H:\testfile.dat
            using 1KB random IOs
            enabling multiple I/Os per thread with 8 outstanding
    size of file H:\testfile.dat needs to be: 104857600 bytes
    current file size:      0 bytes
    need to expand by:      104857600 bytes
    expanding H:\testfile.dat ... done.
    using specified size: 100 MB for file: H:\testfile.dat
    initialization done
    CUMULATIVE DATA:
    throughput metrics:
    IOs/sec:   562.71
    MBs/sec:     0.54
    latency metrics:
    Min_Latency(ms): 0
    Avg_Latency(ms): 27
    Max_Latency(ms): 146
    histogram:
    ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
    %:  0 14 40 16  2  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 28

    第二台服务器,使用本地磁盘:
    C:\Program Files\SQLIO>sqlio -kW -s60 -frandom -o8 -b1 -LS -Fparam.txt
    sqlio v1.5.SG
    using system counter for latency timings, 1995050000 counts per second
    parameter file used: param.txt
            file c:\testfile.dat with 2 threads (0-1) using mask 0x0 (0)
    2 threads writing for 60 secs to file c:\testfile.dat
            using 1KB random IOs
            enabling multiple I/Os per thread with 8 outstanding
    using specified size: 100 MB for file: c:\testfile.dat
    initialization done
    CUMULATIVE DATA:
    throughput metrics:
    IOs/sec:  2971.96
    MBs/sec:     2.90
    latency metrics:
    Min_Latency(ms): 0
    Avg_Latency(ms): 4
    Max_Latency(ms): 616
    histogram:
    ms: 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24+
    %: 67 15  4  2  1  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  5

    从结果比较,第一台服务器写1k的小数据时0.54mb/s,第二台2.9mbs。这样看应该是第一台慢,而结果却恰恰相反。第一台连接存储的服务器做10W条数据插入只要几十秒,第二台要6~7分钟。

    如果每次写入更大数据,到8M时,第二台服务器(4块RAID0)速度优势非常明显,达到200MB/S。
    2009年10月20日 9:18
  • 这种情况,如果确认服务器磁盘等硬件正常就可以。
    服务器的磁盘跟普通PC磁盘也不同,LZ是不是在CSDN上也发过类似帖。
    2009年10月20日 10:28
  • 是的,我在好多地方发过这个帖子,希望得到问题答案,但是现在还没有找出。
    2009年10月21日 2:07
  • 可能问题的答案已经很明显了,但是要找到结点并不容易。
    LZ尝试在服务器的tempdb上运行脚本,以及在常用db中运行脚本,比较这两个时间。
    2009年10月21日 5:37
  • 用iometer也试一下,看看
    2009年10月22日 3:34
  • 再用我前面说的写文件的程序也试一下,看看结果是不是一致
    2009年10月22日 3:35
  • 根据你说的情况有以下原先会产生此问题:
    1、 你的内存是否充分利用上了。
    2、你可以通过查看动态试图看看是不是请求已完成只是显示的时候缓慢;在很多服务器上都在这这个问题,你可以看看他的处理能力就可以看出来
    2009年12月4日 9:09
  • 感谢大家参与这个话题。
    这个问题现在已经解决,造成服务器比PC缓慢的原因其实是硬件问题。IBM 3650配置的RAID卡8K-L这个型号性能极其低下。将数据库文件放在存储或者其他高性能RAID卡的服务器上后,同样的数据插入最快只需要40秒就搞定了!
    这个问题也给做DBA的朋友一些参考,有时候数据库效率低不一定是库结构不够优化、没有索引之类的问题。硬件问题也有可能导致问题发生。

    • 已标记为答案 黑衣人 2009年12月7日 6:31
    2009年12月7日 6:30