搜索
首页数据库mysql教程SQLServer分布式查询

MSSQlServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 它需要连接多个MSSQL服务器也就是具有多了数据源.实现在服务器跨域或跨服务器访问. 而这

  MSSQlServer所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或不同种类的数据源, 从概念上来说分布式查询与普通查询区别 它需要连接多个MSSQL服务器也就是具有多了数据源.实现在服务器跨域或跨服务器访问. 而这些查询是否被使用完全看使用的需要.

  本篇将演示利用SQlExpress链接远程SQlServer来获取数据方式来详细说明分布式查询需要注意细节.先看一下系统架构数据查询基本处理:
SQLServer分布式查询

  当然如果采用了分布式查询 我们系统采取数据DataBase也就可能在多个远程[Remote Server]上访问时:

SQLServer分布式查询

  如上截取系统架构中关于数据与缓存流向中涉及的分布式查询业务, 当我们从客户端Client发起请求数据时. 首先检查MemCache Server缓存服务器是否有我们想要数据. 如果没有我需要查询数据库.  而此时数据要求查询多个远程服务器上多个数据库中表, 这时利用分布式查询.获得数据 然后更新我们在缓存服务器MemCache Server上数据保持数据更新同步, 同时向客户端Client直接返回数据.那如何来执行这一系列动作中最为关键分布式查询?

  分布式查询方式

  我们知道Microsoft微软公用的数据访问的API是OLE_DB, 而对数据库MSSQlServer 2005的分布式查询支持也是OLE_DB方式.SQL Server 用户可以使用分布式查询访问以下内容:

  A:存储在多个 SQL Server 实例中的分布式数据

  B:存储在各种可以使用 OLE DB 访问接口访问的关系和非关系数据源中的异类数据

  OLE DB 访问接口将在称为行集的表格格式对象中公开数据。SQL Server 允许在 Transact-SQL 语句中像引用 SQL Server 表一样引用 OLE DB 访问接口中的行集,[其实不用关心这个行集概念 它的功能类似SQl中临时表 不过它容积更大 能容纳类型更多 更丰富]

  SQL Server 实例的客户机与 OLE DB 访问接口之间的连接 如下图:

SQLServer分布式查询

  从上图可以看出.客户端借助OLEDB接口可以访问Oracle/MS Jet/MS SQL/ODBC/第三方等这些丰富数据源来我们分布式查询提供数据. 说了这么多关于OLEDB底层支持. 关于在MSSQL2005中则支持两种方式来进行分布式查询:

  使用添加链接服务器方式(Add Link Server)

  使用特定名称及特定数据源来直接指定(Add Host Names)

  其实这两种方式在实际运用中是有区别的:

  方式A:Add Link Server方式建立服务器之间关联.创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行访问. 一般适用于持久的数据操作 对于数据量偏大 服务器之间交付时间长特点.

  方式B: Add Host Name 利用域来唯一识别数据库以及数据库表对象. 来实现跨服务器访问. 这种方式一般比较简单 主要适用于对数据需求临时性查询是使用偏多. 不适合做大批量数据提取. 有性能瓶颈.

  分布式查询实现

  在进行实现分布式查询之前.本次测试Demo对应的SQL版本:

SQLServer分布式查询

  确定SQLServer版本后如下会演示两种方式来实现分布式查询,并对Distributed Query中详细细节进行说明.

  链接服务器查询

  链接服务器配置使 SQL Server 可以对远程服务器上的 OLE DB 数据源执行命令。链接服务器具有以下优点:

  1. 访问远程服务器。
  2. 能够对企业内的异类数据源发出分布式查询、更新、命令和事务。
  3. 能够以相似的方式确定不同的数据源

  下图显示了链接服务器配置的基础:

SQLServer分布式查询

  现在利用链接服务器方式实现数据访问远程服务器数据库CustomerDB中Users表数据先本地添加LinkServer:

