我试图提高我们在本地服务器上的一组视图的性能,从远程 Azure 数据库上的另一组视图中提取数据。
我们的系统提供商建议我们使用,但是如果设置了只读ApplicationIntent=ReadOnly
,我们可以通过使用远程服务器上的空间来创建临时表来进一步优化这些查询吗?tempdb
我读了这个答案,它确实有一点帮助,但希望能得到任何直接的答案。
请注意,我不是 DBA,所以我的知识非常有限。提前致谢。
整个过程结合了 SSIS 和本地 SQL Server 上的多个视图,从源头的各种视图中提取数据以尝试和优化提要。
过程如下...
- 清除旧数据,从保留表中删除临时信息。
- 本地化来自源服务器的密钥列表...
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'
- 使用一组查询本地化其余数据(包含要传递的信息的主体)。
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
),但没有成功。
- 从技术上讲,第 3 步之后的所有内容都是无关紧要的,因为它在本地盒子上都可以正常工作。
- 资源键(基本上是唯一标识符)在本地数据库中创建,以在目标表中提供特定值。
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
- 重建资源表,删除任何无关信息。
- 为主表构建最终数据。
- 从其他服务导入数据以生成人口统计信息。
- 将目标系统中的密钥映射到步骤 6 中创建的资源密钥。
- 将传输的数据标记为完整。
整个过程运行良好,最初,将信息从 Azure 服务器传输到我们自己的服务器所花费的时间最长。
在服务器上有同样的问题,我所做的不是查看远程数据,而是制作了一个临时表,每 5 分钟从该远程服务器的视图中更新一次,然后我指示我的代码改为读取该表视图(实际上只是对表使用了与视图相同的名称并重命名了视图)通过链接服务器到远程数据库的查询,可能需要很长时间才能响应,具体取决于几个因素,例如:
因此获取速度可能会有所不同,使用这种方法,您始终可以在目标服务器中为自己准备一份新副本。您可能想要更改同步持续时间以满足您的业务需求。
Resource.VisitNumber
因此,经过一些搜索和测试后,提取数据的最佳方法是按照 OP 中的第 2 步,将相同的初始条件应用于提取值的查询。我们确实必须确保所有数据都从源表中提取(我们还不能确定,因为供应商没有给我们任何与源表/视图结构相关的文档)。结构看起来确实相似,但数据使用可能不同。
每个表都包含类似的格式(注意:我无法提供有关表结构的详细信息,因为我们只能看到来自视图的字段,其中一些是从 JSON 数据生成的),具有相同的命名字段和通用函数。除此之外:
这有点疯狂。
所以,回顾一下,我们转换了这个 SQL...
……对这个……
遗憾的是,由于我们对源系统缺乏了解,我们无法保证我们指定的日期在父记录和子记录之间是一致的,因此我们花了几天时间尝试将所有内容关联起来。一如既往 - 我们需要更多信息。
我要感谢大家的投入,这是最受欢迎的。