跨服务器查询

一:场景

   先说说场景吧,为了不过分暴露业务,就用字母代替下吧,半个月前业务那边报了个bug,说根据A条件和B条件筛选一批数据,

当把时间(C条件)范围拉小点,可以筛选出数据,把(C条件)时间拉大点,就没有数据了。

 

二:分析

   乍一看,泥煤的。。。真的有点神奇哦,0-24点可以拉到数据,0-12点反而就拉不到了,晕。。。。然后就仔细分析了下代码,

然来不知道哪一个程序员在M库里根据各种条件筛选出了20条数据,因为B条件在N库里面,所以他拿着这20条数据到N库去做筛选,

结果20条数据全部暴毙,最后就拿着空集合送到前台了。。。问题泥煤的终于明白了,就是如何根据多条件去做跨服务器查询。

 

三:探索

   其实也挺悲剧的,从业快四年了也没遇到这个问题,虽然在上一家公司数据库做了主从复制,跨库,尼玛的。。。也没有跨服务

器查询呀。。。不过那天问题找到后也挺兴奋的,转了转珠子想了个办法,用多线程搞一搞。。。

 

四: 失败的一次尝试

    由于开发人员接触不了生产,要是查的话还要找二线人员。。。我人又懒,不想邮件啥的通知人家,然后就自己假象了下数据应该

不会超过多少条。。。后来就是因为这个应该导致了该解决方法的失败。

步骤如下: 

  ①: 我那时假象一天的数据应该不会超过5w吧,为了加速,我准备多开几个线程,一个线程捞tmd的5000条数据,5w的话我就开

        10个线程。10w的话就开20个线程,反正线程是随数据变的。

  ②: 就这样我分别从M和N库中捞出来我也不知道多少个OrderID,然后在两组OrderID里面求个交集,当然这个要注意了,从数据

         结构的角度说,这个需要用hash来去重,复杂度O(M+N),当我看到C#自带的intersect就是先灌到hash里面做的,我就放

         心了,至少不会出现恶心的O(MN)的复杂度了。。。

  ③: 求交集后,我现在就拿到一组OrderID了,然后拿这些orderID在内存中分页,取出20条OrderID后再到主库M中去查真正我需

         要的数据,最后把数据送到前台上。。。

这些想法在我脑子里面遨游之后,我就啪啪啪的写完了代码,测试环境下也通过了。。。然后屁颠屁颠的上生产了,就这样噩梦开始了。。。

过了个星期,业务过来说:这下好了,原先数据查不出来,现在你给我页面报错了,我说:晕,不会吧,我马上去看看。。。查了下后,然来

发现是页面执行时间过长,iis超时了。。。唉,这下没法子了,去找二线查了下数据,居然N库中有26w的数据,那我得要开52个线程,晕死,

我不知道当时生产环境的cpu狂飙的有木有。。。苦逼呀。。。还得继续扣这些猥琐的代码。。。

 

五: 再次寻找解决方案

   1:使用opendatasource跨服务器查询

         刚才我也寒酸的分析了下5个where,有4个在M库中,有1个在N库中,那就用opendatasource来做远程服务器的inner join吧。。。

         也许是公司为了性能和安全性考虑,禁用了此种使用方式,没撤,此方案破产。。。

 

   2:  做数据的冗余

        泥煤的,把我逼到绝境了。。。既然跨不了服务器,那也只能做数据冗余了,没办法,只能在M库里面建立一张冗余表,将N库中表的数

        据导入到这张冗余表吧,然后我就可以堂堂正正的用sql直接inner join了,问题也就差不多解决了,说干就干吧。

 

<1>事前冗余

       我准备在web端插入数据的时候再冗余到XX表中,虽然是个过得去的主意,但是web端太多了,你懂的,要是为了这个小功能,要去改动无

       数个的web端,工作量有点大了,还不知道人家部门配合不配合。。。而且我的需求也比较特殊,需要等M库具有某些操作的时候,N库中的

      表才会生成数据,所以该种方案想想还是放弃了。。。

<2>事后冗余

      后来还是决定用jobws每个小时去定时捞N库中的数据,然后放入M库的冗余表中,虽然业务那边看的可能不是最新的一个小时的数据,

但是没关系,这些数据不需要实时的,只要保证是最近一天的就足够了,最后也就决定这种可行点了。。。悲剧啊。。。啊啊啊啊啊。。。

时间: 2024-11-01 13:57:09

跨服务器查询的相关文章

