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 / 问题 / 328042
Accepted
Paul
Paul
Asked: 2023-06-08 18:09:11 +0800 CST2023-06-08 18:09:11 +0800 CST 2023-06-08 18:09:11 +0800 CST

链接服务器和应用程序意图

  • 772

我试图提高我们在本地服务器上的一组视图的性能,从远程 Azure 数据库上的另一组视图中提取数据。

我们的系统提供商建议我们使用,但是如果设置了只读ApplicationIntent=ReadOnly,我们可以通过使用远程服务器上的空间来创建临时表来进一步优化这些查询吗?tempdb

我读了这个答案,它确实有一点帮助,但希望能得到任何直接的答案。

请注意,我不是 DBA,所以我的知识非常有限。提前致谢。

整个过程结合了 SSIS 和本地 SQL Server 上的多个视图,从源头的各种视图中提取数据以尝试和优化提要。

过程如下...

  1. 清除旧数据,从保留表中删除临时信息。
  2. 本地化来自源服务器的密钥列表...
INSERT INTO Source.ResourceCapture (VisitNumber) 
SELECT DISTINCT src.VISIT_NUMBER
FROM   [SOURCE.DATABASE.WINDOWS.NET].[Database].[dbo].[Composition_Questionaire] src
WHERE  src.Composition_Date >= GETDATE()-2 AND 
       src.Document_Title = 'Discharge Summary' AND 
       src.Status = 'final'
  1. 使用一组查询本地化其余数据(包含要传递的信息的主体)。INSERT由于所需的处理量,最终语句失败了。Azure 返回一个错误,指示我们资源不足。
INSERT INTO [Source].[Composition_Questionaire] (
    [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
    [Document_Title],[Document_Description],[Component_Title],[Component_Description],
    [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No])
SELECT 
    [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
    [Document_Title],[Document_Description],[Component_Title],[Component_Description],
    [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No]
FROM 
    [SOURCE.DATABASE.WINDOWS.NET].[Database].[dbo].[Composition_Questionaire] src 
WHERE 
    DOCUMENT_TITLE = 'Discharge Summary' AND 
    VISIT_NUMBER COLLATE SQL_Latin1_General_CP1_CI_AS IN (SELECT VisitNumber FROM Source.ResourceCapture) 

注意:是的——我确实知道使用 aJOIN而不是进行优化的问题IN,但我已经测试了这两种方法,并且该过程在 10 分钟后仍然失败。我也尝试过将供应商端的排序规则调整为我们的排序规则(即在条款内IN),但没有成功。

  1. 从技术上讲,第 3 步之后的所有内容都是无关紧要的,因为它在本地盒子上都可以正常工作。
  2. 资源键(基本上是唯一标识符)在本地数据库中创建,以在目标表中提供特定值。
INSERT INTO Core.KeyMap (ResourceID, MaxDateTime) 
SELECT      Resource_ID, MaxDateTime = MAX(CONVERT(DATETIME, Composition_Date) + CONVERT(DATETIME, Composition_Time)) 
FROM        Source.Composition_Questionaire 
WHERE       Resource_ID NOT IN (SELECT ResourceID FROM Core.KeyMap) AND 
            [Status] = 'final'
GROUP BY    Resource_ID
  1. 重建资源表,删除任何无关信息。
  2. 为主表构建最终数据。
  3. 从其他服务导入数据以生成人口统计信息。
  4. 将目标系统中的密钥映射到步骤 6 中创建的资源密钥。
  5. 将传输的数据标记为完整。

整个过程运行良好,最初,将信息从 Azure 服务器传输到我们自己的服务器所花费的时间最长。

sql-server
  • 2 2 个回答
  • 47 Views

2 个回答

  • Voted
  1. Sina Hassanpour
    2023-06-11T02:50:42+08:002023-06-11T02:50:42+08:00

    在服务器上有同样的问题,我所做的不是查看远程数据,而是制作了一个临时表,每 5 分钟从该远程服务器的视图中更新一次,然后我指示我的代码改为读取该表视图(实际上只是对表使用了与视图相同的名称并重命名了视图)通过链接服务器到远程数据库的查询,可能需要很长时间才能响应,具体取决于几个因素,例如:

    • 网络性能
    • 获取的数据量
    • 对源数据的锁定
    • 源数据库或服务器有多忙
    • 源和目标位置的隔离级别
    • 内衬服务器的类型等等

    因此获取速度可能会有所不同,使用这种方法,您始终可以在目标服务器中为自己准备一份新副本。您可能想要更改同步持续时间以满足您的业务需求。

    • 1
  2. Best Answer
    Paul
    2023-06-12T17:36:09+08:002023-06-12T17:36:09+08:00

    Resource.VisitNumber因此,经过一些搜索和测试后,提取数据的最佳方法是按照 OP 中的第 2 步,将相同的初始条件应用于提取值的查询。

    我们确实必须确保所有数据都从源表中提取(我们还不能确定,因为供应商没有给我们任何与源表/视图结构相关的文档)。结构看起来确实相似,但数据使用可能不同。

    每个表都包含类似的格式(注意:我无法提供有关表结构的详细信息,因为我们只能看到来自视图的字段,其中一些是从 JSON 数据生成的),具有相同的命名字段和通用函数。除此之外:

    • 这些值被拆分为单独的日期和时间
    • 有些视图采用垂直格式,而有些则采用水平格式
    • 并非所有预期的视图字段都已编入索引(尽管我不确定这是否对速度有很大影响)
    • 一些垂直格式的表格具有嵌套的垂直格式(是的!)

    这有点疯狂。

    所以,回顾一下,我们转换了这个 SQL...

    INSERT INTO [Source].[Composition_Questionaire] (
        [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
        [Document_Title],[Document_Description],[Component_Title],[Component_Description],
        [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No])
    SELECT 
        [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
        [Document_Title],[Document_Description],[Component_Title],[Component_Description],
        [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No]
    FROM 
        [SOURCE.DATABASE.WINDOWS.NET].[Database].[dbo].[Composition_Questionaire] src 
    WHERE 
        DOCUMENT_TITLE = 'Discharge Summary' AND 
        VISIT_NUMBER COLLATE SQL_Latin1_General_CP1_CI_AS IN (SELECT VisitNumber FROM Source.ResourceCapture) 
    

    ……对这个……

    INSERT INTO [Source].[Composition_Questionaire] (
        [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
        [Document_Title],[Document_Description],[Component_Title],[Component_Description],
        [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No])
    SELECT 
        [Resource_ID],[RTR_ID],[Visit_Number],[Status],[Composition_Date],[Composition_Time],
        [Document_Title],[Document_Description],[Component_Title],[Component_Description],
        [Finalised_By],[Component],[Question],[Response],[Instance],[Row_No],[Col_No]
    FROM 
        [SOURCE.DATABASE.WINDOWS.NET].[Database].[dbo].[Composition_Questionaire] src 
    WHERE 
        Composition_Date >= GETDATE()-2 AND 
        Document_Title = 'Discharge Summary' AND 
        Status = 'final'
    

    遗憾的是,由于我们对源系统缺乏了解,我们无法保证我们指定的日期在父记录和子记录之间是一致的,因此我们花了几天时间尝试将所有内容关联起来。一如既往 - 我们需要更多信息。

    我要感谢大家的投入,这是最受欢迎的。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

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

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

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

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

Sidebar

Stats

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

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 4 个回答
  • 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
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • 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
    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