<p><span>1</span><span>:  </span><span>--</span><span> 建立连接服务器  第一步建立连接  IP方式来控制</span><span> </span><span><br>   </span><span>2</span><span>:   <br>   </span><span>3</span><span>:  </span><span>EXEC</span><span> sp_addlinkedserver   </span><span>'</span><span>192.168.10.104</span><span>'</span><span> , </span><span>'</span><span>SQL Server</span><span>'</span><span> <br>   </span><span>4</span><span>:   <br>   </span><span>5</span><span>:  </span><span>--</span><span> 查看链接服务器信息  [测试连接成功]</span><span><br></span><span>6</span><span>:   <br>   </span><span>7</span><span>:  </span><span>select</span><span> name , product, provider, data_source, query_timeout, lazy_schema_validation, is_remote_login_enabled, is_rpc_out_enabled <br>   </span><span>8</span><span>:  </span><span>from</span><span> sys.servers <br>   </span><span>9</span><span>:  </span><span>where</span><span> is_linked</span><span>=</span><span>1</span></p>

  如上市建立连接服务器最简单方式.建立链接服务器过程其实调用了系统存储过程Sp_addlinkedserver. 第一个参数为Name 其实用来唯一标识链接服务器. 当然可以其他任何有意义字符串来定义,但我个人建议使用远程服务器的IP来标识.第二个参数是要添加为链接服务器的 OLE DB 数据源的产品名称. 默认为Null,如果指定”SQlServer“则无需指定其他参数.

  如果你的本地装有多个数据库实例. 第一个种方式就不适用.这是就需要用SQl2005架构来唯一标识:

<p><span>1</span><span>:  </span><span>--</span><span> 含架构名  查询数据两种模式</span><span> </span><span><br>   </span><span>3</span><span>:  </span><span>select</span><span>top</span><span>10</span><span>*</span><span>from</span><span>[</span><span>192.168.10.104</span><span>]</span><span>. wl . 架构名 . 表名<br>   </span><span>5</span><span>:  </span><span>--</span><span> 架构名 [采用默认架构名 ]</span><span> </span><span><br>   </span><span>7</span><span>:  </span><span>select</span><span>top</span><span>10</span><span>*</span><span>from</span><span>[</span><span>192.168.10.104</span><span>]</span><span>. CustomerDB . dbo. Users <br></span></p>

  对于Sql2005架构这个概念很多人比较陌生:

  架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。 例如,为了避免名称冲突,同一架构中不能有两个同名的表。两个表只有在位于不同的架构中时才可以同名 例如本次Demo 在CustomerDB后对应DBO既是默认的架构名.

  创建后.如果需要修改连接服务器属性可以通过sp_serveroption系统Proc来设置:

<p><span>1</span><span>:  </span><span>--</span><span> 配置链接服务器属性 sp_serveroption为远程服务器和链接服务器设置服务器选项</span><span><br>   </span><span>2</span><span>:  </span><span>--</span><span> 语法  sp_serveroption [@server =] 'server',[@optname =] 'option_name',[@optvalue =] 'option_value'</span><span><br>   </span><span>4</span><span>:  </span><span>exec</span><span> sp_serveroption </span><span>'</span><span>192.168.10.104</span><span>'</span><span>,</span><span>'</span><span>name</span><span>'</span><span>,</span><span>'</span><span>192.168.10.104</span><span>'</span><span> <br>   </span><span>6</span><span>:  </span><span>--</span><span> 查看连接服务器</span><span><br>   </span><span>7</span><span>:  </span><span>select</span><span>*</span><span>from</span><span> sys.servers<br></span></p>

  建立后我就可以直接来查询远程服务器上数据:

