跨服务器访问分区表,简单且有索引的查询都特别慢?

haitao 2013-07-31 02:04:35
跨服务器访问分区表,简单且有索引的查询都特别慢?
链接服务器上的一个大表,分了100个区

select top 100,*
from otherserver.db1.dbo.tbxxx with(nolock)
order by fid desc
此表5亿条记录,有一个fid的索引了,但是花了2分30秒
在其服务器上的任务管理器可以看到cpu满负荷跑了这么久!

另外一个表:
select top 100,*
from otherserver.db1.dbo.tbyyy with(nolock)
order by fid desc
此表2.8千万条记录,结构、索引完全一样,只是没分区,只需0秒

执行计划的查询开销,前一个是95%,后一个是5%
两者都花了100%在 远程查询(Remote Query)


在otherserver上本地查这2个表也都是0秒!
执行计划的查询开销,也是 前一个95%,后一个5%
两者都花了100%在 RID查找


上面的sql加不加 with(nolock) 效果一样

另外,此服务器是刚刚启用,数据库是从一个旧服务器备份还原过来的,应该没什么特别的


sql2005企业版32位 运行于 win2008r2 64位;64G内存,1cpu4核超线程
...全文
473 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2013-08-01
  • 打赏
  • 举报
回复
更新过统计了,还是慢,目标服务器的cpu还是持续80%(周期性地有个50%的反向毛刺) 用时2:22! 访问此服务器的其他非分区的表,一切正常,非常快 骗、绕只是暂时解决问题 从根本找出原因(哪怕确定是ms的bug)才是正规之道
nzperfect 2013-07-31
  • 打赏
  • 举报
回复
大家都是在用骗的方法,你赢了。
Shawn 2013-07-31
  • 打赏
  • 举报
回复
引用 3 楼 sz_haitao 的回复:
想起一个骗mssql的办法: 试着在本地建一个视图,内容即为第一个sql 通过链接服务器 查询 此视图,果然就很快!
top 100 desc的话,看一下统计信息中统计的fid的总数量,如果未更新统计的话,本机应该也不会快。 远程连接查询的原理是什么?我一度认为是:本地传过去SQL和参数,剩下完全是远程的事儿(包括优化),最终把结果返回来。难道远程访问用不到索引?不应该。 有哪位大神解释一下楼主的情况,期待中……
haitao 2013-07-31
  • 打赏
  • 举报
回复
想起一个骗mssql的办法: 试着在本地建一个视图,内容即为第一个sql 通过链接服务器 查询 此视图,果然就很快!
haitao 2013-07-31
  • 打赏
  • 举报
回复
没法对齐,因为是按 记录的父id%100 作为分区标志的(即分了100个区) 目前order by fid是记录的id(与父id没关系) 【您将无法切出或切入此表中的数据,因为该表具有非存储对齐索引。】 但是,在本机就很快 数据肯定已经缓存到内存了,64G已经占慢了 有点怀疑 未更新统计 的原因?每周六自动更新一次,昨天备份过来后,还未更新过 更新一次需要1个多小时。。。
Shawn 2013-07-31
  • 打赏
  • 举报
回复
#1.远程查询慢:分区索引对齐了吗?从你的描述上来看,好像没对齐。CPU跑满,可能生成了一个并行的执行计划,跟踪一下“活动和监视器”中的进程与阻塞信息。 #2.远程慢,本地快:查询本地时,是否数据已经缓存到内存?跟踪一下“活动和监视器”中的进程与阻塞信息。看一下执行计划

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