重构SQL

21

是否有任何正式的技术可以用来重构 SQL,类似于这个列表在这里是用于代码的?

我目前正在为一个特定报告工作的大型查询中工作,我相信这里有很多可以重构的空间,我只是一点一点地摸索着。


1
我并不是非常清楚,但我一直想看看这本书http://www.amazon.co.uk/gp/product/0321293533。 - Martin Smith
1
那本书看起来很有趣,尽管我感觉它更多地关注于重构数据库设计而不是针对现有设计的查询。不过我可能错了。 - Mongus Pong
1
当时提问时,这本书《重构SQL应用》(https://www.oreilly.com/library/view/refactoring-sql-applications/9780596514976/)是一本相当新的参考书。它有一章专门讲述了这个主题。 - Milind Bankar
4个回答

8
我从未见过像您提供的样本这样详尽的列表。
我见过的重构SQL最有效的方法是使用with语句。 它允许您将SQL分解为可管理的部分,通常可以独立进行测试。此外,它还可以通过使用系统临时表来启用查询结果的重用。 值得花费精力去研究。
这里是一个愚蠢的例子。
WITH 
mnssnInfo AS
(
    SELECT SSN, 
           UPPER(LAST_NAME), 
           UPPER(FIRST_NAME), 
           TAXABLE_INCOME,          
           CHARITABLE_DONATIONS
    FROM IRS_MASTER_FILE
    WHERE STATE = 'MN'                 AND -- limit to Minne-so-tah
          TAXABLE_INCOME > 250000      AND -- is rich 
          CHARITABLE_DONATIONS > 5000      -- might donate too
),
doltishApplicants AS
(
    SELECT SSN, SAT_SCORE, SUBMISSION_DATE
    FROM COLLEGE_ADMISSIONS
    WHERE SAT_SCORE < 100          -- Not as smart as the average moose.
),
todaysAdmissions AS
(
    SELECT doltishApplicants.SSN, 
           TRUNC(SUBMISSION_DATE)  SUBMIT_DATE, 
           LAST_NAME, FIRST_NAME, 
           TAXABLE_INCOME
    FROM mnssnInfo,
         doltishApplicants
    WHERE mnssnInfo.SSN = doltishApplicants.SSN
)
SELECT 'Dear ' || FIRST_NAME || 
       ' your admission to WhatsaMattaU has been accepted.'
FROM todaysAdmissions
WHERE SUBMIT_DATE = TRUNC(SYSDATE)    -- For stuff received today only

我喜欢它的另一个原因是,这种形式允许您将过滤与连接分开。因此,您经常可以复制子查询并单独执行它们,以查看与之相关的结果集。


2
很好,如果它们在SQL 2005+上。如果不是,则无法使用With语句,因此临时表是您的朋友。(请注意,为了测试,最好将其作为临时表开始,并在满意后转换为With语句,这样您就可以将已建立的表保留在内存中等待,而不必每次想要检查某些内容时单独重建它们。) - eftpotrm
您也可以使用视图和内联表值函数来代替CTE。 - Sam

3

有一本关于这个主题的书:"重构数据库"。虽然我没有阅读过它,但它在亚马逊上得到了4.5/5颗星,并由Scott Ambler共同撰写,这都是好的迹象。


1
这也是来自马丁·福勒签名系列的书籍,这是另一个好迹象 - 我不知道有谁比福勒更多地推广重构作为清洁代码技术。 - Myles

1

我从未发现过。我主要做的是SQL Server工作,标准技术包括:

  • 参数化可能会更改的硬编码值(以便查询可以被缓存)
  • 查看执行计划,检查大型操作,并尝试更改它们
  • 索引调整向导(但请注意不要因为对此所做的任何更改而在其他地方造成混乱)

如果你还是卡住了,许多报告并不依赖于100%实时数据 - 尝试按时间表预先计算部分数据(或全部数据),例如在夜间。


6
听起来你在谈论优化(提高性能)而不是重构(改进设计)。 - gkrogers

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接