<p><span>1</span><span>:  </span><span>--</span><span> 查询远程服务器数据</span><span><br>   </span><span>3</span><span>:  </span><span>select</span><span>*</span><span>from</span><span>[</span><span>192.168.10.104</span><span>]</span><span>.CustomerDB.dbo.Users   </span><span>--</span><span>[成功]</span><span><br>   </span><span>5</span><span>:  </span><span>--</span><span> sp_droplinkedsrvlogin 删除链接服务器登录名映射 [删除登录映射]</span><span><br>   </span><span>6</span><span>:  </span><span>--</span><span> 如果为 NULL,那么将会删除由 sp_addlinkedserver 创建的默认映射 [第二个参数]</span><span><br>   </span><span>8</span><span>:  </span><span>exec</span><span> sp_droplinkedsrvlogin </span><span>'</span><span>192.168.10.104</span><span>'</span><span> ,</span><span>NULL</span><span> <br>  </span><span>10</span><span>:  </span><span>--</span><span> 删除链接服务器属性 [删除服务器]</span><span><br>  </span><span>12</span><span>:  </span><span>exec</span><span> sp_dropserver </span><span>'</span><span>mytest</span><span>'</span><span>--</span><span>[删除成功 同时也删除了Sys_Server信息]</span><span><br>  </span><span>14</span><span>:  </span><span>--</span><span> 查看服务器详细信息</span><span><br>  </span><span>15</span><span>:  </span><span>EXEC</span><span> sp_helpserver<br></span></p>

  查询结果:
SQLServer分布式查询

  测试查询成功.远程数据成功获取.

  当测试完成后我们不需要这个连接服务器是即可利用SP_DroplinkServer删除掉. 对应参数为创建时Name唯一标识. 通过Sp_helpserver来查看连接服务器详细信息.

  注意如上创建连接服务器时设置srvproduct参数即OLED数据源名称时我们采用了SQlServer方式.

  下面说明这种方式特点.:

  这种方式是最为简单直接的一种建立链接服务器方式. 但是存在前提的. 测试发现:

  在所有数据库的远程连接 dbo 的方式必须建立在 SA 密码相同的基础上 ,否则容易产生无法连接的情况 Sa用户登录失败. 你也就明白这个SQlServer参数其实就是在本地数据拷贝服务器角色SysAdmin下用户SA.来对服务器进行登录. 如果你的本地Sa密码与远程服务器上密码不一致 则无法正常连接.

  经过测试还发现一种情况:

  利用Windows7访问XP(Sp2)系统时始终提示无法解析或拒绝连接SQlServer2005.这个问题我整了好久后来才到官方链接参数中发现.:如果你的XP系统没有打上SP4的补丁包 这个问题会始终出现. 需要特别注意.

  直接指定数据源分布式查询

  其实相对第一种方式, 直接指定方式在SQlServer架构中 其实跳过本地与远程服务器建立映射关系的这一步. 通过链接关系建立 其实就是建立一种内部映射关系. 如果没有映射关系则 大部分设置需要手动控制.

  直接指定数据源方式 需要开启分布式查询的基本权限 来进行查询:

