如何使数据质量错误日志对用户

时间:2015-07-19 15:59:19

标签: sql-server bitmap

我在SQL Server 2008中工作。我的团队在将数据移入数据仓库之前对外部数据进行数据验证。数据仓库是星型模式(即,非常大的事实表和小维度表)。我们运行的数据验证类型之一是针对维度表的域完整性/引用查找。也就是说,我们希望确保外部数据的某些列中的所有值都与维度表中的值匹配。

我以前运行此类验证的方法是使用以下技术:

INSERT INTO errors_table
SELECT
external_data_table.key AS row_key,
'not found in lookup table' AS error_message,
'column1' AS offending_column,
external_data_table.column_in_question AS offending_value
FROM external_data_table
LEFT JOIN dimension_table_1
ON
external_data_table.column_in_question = dimension_table_1.lookup_column
WHERE
dimension_table_1.lookup_column IS NULL
AND
external_data_table.LoadID = @input_value

我有很多像这样的SELECT语句,我将它们全部放在存储过程中。在我们执行存储过程之后,errors_table中的典型行看起来像:

key = 123
error_message = not found in lookup table
ofending_column = column1
offending_value = x

由于我们在许多列(具有不同维度表)上执行此操作,因此我们可能在errors_table中的多行上具有给定键(即,每个维度表查找失败一行)。

这些SELECT语句中的每一个都开始成为我们的性能问题。发生这种情况是因为external_data_table变得非常大,而每个dimension_table都非常小(即,我们将非常大的表连接到非常小的表上很多次)。

因此,一位同事建议我将所有查询压缩为一个查询,这样我只扫描一次external_data_table。换句话说,external_data_table中的每个键只会被写入errors_table一次,而不是多次(至少可能)。但是,在这种新方法下,我必须连接我的errors_message值和我的offending_value值。因此,errors_table中的典型行现在看起来像:

key = 123
error_message = not found in lookup table | not found in lookup table | ...
offending_column = column1 | column 2| ...
offending_value = x | 1 | ...

在这个新范例下,如果连接所有error_message和offending_value值,则errors_table可能变得非常难以使用。从我选择的任何输出方法,我的团队需要能够快速计算每列失败的行数。例如,通过errors_table上的SELECT,它们当前看到的输出类似于:

offending_column
count_of_offending_rows
total_count_of_rows_in_table

在这个新范例下转换errors_table以满足这种需求的最佳方法是什么?转换需要在SQL Server中进行(例如,在Excel中无转动)。一位同事建议使用位图,但我不知道这有何帮助。 (我不太了解位图。)

1 个答案:

答案 0 :(得分:0)

您的问题的标准解决方案是一个临时表,它应该仅存储目标模式的单个馈送的数据。

如果您通过查看包含来自外部源的完整数据的表来继续提供目标架构,那么无论您如何重写这些查询,您的性能问题都会很快恢复。