焦点

跨服务器查询sql

时间:2010-12-5 17:23:32  作者:焦点   来源:综合  查看:  评论:0
内容摘要:跨服务器查询,说白了就是一条SQL想拿另一台机器上的数据。这事儿搁在五年前,DBA听了直接摇头,现在倒是成了标配。我见过最野的做法,有人在存储过程里直接拼了个OPENROWSET,连的还是一台生产库—

跨服务器查询,跨服说白了就是查询一条SQL想拿另一台机器上的数据。这事儿搁在五年前,跨服DBA听了直接摇头,查询现在倒是跨服成了标配。我见过最野的查询做法,有人在存储过程里直接拼了个OPENROWSET,跨服连的查询还是一台生产库——那延迟能把人急死,跑一次要四十秒,跨服还占着两边连接池不放。查询 真正靠谱的跨服路径其实就三条:链接服务器、分布式查询、查询或者干脆把数据同步过来再查。跨服链接服务器最直观,查询SQL Server里一条`sp_addlinkedserver`就完事,跨服之后查询就像操作本地表一样,`SELECT * FROM [远程服务器].[数据库].[dbo].[表]`。听着省心,可坑全在细节里。你以为是查一条,实际它可能把整张表拉过来再过滤,索引在远端根本用不上。我调过一条跨服join,本地表两千行,远端表八百万行,愣是跑了十七分钟。后来把远端结果先缩成临时表再join,七秒搞定。优化思路就一条:尽量让远端把活干完,别把大对象往本地搬。 分布式查询就更高阶一点,拿Oracle的Database Link或者MySQL的FEDERATED引擎举例,本质上是把查询下推给远端执行。好处是语法透明,坏处是网络抖动直接拖垮整体性能。我有次半夜被叫起来,就是因为FEDERATED表连着的地域机房网络闪断,本地业务全堵在等待锁上。所以生产环境我基本不推荐这种实时跨服方案,除非数据量极小、网络极稳。 那怎么办?我现在的习惯是,能不同步就别同步,非要跨服就分两步走——先查出小结果集,再拿主键去远端匹配。要是数据量实在大,比如每天几千万的流水,那就老实做ETL,凌晨同步到本地数仓,白天随便查。代价是数据有延迟,但换来的是查询稳定可控。你得想清楚业务到底能不能容忍那几分钟的滞后。 还有个常被忽略的点:权限和字符集。跨服查询最容易栽在排序规则上,中文乱码、大小写不敏感全因两边collation不一致。我踩过一次,远端是SQL_Latin1_General_CP1_CI_AS,本地是Chinese_PRC_CI_AS,字符串比较全错。后来在连接串里显式指定`COLLATE Chinese_PRC_CI_AS`才救回来。权限更不用说,链接服务器账号别给sa,单独建个只读用户,最小权限原则。 说到底,跨服务器查询不是银弹,它是把双刃剑。用得好,省掉一套同步管道;用不好,就是给线上埋雷。我的建议是——先画清数据流向图,能缓存就缓存,能异步就异步,最后才考虑实时跨服。真到了那一步,记得给查询加超时控制,别让一条慢SQL拖垮整个应用。毕竟,机器可以等,用户等不了。
最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap