2017-05-08 77 views
-2

我很新的SQL编写,并试图学习如何优化我的查询。我看到网上的建议是:说明计划和索引(我使用的Teradata)优化SQL

我有一些问题:

  1. Teradata的具有“优化”解析引擎后,它意味着优化选择最有效的计划?

  2. 我知道,解释计划为我们提供了如何AMP过程的详细步骤,并给予信心和估计的时间,我们如何使用它?作为参考指南?

  3. 我们可以在视图上运行解释计划吗?

对不起,如果我的问题很愚蠢,我试图学习,并希望有人能帮助。 (:非常感谢你提前

回答

1

在答案的尝试有在这里一些不好的假设,但我已经指出了那些在适当情况下:。

  1. 在这里,您说的“SQL Server”这是一个由微软提供的产品,没有什么大问题,但是它会导致混淆,尤其是在我们为多个RDBMS所做的回答中。至于索引和优化器:索引是你对表(或者AJI中的多个表) ),它是不是当你提交一个SELECT语句,你做的东西,所以这个问题是从一个坏的假设排序的到来。

    通常我们1)做一个表,2)根据假定的使用情况确定并实施适当的索引,3)通过提交SQL来使用它。优化器将查看您的SQL,并基于索引,联接,歪斜,统计数据和其他事情来尝试确定将数据组合在一起的最佳方式。

    因此,简而言之,优化器不会对任何内容进行索引。索引是您在提交SQL之前在表上执行的操作。

  2. 解释计划告诉你究竟是如何将数据从数据库中,如何将其加入,无论是中间结果集将跨越放大器被重新分配,以及其他重要信息进行检索。 Teradata的工作原理越少,解释计划的帮助就越小,但这是开始学习的好地方!

    通常你会写一个查询并检查解释。根据你的发现,你可能想要改变你的SQL,或者采取更激烈的步骤来创建新的索引。我强烈建议您查阅Allison Torres的“解释说明”,这本书是一本书和课程。她非常有知识,她将Teradata的解释分解成非常易消化的部分。

  3. 您可以在视图上运行解释。只需在视图前粘贴关键字EXPLAIN即可。当然,它将使用基础表进行解释,因为视图只是一个使用SQL定义结果集的定义。

    如果存在索引,优化程序可能会或可能不会使用它,具体取决于它是否确定索引为您请求的数据提供了最快的路径。同样,索引为表(或AJI中的一组表)定义一次,并由优化程序决定的可从中受益的任何查询使用。

+0

非常感谢您对我的错误假设提供的帮助和支持,它肯定会清除很多事情。我会纠正原来的帖子,对此感到抱歉,真的很感谢你耐心的回答。 – ADJ

+2

其实你可以用解释前缀每个sql请求。请注意事实,优化器根据预期的行数进行选择。对于小的行号(可能是学习环境中的情况),您可能会看到,解释计划不会改变,因为优化器选择它可以更高效地读取该小表。优化器决策基于关于行号和分布的知识。这就是为什么优化中的第1步到第10步是“Collect Statistics”。向优化器提供他需要做出正确决策的信息。 – ULick