相关疑难解决方法(0)

在视图中使用 OPENQUERY 的性能影响

请在 stackoverflow 上查看此问题

我正在使用 EasySoft ODBC 驱动程序将 SQL Server 2008 R2 Express 实例链接到 Interbase,但在从远程服务器获取元数据时遇到了一些困难。从网上看,主要建议都提到使用 OPENQUERY 而不是四部分链接服务器语法。

EG 我目前的(有问题的)方法是......

CREATE VIEW [LIVE].[vwPRDETS]
AS

SELECT *
FROM [LBLIVE]...[PRDETS] WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)

但是在某些表上,调用视图时出现错误...

消息 7353,级别 16,状态 1,第 1 行链接服务器“LBLIVE”的 OLE DB 提供程序“MSDASQL”提供了不一致的元数据。在执行期间提供了一个在编译时找不到的额外列。

此外,我什至无法创建一些视图,因为我得到以下...

消息 7315,级别 16,状态 1,第 1 行 链接服务器“LBLIVE”的 OLE DB 访问接口“MSDASQL”包含多个与名称“SYSDBA”.“AUDIT_LBABKP”相匹配的表。

虽然只提到了其中一张表。

搜索网络的替代方法似乎更像是......

SELECT *
FROM OPENQUERY(<linked sevrer>, 'SELECT <column list> FROM MyTable')
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是,如果我在视图定义中使用 OPENQUERY,SQL Server 是否能够优化发送到 Interbase 的结果 SQL?或者这两种方法之间真的没有太大区别?

这是一个交叉主题,会喜欢 dba 的 POV。

sql-server-2008

15
推荐指数
1
解决办法
2万
查看次数

查询在 SQL 2005 与 SQL 2008R2 上的运行方式不同

在我的办公室,我们有一个非常难看的查询,但在生产和开发环境中运行得很好(分别为 20 秒和 4 秒)。然而,在我们的测试环境中,它需要 4 小时以上。SQL2005(+最新补丁)正在生产和开发中运行。SQL2008R2 正在测试中运行。

我查看了查询计划,它表明 SQL2008R2 正在使用 TempDB,通过表假脱机(懒惰假脱机)来存储从链接服务器返回的行。下一步是显示嵌套循环(左反半连接)占用了 96.3% 的查询。两个运营商之间的界限是 5,398MB!

SQL 2005 的查询计划显示没有使用 tempdb,也没有使用 Left Anti Semi Join。

下面是经过消毒的代码和执行计划,上面是 2005 计划,下面是 2008R2。

是什么导致了急剧放缓和变化?我期待看到不同的执行计划,所以这不会打扰我。查询时间的显着减慢让我感到困扰。

我是否必须查看底层硬件,因为2008R2版本使用的是tempdb,我必须看看如何优化它的使用?

有没有更好的方法来编写查询?

谢谢您的帮助。

    INSERT INTO Table1_GroupLock (iGroupID, dLockedDate)
SELECT 
 Table1.iGroupID,
 GETDATE()
FROM Table1
WHERE 
 NOT EXISTS (
  SELECT 1
  FROM LinkedServer.Database.Table2 Alias2
  WHERE 
   (
    Alias2.FirstName + Alias2.LastName = dbo.fnRemoveNonLetter(Table1.FullName)
    AND NOT dbo.fnRemoveNonLetter(Table1.FullName) IS NULL
    AND NOT Alias2.FirstName IS NULL 
    AND NOT Alias2.LastName  IS NULL
   ) OR (
    Alias2.FamilyName = dbo.fnRemoveNonLetter(Table1.FamilyName)
    AND Alias2.Child1Name …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008

9
推荐指数
3
解决办法
4079
查看次数

标签 统计

sql-server-2008 ×2

sql-server-2005 ×1