<p><span>2</span><span>:  </span><span>--</span><span> 如果想使用分布式查询,必须先开通分布式查询 [外围配置 这点是所有查询操作前提]</span><span><br>   </span><span>3</span><span>:  </span><span>--</span><span> sp_configure--显示或更改当前服务器的全局配置设置</span><span><br>   </span><span>4</span><span>:  </span><span>--</span><span> reconfigure 指定如果配置设置不需要服务器停止并重新启动,则更新当前运行的值</span><span><br>   </span><span>5</span><span>:  </span><span>--</span><span> SQL2005默认是没有开启’Ad Hoc Distributed Queries’ 组件 </span><span><br>   </span><span>6</span><span>:   <br>   </span><span>7</span><span>:  </span><span>--</span><span> 启用权限</span><span><br>   </span><span>8</span><span>:  </span><span>exec</span><span> sp_configure </span><span>'</span><span>show advanced options</span><span>'</span><span>,</span><span>1</span><span>--</span><span> 显示高级配置</span><span><br>   </span><span>9</span><span>:  </span><span>reconfigure</span><span>--</span><span> 更新值</span><span><br>  </span><span>10</span><span>:  </span><span>exec</span><span> sp_configure </span><span>'</span><span>Ad Hoc Distributed Queries</span><span>'</span><span>,</span><span>1</span><span>--</span><span> 启用分布式查询</span><span><br></span><span>11</span><span>:  </span><span>reconfigure</span><span><br>  </span><span>12</span><span>:  </span><span>go</span><span><br>  </span><span>14</span><span>:   <br>  </span><span>15</span><span>:  </span><span>--</span><span> 关闭分布式查询</span><span><br></span><span>16</span><span>:  </span><span>exec</span><span> sp_configure </span><span>'</span><span>Ad Hoc Distributed Queries</span><span>'</span><span>,</span><span>0</span><span>   <br>  </span><span>17</span><span>:  </span><span>reconfigure</span><span><br>  </span><span>18</span><span>:  </span><span>exec</span><span> sp_configure </span><span>'</span><span>show advanced options</span><span>'</span><span>,</span><span>0</span><span><br>  </span><span>19</span><span>:  </span><span>reconfigure</span><span><br>  </span><span>20</span><span>:  </span><span>go</span><span>  <br>  </span><span>23</span><span>:  </span><span>--</span><span> 开启权限后 另外一种查询方式</span><span><br></span><span>24</span><span>:  </span><span>--</span><span> 查询格式</span><span><br></span><span>25</span><span>:  </span><span>SELECT</span><span>*</span><span>FROM</span><span>OPENDATASOURCE</span><span>(<br>  </span><span>26</span><span>:   </span><span>'</span><span>SQLOLEDB</span><span>'</span><span>,<br>  </span><span>27</span><span>:   </span><span>'</span><span>Data Source=远程ip;User ID=sa;Password=密码</span><span>'</span><span><br>  </span><span>28</span><span>:   ).库名.dbo.表名<br>  </span><span>29</span><span>:   </span><span>WHERE</span><span> 条件<br>  </span><span>31</span><span>:  </span><span>--</span><span> 需要开启权限 </span><span><br></span><span>32</span><span>:  </span><span>--</span><span> 开启权限 提示[远程的SqlServer不允许远程连接]</span><span><br></span><span>34</span><span>:  </span><span>select</span><span>*</span><span>from</span><span>OPENDATASOURCE</span><span>(</span><span>'</span><span>SQLOLEDB</span><span>'</span><span>,</span><span>'</span><span>Data Source=192.168.10.67; User ID=sa; Password=chenkai</span><span>'</span><span>).wl.dbo.Users</span></p>

  开启权限后. 需要里利用ReConfig命令来确认.对目前分布式查询权限的修改. 如果在使用完分布式查询后注意关闭.最后查询结果:

SQLServer分布式查询

  测试成功.

  有些人说使用数据库角色SysAdmin角色下的Sa用户进行远程数据传输和验证. 不安全. 其实在使用过程中应该不难看出. 在从远程服务器拉取数据库过程中. 本地数据库需要对权限,创建连接服务器都需要最大用户权限来操作. 而服务器呢, 只需要能连接上 同时对指定数据CustomerDB具有读写的权限即可. 当然你更多远程操作可以把用户赋予CustomerDB的OWner角色.

  这时我们如何用非SA用户来来连接远程用户?

  我们现在远程服务器上对连接创建一个用户名为Test的用户 服务器角色设置Public即可:

SQLServer分布式查询

  在用户角色设置中需要对指定访问数据CustomerDB具有读写权限:

SQLServer分布式查询

  在远程服务器创建TEst用户时使用SQlServer身份验证方式登录 这时设置密码为RemoteDB.在使用非Sa用户进行远程:

