none
Sqlserver服务器端缓存查询比客户端缓存查询还要慢? RRS feed

  • 问题

  • 大家好,我发现一个很奇怪的问题;一个大的sql查询语句在服务器端和客户端查询对比;在都清除缓存的情况下,肯定服务器端更快,但在不清除缓存的情况下,客服端竟然比服务器端要快近10倍;

    具体配置如下:

    服务器端 操作系统 windows server 2008  R2 standard sp1 + sqlserver 2008 r2 ;64位操作系统,8G内存;Intel Core i5-3470 CPU 3.2GHZ,4核的, 

    服务器端 执行一个大的sql查询,清空所有缓存情况下,查询时间 测试10次,平均耗时 6到7秒;这里的耗时时间是指如下所示的 分析时间+执行时间;

    SQL Server 分析和编译时间: 
       CPU 时间 = 250 毫秒,占用时间 = 918 毫秒。

    (164 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 62 毫秒,占用时间 = 6661 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    我本机,客户端win7 旗舰版 sp1+sqlserver 2008 R2, 64位操作系统,8G内存,Intel core i5-2400 cpu,3.1GHZ,同样是4核的;

    执行时间平均是7到8秒;

    以上都是在不清除缓存下的对比;

    清除缓存的语句:

     CHECKPOINT;
    DBCC DROPCLEANBUFFERS;
    DBCC FREEPROCCACHE;
    DBCC FREESYSTEMCACHE ('ALL');

    但如果不清除任何缓存;

    比如在第一次查询之后,再执行第二次,第三次,多次对比;

    在服务器端执行始终要要200毫秒左右,如下所示:

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (164 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 47 毫秒,占用时间 = 234 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    分析和编译时间都是0,说明都是从缓存读取的;

    而本机客户端却始终只要几十毫秒:如下所示:

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (164 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 16 毫秒,占用时间 = 54 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    刚开始我以为是这个服务器的配置问题;

    换了另外一台服务器,配置如下:

    服务器端 操作系统 windows server 2008  R2 enterprise sp1 + sqlserver 2008 r2 ;64位操作系统,80G内存(确定是80G内存);Intel Xeon  CPU E5-2650 2GHZ,16核的, 这个配置比刚才那个服务器强多了;

    服务器端执行那个大的sql;清除缓存下;平均耗时1695毫秒左右:

    但不清除缓存下,平均耗时还是要300多毫秒;

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (164 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 62 毫秒,占用时间 = 324 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    而在本机客户端连接查询,不清除缓存的情况下,仍然只要几十毫秒就可以完成

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (164 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 47 毫秒,占用时间 = 59 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    换了其它开发机器做客户端查询,仍然显示在不清除缓存情况下,客户端比服务器端要快;请问这是为什么呢?

    2015年5月25日 5:16

答案

  • What's the order did you run query On server first then on client? Does the query read data from big table? If true for both, possible reason maybe that sql builds execution plan and reads data from disk when you run query on server. When you run same query on client, sql has plan and data in cache already so needs less time.
    2015年5月25日 14:57

全部回复

  • 随便换了一个单表查询也是一样:

    select top 200* from REQ_PROC ;

    在服务器端缓存查询总要100多毫秒

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (200 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 156 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    而在客户端只要20多毫秒

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    (200 行受影响)

     SQL Server 执行时间:
       CPU 时间 = 0 毫秒,占用时间 = 26 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。

    都是用sqlserver manangement studio 查询的;

    不解,为什么服务器端的配置更强,CPU和内存都更多,缓存应该也更多,反倒在不清除缓存的情况下,服务器端会比客户端要慢呢?

    不知道服务器端和客户端的缓存机制有什么不同?

    2015年5月25日 5:48
  • 睦你的描述,客户端是 win7 + sql server,那就不是客户端查询的概念了吧?

    应该是连接到服务器查询和连接本机 sql 查询的对比关系吧?

    如果是的话,那就是不同的机器,你应该先比较一下执行计划的差异

    2015年5月25日 5:59
  • 另外,时间上,还需要考虑网络传输导致的时间差异
    2015年5月25日 6:00
  • 我是在本机通过sqlserver 连接到那两台服务器 查询的,所以称本机为客户端,并没有把数据弄到本机上;

    服务器端的查询时间,是开远程桌面,在服务器机器本身的sqlserver中查的;


    2015年5月25日 6:09
  • 虽然看服务器端是通过远程桌面,但查询是在那台机器本身上执行的,显示数据的时候也并不需要通过网路传输过来;

    而远程桌面中的内容显示给我,这个时间应该不会包括在sqlserver的统计时间之内的;

    2015年5月25日 6:11
  • 执行计划有差异么?
    2015年5月25日 7:42
  • What's the order did you run query On server first then on client? Does the query read data from big table? If true for both, possible reason maybe that sql builds execution plan and reads data from disk when you run query on server. When you run same query on client, sql has plan and data in cache already so needs less time.
    2015年5月25日 14:57