微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在维度表中查找未使用的行

如何解决如何在维度表中查找未使用的行

我的数据库中的维度表太大了。我的意思是,它的记录太多了-超过一百万-因为它以与链接的事实相同的速度增长。这主要是由于不良的设计,我正在尝试对其进行清理。

我尝试做的一件事是删除不再使用的维记录。事实表得到定期维护,旧快照被删除。因为维不是这样维护的,所以表中有很多行的主键值不再出现在任何链接的事实表中。 所有事实表都有外键约束。

是否可以找到主键值不再出现在与外键约束链接的任何表中的表行?

我尝试编写脚本来跟踪此情况。基本上是这样:

select key from dimension 
where not exists (select 1 from fact1 where fk = pk) 
and not exists (select 1 from fact2 where fk = pk) 
and not exists (select 1 from fact3 where fk = pk)

但是由于有很多链接表,该查询在一段时间后就会消失-至少,我的管理工作室崩溃了。所以我不确定是否还有其他选择。

解决方法

我们不得不在我的一位客户中做类似的事情。像您的查询一样,“不存在....不存在....不存在....”的查询要花大约22个小时才能运行,因此我们更改了在20分钟内处理该问题的策略。>

正如Nsousa所建议的那样,您必须拆分查询,以便SQL Server不必一次处理所有数据,而不必使用tempdb和其他所有东西。

首先,创建包含所有键的新表。创建此表的原因是不必读取每个查询的全表扫描,在8k页上有更多键,并且每次删除后处理的键集越来越小。

create table DimensionkeysToDelete (Dimkey char(32) primary key nonclustered);
insert into DimensionkeysToDelete 
select key from dimension order by key; 

然后,从删除行数最少的事实表开始,而不是删除未使用的键,而删除事实表中存在的键。 确保事实表具有适当的索引以提高性能。

delete from DimensionkeysToDelete 
from DimensionkeysToDelete d 
inner join fact1 on f.fk = d.Dimkey;

delete from DimensionkeysToDelete 
from DimensionkeysToDelete d 
inner join fact2 on f.fk = d.Dimkey;

delete from DimensionkeysToDelete 
from DimensionkeysToDelete d 
inner join fact3 on f.fk = d.Dimkey;

完成所有事实表后,只有未使用的键保留在DimensionkeysToDelete中。要回答您的问题,只需在此表上执行选择以获取该特定维度的所有未使用键,或将其与该维度结合以获取数据。

但是,据我了解到您需要清理仓库的情况,请使用此表从原始尺寸表中删除。在此步骤中,您可能还需要采取一些措施以进行审计(例如:在审计表中插入'Key'+ key +'在脚本X上+ convert(datetime,getdate(),121)+'上删除)。 ..)

我认为这可以优化,看看执行计划,但是我的客户对此感到满意,因此我们不必为此付出很多努力。

,

您可能希望将其拆分为不同的查询。分别检查事实1中未使用的行,然后分别检查事实2等。然后将所有这些结果相交,以得到所有事实表中未使用的行。

我还建议使用左外部联接而不是嵌套查询,为每个pk计数事实表中的行,并从结果集中过滤出计数不为零的行。

您的查询将很困难,因为它将同时扫描每个事实表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。