我的数据表拥有超过3亿条记录(32个字段),并且仅包含2019年6个月的数据,这意味着它打算进一步发展。数据插入频率为“每日”(每天近200万条记录)。为了使其对前端用户有用,我需要添加一个名为“产品名称”的附加列。该列使用6列(或更少)列进行驱动,到目前为止,我拥有47种以上的产品。目前,我已经使用Case-When在表上创建了VIEW,但是1)查询视图时成本太高; 2)有时由于组合太多,它会覆盖现有产品。
我已经通过将最近90天的数据维护到另一个表(以及派生列)中的模棱两可的方式解决了查询成本问题,但是它产生了其他问题1)占用了额外的磁盘空间2)产品被覆盖,我必须截断完整的表,并且必须在修复VIEW之后重新插入完整的90天数据。这个练习花费太多时间。
请提出一些有用的技巧来摆脱这些问题。
如果有一种方法可以替换大小写,那会更有效 并帮助我摆脱被覆盖的产品或至少帮助我 跟踪是否要覆盖任何产品。
以下是几种产品的示例代码(VIEW),截至目前我已经有47种产品
SELECT [A],
CAST(LEFT([DATE TIME], 9) + ' ' + REPLACE(SUBSTRING([DATE TIME], CHARINDEX(' ', [DATE TIME]) + 1, 8), '.', ':') + ' ' + RIGHT([DATE TIME], 2) AS DATETIME) AS [TRXN DATETIME],
[B],
[C],
[D],
[E],
[F],
[TYPE],
[CATEGORY],
MEDIUM,
[G],
[SENDER],
[RECEIVER],
FEE,
DISCOUNT,
CASE
WHEN(t.[TYPE] = 'P'
AND t.[CATEGORY] = 'Ea'
AND t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh'))
THEN 'Easy'
WHEN(t.[TYPE] = 'P'
AND t.[CATEGORY] = 'Po'
AND t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh'))
THEN 'Post'
WHEN(t.[TYPE] = 'PHYSICAL_CARD'
AND t.[CATEGORY] IS NULL
AND t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh'))
THEN 'Card'
WHEN(t.[TYPE] = 'DEBIT'
AND t.[CATEGORY] IS NULL
AND t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh')
AND t.[RECEIVER] = 'xyz')
THEN 'Payment'
END AS [PRODUCT NAME] FROM dbo.ProductEvents AS t;
答案 0 :(得分:0)
第一
如我所见,您对所有CASE是否都有共同检查-
AND t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh')
要立即进行改进,您可以从所有CASE条件中删除该检查,并在末尾添加WHERE条件,如下所示-
WHERE t.MEDIUM IN('aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh')
第二:
您可以将索引应用于三列-[TYPE],[CATEGORY]和[MEDIUM]。显然,这将增加一些查询性能。
第三:
考虑到大量的数据交易,最好的选择是在数据库表中添加新列付款或[付款类型]。然后使用与您现在选择数据相同的逻辑来更新所有现有记录的新列。
对于新记录,不确定每天要发送近200万条记录。来自Application的LIVE事务,或者来自类似ETL的过程。对于这两种情况,您都可以在将数据插入表中时填充“付款类型”。要填充“付款”,您可以添加一个查找表来保存所有逻辑,以便在插入期间填充“付款”。