AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 50228
Accepted
beeks
beeks
Asked: 2013-09-20 13:56:45 +0800 CST2013-09-20 13:56:45 +0800 CST 2013-09-20 13:56:45 +0800 CST

使用每行计数 (*) 更新本地表,这是远程服务器上内部连接的聚合

  • 772

我在链接服务器上有一个大约 350m 行的表,我在其中添加了一个额外的 INT 列作为 PACKAGE 和 DOC2 上连接的结果的记录计数(external_identification)。由于表太大,我想分批处理更新,这样我就可以衡量进度并避免创建巨大的临时表。每列都有索引。

这是 CTE 发挥作用的一个很好的例子吗?老实说,他们让我对他们需要的写作方式感到困惑,很难想象......

这些表的结构如下:

ServerA(实用程序 SQL 服务器)
表:CLIP_IDs
列:Package_UUID nvarchar(255)、MessageExtractState tinyint、[count] int(350m 行)

ServerB(主数据库服务器)
表:PACKAGE
列:Package_UUID nvarchar(255)、Package_id bigint(650m 行)
表:DOC2
列:External_Identification nvarchar(255)、Package_id bigint(2b 行)

如果从一个服务器启动查询效率更高,则两个 SQL 服务器都是双向链接的。我感觉会从 ServerA 发出查询,因为执行计划似乎提供较少的远程查询。

我在 26 小时后停止了下面的查询,因为我认为我有语法逻辑错误。有人可以解释它是什么并提供任何建议吗?

从 ServerA 执行:

DECLARE @rowsUpdated INT

SET @rowsUpdated = 1

WHILE (@rowsUpdated > 0)
BEGIN
    UPDATE CLIP_IDs
    SET [Count] = x.[count]
    FROM (
        SELECT TOP 50000 c.package_uuid
            ,count(d.external_identification) AS [count]
        FROM CLIP_IDs c
        INNER JOIN ServerB.DATABASE.dbo.package p(NOLOCK) ON c.package_uuid = p.package_uuid
        INNER JOIN ServerB.DATABASE.dbo.doc2 d(NOLOCK) ON p.package_id = d.package_id
        WHERE c.messageextractstate = 1
            AND c.[count] IS NULL
        GROUP BY c.package_uuid
        ) x

    SET @rowsUpdated = @@rowcount

    PRINT N'Finished set of rows: ' + convert(VARCHAR, getdate(), 120)
END
sql-server sql-server-2005
  • 1 1 个回答
  • 698 Views

1 个回答

  • Voted
  1. Best Answer
    billinkc
    2013-09-20T17:35:49+08:002013-09-20T17:35:49+08:00

    根据您的权限,链接服务器可能会尝试在本地传输所有数据,然后进行过滤。参考

    • 在视图中使用 OPENQUERY 的性能影响
    • 哪个更有效:从链接服务器中选择还是插入到链接服务器中?
    • 关联

    您可以通过首先将总聚合计数计算到本地服务器上的表中然后击败它来跳过这种痛苦。

    CREATE TABLE #LOCAL
    (
        package_uuid nvarchar(255) NOT NULL PRIMARY KEY CLUSTERED
    ,   [count] bigint
    );
    
    INSERT INTO
        #LOCAL
    SELECT 
        p.package_uuid
    ,   count(d.external_identification) AS [count]
    FROM 
        ServerB.DATABASE.dbo.package p
        INNER JOIN 
            ServerB.DATABASE.dbo.doc2 d
            ON p.package_id = d.package_id
    GROUP BY 
        p.package_uuid;
    

    首先尝试在 ServerB 上本地运行该查询,以了解理论吞吐量,而无需考虑您的网络。然后,您可以根据数据大小(临时表中每行 500 + 8)进行一些快速而肮脏的估计,然后这取决于您的网络。希望这都是本地网络。

    如果在 ServerB 上运行和将其拉回来之间的时间明显不同,那么您可能需要使用 OPENQUERY 语法强制在远程服务器上加入。代码大约

    CREATE TABLE #LOCAL
    (
        package_uuid nvarchar(255) NOT NULL PRIMARY KEY CLUSTERED
    ,   [count] bigint
    );
    
    INSERT INTO
        #LOCAL
    SELECT
        OQ.package_uuid
    ,   OQ.[count]
    FROM
        OPENQUERY(ServerB,
        N'
        SELECT 
            p.package_uuid
        ,   count(d.external_identification) AS [count]
        FROM 
            DATABASE.dbo.package p
            INNER JOIN 
                DATABASE.dbo.doc2 d
                ON p.package_id = d.package_id
        GROUP BY 
            p.package_uuid
        ) AS OQ;
    
    • 2

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve