我试图提高我们在本地服务器上的一组视图的性能,从远程 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 服务器传输到我们自己的服务器所花费的时间最长。