为了帮助解释我的问题,我将解释一些问题。我们有一个客户数据库,包括他们地址的历史记录(即每个地址更新都会在地址表中插入一个新行,我们有视图可以提取最新信息,以便在屏幕和打印报告上进行报告)。
新搜索的用户要求是我们在搜索结果中显示他们当前的地址(如果我们有一个存档)以确定他们确实找到了正确的客户端。
我们通过在返回的搜索结果中向视图运行左连接来达到性能损失,因此这就是问题所在。
我们首先考虑的是在我们的客户表中存储最新地址的副本仅用于显示,但我们担心如何更新这些数据。我们想知道是否可以在标量函数上构建计算列来查询我们的视图并使其保持不变,或者是否是触发器是我们唯一的选择。
我是否通过寻找解决这种缓慢问题的方法完全咆哮错误的树,我是否应该调查以某种方式解决数据库调优以优化搜索?
提前致谢, 韦斯利
编辑:查询如下所示:
Select
Clients.ClientID,
Clients.LastName,
Clients.FirstName,
Clients.PreferredName,
PrimaryDeliveryCity as City,
PrimaryDeliveryPostalCode as PostalCode,
DateOfBirth,
ClientNumber
FROM
Clients LEFT JOIN v_LatestClientAddressHistoryRecord
ON Clients.ClientID = v_LatestClientAddressHistoryRecord.ClientID
WHERE
ClientNumber like @ClientNumber + '%'
确实查询确实有%,但不在连接表上。
客户有50,000条记录,视图有类似但略少,基地址表有200,000
编辑#2:
SELECT ClientAddressHistoryRecords.*
FROM
dbo.ClientAddressHistoryRecords INNER JOIN dbo.v_LatestClientAddressHistoryRecordID
ON dbo.ClientAddressHistoryRecords.ClientID = dbo.v_LatestClientAddressHistoryRecordID.ClientID
AND
dbo.ClientAddressHistoryRecords.ClientAddressHistoryRecordID = dbo.v_LatestClientAddressHistoryRecordID.MaxClientAddressHistoryRecordID
和v_LatestClientAddressHistoryRecordID视图
SELECT MAX(ClientConsentHistoryRecordID) AS MaxClientConsentHistoryRecordID, ClientID
FROM dbo.ClientConsentHistoryRecords
GROUP BY ClientID
答案 0 :(得分:1)
计算列或触发器可以为此提供解决方案。你并没有用这些想法咆哮错误的树。
然而,有一点需要考虑的是,这是否可以通过计划维护(“工作”)来处理。
如果您的过期地址没有考虑到您的日常交易,那么您可以定期(取决于您的数据增长速度 - 可能每年,每月,每周......)移动它们进入不同的表(或不同的数据库等)。这样可以使您的交易表更小,并相应地加快您的查询速度。
job
超过computed columns
或triggers
的好处是1)数据库完成的工作量会减少,2)工作可以在一个更方便的时间。考虑使用Computed列和触发器,工作在CRUD操作发生的同时完成。另一方面,预定维护可以安排在非高峰期进行(例如凌晨2点,或者无论您的操作如何)。
答案 1 :(得分:1)
另一种方法是INSTEAD OF TRIGGER
将所有插入/更新插入到历史表中(每个都作为自己的行),并将所有插入/更新合并到一个活动表中(客户的唯一行是最新的一行)。现在,您将活动查询指向活动表,如果需要历史记录,则编写该查询以从存档表中获取它。是的,你有两个活动行的副本,但假设速度问题是由于有大量的旧地址粘在一起,这可能没问题。