<p><span>1</span><span>:  </span><span>--</span><span> 执行前先删除已经存在数据</span><span><br>   </span><span>2</span><span>:  </span><span>Exec</span><span> sp_droplinkedsrvlogin </span><span>[</span><span>192.168.10.76</span><span>]</span><span>,</span><span>Null</span><span><br>   </span><span>3</span><span>:  </span><span>Exec</span><span> sp_dropserver </span><span>'</span><span>demodb</span><span>'</span><span><br>   </span><span>4</span><span>:   <br>   </span><span>5</span><span>:  </span><span>--</span><span> 创建服务器连接</span><span><br></span><span>6</span><span>:  </span><span>EXEC</span><span>  sp_addlinkedserver<br>   </span><span>7</span><span>:        </span><span>@server</span><span>=</span><span>'</span><span>demodb</span><span>'</span><span>,</span><span>--</span><span> 被访问的服务器别名 </span><span><br></span><span>8</span><span>:        </span><span>@srvproduct</span><span>=</span><span>''</span><span>,<br>   </span><span>9</span><span>:        </span><span>@provider</span><span>=</span><span>'</span><span>SQLOLEDB</span><span>'</span><span>,<br>  </span><span>10</span><span>:        </span><span>@datasrc</span><span>=</span><span>'</span><span>192.168.10.76</span><span>'</span><span>--</span><span> 要访问的服务器</span><span><br></span><span>12</span><span>:   <br>  </span><span>13</span><span>:  </span><span>EXEC</span><span> sp_addlinkedsrvlogin <br>  </span><span>14</span><span>:       </span><span>'</span><span>demodb</span><span>'</span><span>, </span><span>--</span><span> 被访问的服务器别名</span><span><br></span><span>15</span><span>:       </span><span>'</span><span>false</span><span>'</span><span>, <br>  </span><span>16</span><span>:       </span><span>NULL</span><span>, <br>  </span><span>17</span><span>:       </span><span>'</span><span>Test</span><span>'</span><span>, </span><span>--</span><span> 帐号</span><span><br></span><span>18</span><span>:       </span><span>'</span><span>RemoteDB</span><span>'</span><span>--</span><span> 密码</span></p>

  如上我们首先清除已经可能创建服务器数据记录. 然后创建服务器连接.sp_addlinkedSrvlogin系统存储过程用来创建链接服务器上远程登录之间的映射 . 即我们可以详细设置本地与远程服务器详细的映射信息. 例如设置我们特定用户访问的用户名和密码.

  查询数据:

<p><span>1</span><span>:  </span><span>--</span><span> 查询指定用户Test数据</span><span><br>   </span><span>2</span><span>:  </span><span>select</span><span>*</span><span>from</span><span>[</span><span>demodb</span><span>]</span><span>.CustomerDB.dbo.Users </span><span>--</span><span> [如上测试成功]</span></p>

  查询结果:

SQLServer分布式查询

  指定用户Test对CustomerDB访问数据方式测试成功.

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
您什么时候应该使用复合索引与多个单列索引?您什么时候应该使用复合索引与多个单列索引?Apr 11, 2025 am 12:06 AM

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)如何识别和优化MySQL中的慢速查询? (慢查询日志,performance_schema)Apr 10, 2025 am 09:36 AM

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL:开发人员的基本技能MySQL和SQL:开发人员的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

描述MySQL异步主奴隶复制过程。描述MySQL异步主奴隶复制过程。Apr 10, 2025 am 09:30 AM

MySQL异步主从复制通过binlog实现数据同步,提升读性能和高可用性。1)主服务器记录变更到binlog;2)从服务器通过I/O线程读取binlog;3)从服务器的SQL线程应用binlog同步数据。

mysql:简单的概念,用于轻松学习mysql:简单的概念,用于轻松学习Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

MySQL:数据库的用户友好介绍MySQL:数据库的用户友好介绍Apr 10, 2025 am 09:27 AM

MySQL的安装和基本操作包括:1.下载并安装MySQL,设置根用户密码;2.使用SQL命令创建数据库和表,如CREATEDATABASE和CREATETABLE;3.执行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.创建索引和存储过程以优化性能和实现复杂逻辑。通过这些步骤,你可以从零开始构建和管理MySQL数据库。

InnoDB缓冲池如何工作,为什么对性能至关重要?InnoDB缓冲池如何工作,为什么对性能至关重要?Apr 09, 2025 am 12:12 AM

InnoDBBufferPool通过将数据和索引页加载到内存中来提升MySQL数据库的性能。1)数据页加载到BufferPool中,减少磁盘I/O。2)脏页被标记并定期刷新到磁盘。3)LRU算法管理数据页淘汰。4)预读机制提前加载可能需要的数据页。

MySQL:初学者的数据管理易用性MySQL:初学者的数据管理易用性Apr 09, 2025 am 12:07 AM

MySQL适合初学者使用,因为它安装简单、功能强大且易于管理数据。1.安装和配置简单,适用于多种操作系统。2.支持基本操作如创建数据库和表、插入、查询、更新和删除数据。3.提供高级功能如JOIN操作和子查询。4.可以通过索引、查询优化和分表分区来提升性能。5.支持备份、恢复和安全措施,确保数据的安全和一致性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境