mysql跨服务器查询(java)

问题描述 目前有两个服务器S1,S2S1中有表A,B,C,其中两张表A,B数据记录上百万条S2中有D,E,F,其中F也是上百万条数据,现在要把ABCDEF一起连表查询(性能要求本地服务器访问1毫秒以内)我是该每个数据库各自子查询再在java程序里联合(又该如何分页?),还是写一个跨服务器连表查询?以前没做过这样子的,求大神指教!! 解决方案 解决方案二:最好不要分开查询然后用程序处理,两种方案:1.使用databaseLink跨域查询,比较简单,查询频繁的话效率不高,因为每次都要去查.2.在一个

SQl 跨服务器查询语句_MsSql

select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 insert 本地库名..表名 select * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=远程ip;User ID=sa;Password=密码' ).库名.dbo.表名 或使用联结服务器: --创建linkServer exec sp_addlinked

跨服务器查询导入数据的sql语句_MsSql

insert into MICS_WorkPlan_RestDays select * from OPENROWSET('SQLOLEDB', 'SERVER=192.168.2.97;uid=用户名;pwd=密码;Database=数据库','select * from v_restdays(sql语句,可执行存储过程)') as a 此语句可用来将另一服务器中的数据插入到本数据库中的某一表内

跨服务器查询导入数据的sql语句

insert into MICS_WorkPlan_RestDays select * from OPENROWSET('SQLOLEDB', 'SERVER=192.168.2.97;uid=用户名;pwd=密码;Database=数据库','select * from v_restdays(sql语句,可执行存储过程)') as a 此语句可用来将另一服务器中的数据插入到本数据库中的某一表内

Oracle跨服务器查询插入数据

 想实现insert into 当前库表 select 远程库中的表数据这种方式的数据同步,于是配置了一下oracle服务,远程和本地服务都是oracle 一.在当前库中插入数据 ? 1 2 create public database link remotedb  connect to username identified by password using 'db'; create public database link curdb connect to username identif

SQL跨数据库服务器查询和跨表更新的操作

SQL Server数据库跨数据库服务器查询和跨表更新的相关知识是本文我们主要要介绍的内容,接下来我们就通过一个实例来介绍这一过程.实例是这样的:想实现的功能很简单, 在我的本地一个表用来保存省的信息: T_Province,在另外一台服务器上也有一个保存省的表province,其中有我本地没有的provience_name_en和provience_id信息.我希望将它们保存到我的表中. 准备工作 首先我在本地 T_Province 表中添加了 ProvinceNameEn 和 Provinc

ASP跨服务器上传文件完美解决

服务器|解决|上传 如果你有两个空间,一个大而慢,另外一个小而快,或者其中一个不支持FSO,那么跨服务器上传文件这个问题就摆在你面前了,下面就是我在解决ylog.net里面的跨服务器上传文件的日记,这个问题看似简单,里面的细节问题却是非常有趣 前提条件,空间都必须支持ASP,上传文件的服务器支持FSO,下面的叙述中,diygame.com为存上传文件的服务器,ylog.net为网站服务器,即显示用户界面的服务器... 实现功能,文件上传,上传后在网页的文本区域自动加上对于图片的UBB码,为了清楚

SQL Server跨服务器连接的多种方法

本文对SQL Server跨服务器连接的方式进行总结. 1.OPENDATASOURCE 在SQL文中直接用此语句打开数据库示例: OPENDATASOURCE( 'SQLOLEDB','Data Source=TQDBSV001 ;User ID=fish;Password=2312').RackDB.dbo.CS 此方式较为简单,但存在弊端就是速度很慢. 2.OPENROWSET 包括从 OLE DB 资料来源存取远端资料需要的所有连线资讯.这个方法是在连结伺服器存取资料表的替代方法,而且是

java 跨服务器登陆-跨服务器免登怎么实现好

问题描述 跨服务器免登怎么实现好 我现在有几个子系统分别在不同的服务器下,现在我要把他们集成到一起管理,一次登陆主系统然后各个子系统就不用登录了,请问这个有什么好的实现方案.子系统里的所有角色 菜单权限都已经放入了缓存. 解决方案 我说一下我们公司的解决方案,先生成一个UUID,存放到cookie中,然后将用户的登录信息统一放在redis服务器中.每次访问都根据cookie带来的UUID去查询redis,看用户是否登录. 这个做法的缺陷是必须保证所有请求都来自同一个浏览器,并且用户不能禁用coo