【问题标题】:Oracle-style execution hintsOracle 风格的执行提示
【发布时间】:2011-07-12 22:14:09
【问题描述】:

当您为 Oracle 编写相当复杂的 SQL 时,迟早您将不得不应用奇怪的执行提示,因为 Oracle 似乎无法自己找出“最佳”执行计划。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm

现在这肯定不是 SQL 标准。但是,我仍然想知道,是否有任何其他 RDBMS 支持这些类型的提示,我的意思是“嵌入”在 SQL 中的提示?它们在句法上是否相似(即也位于SELECT关键字和第一个选择的COLUMN之间)?您知道比较各种 RDBMS 中的提示的通用文档页面吗?

注意:我最感兴趣的是这些 RDBMS:Postgres、MySQL、HSQLDB、H2、Derby、SQLite、DB2、Sybase、SQL Server

【问题讨论】:

  • 我认为您将不得不做一些艰苦的工作并阅读每个 DBMS 的文档。
  • @Jeffrey:我可能会。但在我这样做之前,我检查了这里是否有大专家:-)
  • 同意,问也无妨,无需重新发明轮子。
  • 这份名单的意义何在?这纯粹是学术性的还是有编程目标?
  • @StephaniePage:当我问这个问题时,我正在寻找在jOOQ API 中支持 SQL 提示的最佳方式。从答案来看,到目前为止我找不到一个好的解决方案,所以只有Oracle-style hints are supported。那样的话,是的,这里面有一个编程目标:jOOQ中的API设计和提示的实现

标签: oracle rdbms sql-execution-plan optimizer-hints


【解决方案1】:

我知道在 db2 中,计划是以某种方式固定的,而不是如何固定的。在 Oracle 11g 中,除了向查询添加提示之外,还有其他选项。这些是 SQLProfiles 和 SQLPlan Baselines,两者都非常强大。相反,我刚刚完成了一个性能调优项目,我们甚至没有在代码中添加任何提示。

【讨论】:

  • 这是非常有趣的输入。就我而言,如果有任何其他数据库支持这样的事情,这真的是关于提示的语法影响。我会在问题中说明这一点。但您的意见实际上可能有助于解决我在一个完全不同的项目中遇到的一个完全不同的问题! :-) 你有指向 SQLProfiles 和计划基线的文档链接吗?
  • 当然,卢卡斯,没问题。这个 oracle.com/pls/db112/to_toc?pathname=server.112/e10822/toc.htm> 是一个很好的起点。
  • 非常感谢!这将极大地帮助我解决我们最近遇到的一些棘手的性能问题!
【解决方案2】:

您可以将Oprimizer Hints 添加到任何 SQL Server 查询中

PLAN clause 允许您为 Firebird 中的查询定义特定计划。

AFAIK,没有标准也没有接近它,但一般来说,你可以在很多 RDBM 中做到这一点,但不是全部。

【讨论】:

  • 嗯,是的,很有趣...所以 SQL server 中的语法又完全不同了
  • @Lukas:提示是一种特定于供应商的功能,AFAIK sql 标准在这个领域不需要任何东西,也许是我不知道的最新版本,所以你不能打赌即使在 2 个不同的 DBMS 中,任何标准方法都可以做到这一点,更不用说在更广泛的范围内了。
  • 我知道。但通常,这些 RDBMS 设计人员相互复制,主要是因为他们认为这样从另一个迁移会更容易(例如 DUALSYSIBM.DUMMY1 表、SYSINFORMATION_SCHEMA 模式等)
  • @Lukas,我不同意,也许是从某个系统到另一个系统,但您不能以这种方式概括各种供应商。恕我直言,事实上,sql 标准在某种程度上导致了当今查询语言的相似性和易于从一种语言迁移到另一种语言,但是如果您开始深入研究,您会发现很多差异。只需看看 4 或 5 个不同供应商之间的 trigger/sp 语言和语义,您就会发现迁移到最后并不是那么容易。
  • 是的,我同意你的看法。这一点都不简单。但我知道许多开发人员试图针对 Derby 或 HSQLDB 进行开发,然后在 Oracle 上运行生产系统。只是为了省钱。而 Derby 或 HSQLDB 以某种方式试图使他们的 RDBMS 分别看起来像 DB2 或 Oracle……不要误会我的意思:我认为像这样“切换”数据库是一个非常糟糕的主意……
【解决方案3】:

我还要提醒您,如果您要与其他数据库平台进行某种比较,Oracle 中的提示完全不具有约束力。也就是说,如果 Oracle 愿意,它可以随意忽略您的提示。

提示可能会有所帮助,但我发现我很少再使用它们了 - 至少与过去在早期 Oracle 版本中使用旧优化器时相比没有。与现在相比,当时的提示更多地是性能调优的主要内容。

【讨论】:

  • 确实如此。但是我在我的数据库抽象工具 jOOQ jooq.sourceforge.net 中有一个支持提示的请求。现在我正在尝试找到一种一般对任何语法进行建模的方法。所以是否使用提示的选择完全取决于 jOOQ 用户......
  • 提示是指令,Oracle 必须遵守它们,除非它们(提示)无效、与其他提示不兼容或由于查询转换而不适用。
  • 而且由于您无法控制查询转换,尤其是当 ORacle 从 10g 开始实施基于成本的查询转换引擎时使用的扩展路径调查......更不用说 Oracle 甚至提供了一个隐藏参数_oracle_ignore_hints。所以是的,它们是指令,但我的观点是:它们只是调谐器工具包的一小部分。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2013-05-03
相关资源
最近更新 更多