我使用SSMS 2016.我有一个拥有数百万条记录的视图。视图未编入索引,并且不应该由服务器上的作业每5分钟更新(插入,删除,更新),然后将更新数据集显示在GUI中的客户端调用应用程序中。
视图执行非常大量的转换INT值到VARCHAR,向它们附加一些字符串值。
视图还对NULL进行一些CAST操作,为它们分配列名别名。性能最差的是视图在20列上使用FOR XML PATH('')函数。
该视图还使用两个CTE作为源以及子公司来定义单个列值。
我确保在视图Select,JOIN和WHERE子句中创建了正确的索引(Clustered,nonclustered,composite和Covering)。
数据库调优顾问也没有提出任何可以提高性能的建议。
作为一种解决方法,我决定创建两个相同的物理表,每个物理表都有聚簇索引,并使用Merge语句(进一步转换为SP,然后转换为作为SQL Server代理作业)保持更新。并确保没有长时间锁定视图。然后,我将在每次合并完成后立即交换(重命名)表名。因此,在这种情况下,所有繁重的工作负载都落在SQL Server代理作业上,保持表更新。
问题是考虑到当前的数据大小,合并将花费大约15分钟,这可能会在未来增加。因此,我需要进行实时设计,以确保视图具有最新信息。
有什么想法吗?