【问题标题】:Why are the rows missing? [closed]为什么缺少行? [关闭]
【发布时间】:2012-07-26 03:09:33
【问题描述】:

是否有任何工具或方法或其他东西可以帮助我分析过程。 该过程包含大约 15 个步骤,每个作业步骤由一个 SQL 脚本表示。我正在使用 Teradata。

这是我的问题 - 我的同事更改了其中一个 SQL 脚本。此更改导致添加了一些新行。问题是 - 在最终报告中的流程结束时看不到添加的行。

由于这个过程中有很多表,连接,过滤(15个sql脚本)我无法掌握所有过程并找到答案为什么最终报告中缺少这些行?

因此,您是否有任何软件、方法或一些建议,关于我应该怎么做才能找到“为什么缺少行”这个问题的答案。

【问题讨论】:

  • 我建议查看 SQL 查询。
  • 我们可以查看代码以便我们检查Why are rows missing 吗?
  • 也许你描述得不是很好,但是当我读到这个问题时,我得到的是:“代码有问题。但我不想费心查看代码或调试它试图弄清楚。我该怎么办?如果您的同事修改了某些内容但未达到预期的行为,您的同事可能需要继续修改它,直到达到预期的行为。
  • 如果您无法查看查询以确定它们是如何失败的,那么您需要聘请了解 SQL 的顾问。
  • -1 给出的信息完全无法回答 - 尽管 Rob 做出了英勇的努力

标签: sql database teradata


【解决方案1】:

我建议在您的脚本中引入一系列易失性表,您可以使用这些表来帮助调试每个运行的 SQL 语句以确认正在发生的更改。易失性表是在用户假脱机空间中创建的,因此您无需向您的 DBA 团队请求永久空间或其他数据库中的额外权限来创建这些表。

一旦您有了易失性表,您就可以开始查询易失性表并在电子表格中比较结果,以便跟踪从一个步骤或脚本到下一个步骤或脚本发生的变化。特别注意数据类型、NULL 与 NOT NULL 以及 JOIN 条件。数据类型之间的细微差别可能足以导致某些东西无法满足相等条件并因此丢弃记录。

编辑: 您是否查看过 EXPLAIN 计划以查看优化器是否将写入的内容作为 OUTER JOIN 并将其转换为 INNER JOIN?如果您的逻辑中有任何 OUTER JOIN,则必须小心您在参与 OUTER JOIN 的表上的资格。如果您将条件放在 WHERE 子句中,优化器可能会将您的联接重写为 INNER JOIN。这可能会导致行从 JOIN 的 LEFT 或 RIGHT 侧脱落,具体取决于您编写的 JOIN。

Teradata 有一个 Visual Explain 工具,我发现它用处不大。我发现 Oracle 和 SQL Server 可以生成的内容使用起来更加直观,因为它们内置在查询工具中。 Visual Explain 要求您加载 QCD 数据库,然后将工具指向它。充其量对我来说很麻烦。我发现追踪 EXPLAIN 计划更容易。您的里程可能会有所不同。

【讨论】:

  • Rob,感谢您的体面回答。问题是 - 我或多或少地试图以这种方式分析它。但问题是 - 在更改发生后 2-3 步就会失控。我从同事那里得到了一个建议,要识别新添加的行,然后选择一个,然后逐步找到过滤行的位置。我已经确定了被过滤掉的行,但是当我尝试同事建议的方法时,我被卡住了,因为事情变得太复杂了——部分行被占用,然后进行连接,然后转移到另一个表,. ..
  • 因此,我心想——是否有一些软件(希望是 Teradata 的)可以帮助我可视化整个过程——所以我可以看到哪些步骤会影响关键行。或者,由于我与 Teradata 合作了一个月,在这种情况下,你们的专家会怎么做?只是分析普通的旧 SQL 脚本?我心想——一定有一些工具可以简化这种分析……对吧?
  • @Rob:你真的见过这种行为吗? (“优化器将写入的内容作为 OUTER JOIN 并将其转换为 INNER JOIN”)这将是一个错误。
  • 另一部分:" 如果您将条件放在 WHERE 子句中,优化器可能将您的联接重写为 INNER JOIN。" 那不是“可能”,它是这样做的。如果 WHERE 条件包括外部表,那么这种情况下的结果总是好像它是一个 INNER JOIN。
  • @Cade 是的,你可能是对的。尽管如此,措辞仍然具有误导性。
【解决方案2】:

首先,您怎么知道缺少行?这是一个严重的问题。如果您不了解流程,您如何对预期的输出有信心?如果您从这一点开始探索,并理解为什么您确信缺少这些行,那应该会让您倒退到理解中。

没有什么神奇的工具可以简单地对复杂到难以理解的 SQL 进行逆向工程。

由于您的同事在更改之前和之后都有一个行为,所以我会对更改前后的所有中间表进行快照。

然后简单地比较行来看看有什么不同。

大概在中间表中的某个点,它们将开始或停止在前后之间的偏差。那个脚本显然是第一个罪魁祸首。

重复直到输出符合要求。

【讨论】:

    猜你喜欢
    • 2013-02-02
    • 2010-11-04
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多