Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重构SQL_Sql_Refactoring - Fatal编程技术网

重构SQL

重构SQL,sql,refactoring,Sql,Refactoring,是否有任何形式化的SQL重构技术类似于此代码列表 我目前正在为一个特定的报告进行一个大规模的查询,我确信这里有很多重构的空间,我只是一点一点地摸索。我从来没有发现过。我主要从事SQL Server工作,标准技术包括: 参数化可能更改的硬编码值,以便缓存查询 查看执行计划,检查大怪物在哪里,并尝试更改它们 索引优化向导,但请注意,您不会因为对此所做的任何更改而在其他地方造成混乱 如果您仍处于困境,许多报告并不依赖于100%的实时数据-请尝试按计划(如隔夜)预先计算部分数据或全部数据。我从未见过像您

是否有任何形式化的SQL重构技术类似于此代码列表


我目前正在为一个特定的报告进行一个大规模的查询,我确信这里有很多重构的空间,我只是一点一点地摸索。

我从来没有发现过。我主要从事SQL Server工作,标准技术包括:

参数化可能更改的硬编码值,以便缓存查询 查看执行计划,检查大怪物在哪里,并尝试更改它们 索引优化向导,但请注意,您不会因为对此所做的任何更改而在其他地方造成混乱
如果您仍处于困境,许多报告并不依赖于100%的实时数据-请尝试按计划(如隔夜)预先计算部分数据或全部数据。

我从未见过像您提供的示例那样详尽的列表

我见过的重构sql最有效的方法是使用。 它允许您将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

我喜欢的另一件事是,这个表单允许您将过滤和加入分离开来。因此,您可以经常复制子查询,并单独执行它们以查看与之关联的结果集。

不太涉及技术,但这个问题可能会帮助您找到SQL重构工具:


有一本关于这个主题的书:。我没有读过,但它在亚马逊上有4.5/5颗星,由Scott Ambler合著,这两个都是好兆头。

我不是真的知道,但我一直想找时间看看这本书,这本书看起来确实很有趣,虽然我感觉它更多的是重构数据库设计,而不是针对现有设计的查询。我可能是错的。当被问到这个问题时,这是一个相当新的参考。它有一章是关于这个主题的。如果他们在SQL 2005+上,那就好了。在此之前,您不能与语句一起使用,因此临时表是您的朋友。注意,对于测试,最好是以temp启动,并在您满意时转换为withs,这样您就可以将构建的表留在内存中等待,而不必在每次检查时单独重新构建它们。您还可以使用视图和内联表值函数,而不是CTE。听起来您在谈论优化改进性能而不是重构改进设计。这也是来自Martin Fowler签名系列,这是另一个好迹象——我不知道有谁比Fowler在推广重构作为干净代码技术方面做得更多。