在SQL中替换大小写的最有效方法

时间:2019-07-20 19:08:58

标签: sql sql-server case-when

我的数据表拥有超过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;

1 个答案:

答案 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的过程。对于这两种情况,您都可以在将数据插入表中时填充“付款类型”。要填充“付款”,您可以添加一个查找表来保存所有逻辑,以便在插入期间填充“付款”。

相关问题