比较两种SQL Server 链接服务器的查询方法
SQL Server 查询链接服务器上的数据有两种常用的方法:
1. 通过4部分名字(fourt-part name)直接查询。例如:
SELECT * FROM JDE_LINKED.S10B3026.RTVTCOM.F0005 WHERE DRSY = '41' AND DRRT = 'S1'
这种方式的优点就是直观、方便,还可以传递参数给where字句,灵活。
这种方式的最大缺点就是:影响链接服务器对查询进行优化。查询从链接服务器返回所有行,然后才在本地服务器进行筛选等操作。
从估计的执行计划来看,这里有一个Compute Scalar和一个Filter操作,这两个操作本来可以在链接服务器上执行的。虽然这两个操作的相对成本只有0%,但是由于这两个操作没有在链接服务器上执行,链接服务器不能优化查询,而只能执行表扫描。由于SQL Server无法对远程查询进行优化(链接服务器不一定也是SQL Server, 可能是Oracle, DB2或者其它),所以从这个执行计划中看不出来是否执行了表扫描。
2. 通过OpenQuery函数查询。
SELECT * FROM OPENQUERY(JDE_LINKED, 'SELECT DRKY,DRDL01 FROM RTVPCOM.F0005 WHERE DRSY = ''41'' AND DRRT = ''S1'' ')
这种方式的优点是允许连接服务器对查询进行优化,只需要从链接服务器返回满足筛选条件的记录(可能只是1%记录)。以这个语句为例,DRSY和DRRT字段上有索引,连接服务器可以较少的IO读取,快速地返回满足条件的记录。以下是估计的执行计划:
这种方式的缺点是: 不能传递参数给查询。由于OPENQUERY函数不支持变量,所以也不能动态构建查询语句传递给OPENQUERY。当然,可以使用sp_executesql系统存储过程执行动态SQL语句,但是会使得查询变得更复杂,可读性下降。