环境是SQLServer2005
订单表中修改了几个字段的长度,原来是varchar(8000),改成了varchar(max)
修改后局域网中没有问题,但是更新到外网上又不行了,老是在下订单时提示超时情况:
网址1的数据库是一台服务器,单独的一个数据服务器,程序在这个下面运行出现了两笔/天的超时
剩余7个网址的数据库在其他一台服务器上,在这个服务器上的程序都不行,出现的超时情况比较多,而且订单量大的网址超时情况到少,订单量小的超时到多,不知道这个为什么?原理?如何解决我的疑虑:
1。是不是在多个数据库(一个实例)的情况下,SQLServer会自动优先处理量大的数据库信息?数据量小的数据库被安排到后面执行?
2.因为下订单过程中只涉及到了varchar(max)字段的增加以及修改,这样也会暂很多内存?如果现实这个字段的话也暂用很多吗?
想这种情况我该如何处理?从哪儿下手?期待高手解答

解决方案 »

  1.   

    VARCHAR(8000)跟VARCHAR(MAX)的存储、处理方式都不一样你在更新这个字段如果长度超过8000,就会按LOB Data的方式处理,资料会存储在另一个Tree中.我的建议是重建你这个表的聚集索引,然后再看效果。
      

  2.   

    增大连接超时的设置,如.net里
    sqlcommand.CommandTimeout   =   120 
      

  3.   

    试试这样的:
    1.增加SQL服务器上登录时间最大设置 
    执行系统存储过程 sp_configure 设置里面的remote login timeout(s) 
    2.在客户端设置大的超时设置 
    比如sqlcommand.CommandTimeout=120默认时间单位大概都是秒
      

  4.   

    --查询数据库db中表tb的所有索引的随片情况
    use db
    go
    select 
      a.index_id,---索引编号
      b.name,---索引名称
      avg_fragmentation_in_percent---索引的逻辑碎片
    from
      sys.dm_db_indx_physical_stats(db_id(),object_id(N'create.consume'),null,null,null) as a
    join
      sys.indexes as b
    on
      a.object_id=b.object_id 
    and
      a.index_id=b.index_id
    go---解释下sys.dm_db_indx_physical_stats的参数
    datebase_id: 数据库编号,可以使用db_id()函数获取指定数据库名对应的编号。
    object_id: 该索引所属表或试图的编号
    index_id: 该索引的编号
    partition_number:对象中分区的编号
    mode:模式名称,用于指定获取统计信息的扫描级别。
    有关sys.dm_db_indx_physical_stats的结果集中的字段名去查下联机丛书。