当前位置:  开发笔记 > 数据库 > 正文

什么是"SQL-Hints"?

如何解决《什么是"SQL-Hints"?》经验,为你挑选了2个好方法。

我是ORM解决方案的倡导者,我不时会举办关于Hibernate的研讨会.

在谈论框架生成的SQL时,人们通常会开始谈论他们如何能够使用"提示",而这对于ORM框架来说是不可能的.

通常类似于:"我们尝试过Hibernate.它在开始时看起来很有前途,但是当我们在非常复杂的生产数据库中放松它时,它就会崩溃,因为我们无法应用提示!".

但当被问到一个具体的例子时,那些人的记忆突然变得不那么清楚......

我通常感到害怕,因为整个"提示" - 主题对我来说听起来像伏都教......所以有人可以启发我吗?SQL-hints或DB-Hints是什么意思?

我唯一知道的,就是以某种方式"暗示"是SELECT ... FOR UPDATE.但这得到了Hibernate-API的支持......



1> BradC..:

SQL语句,尤其是复杂的语句,实际上可以由数据库引擎以任意数量的不同方式执行(首先读取连接中的哪个表,基于许多不同参数使用哪个索引等).

经验丰富的dba可以使用提示来鼓励数据库引擎在生成执行计划时选择特定方法.在对特定查询进行大量测试和分析之后,您通常只需要执行此操作(因为数据库引擎通常非常善于确定最佳执行计划).

这里有一些特定于MSSQL的讨论和语法:http:
//msdn.microsoft.com/en-us/library/ms181714.aspx

编辑:http : //geeks.netindonesia.net/blogs/kasim.wirama/archive/2007/12/31/sql-server-2005-query-hints.aspx中的一些其他示例



2> ConcernedOfT..:

查询提示用于在默认情况下不生成合理的查询计划时指导查询优化器.首先,查询优化器的一个小背景:

数据库编程与几乎所有其他软件开发不同,因为它具有机械组件.磁盘寻道和旋转延迟(等待特定扇区到达磁盘头下)与CPU相比非常昂贵.不同的查询解析策略将导致不同的I/O量,通常是完全不同的量.正确或错误可能会对查询的性能产生重大影响.有关查询优化的概述,请参阅本文.

SQL是声明性的 - 您指定查询的逻辑并让DBMS弄清楚如何解决它.现代的基于成本的查询优化器(某些系统,例如Oracle还保留了用于向后兼容的遗留查询优化器)将对查询运行一系列转换.它们保持语义等同,但在操作的顺序和选择上有所不同.根据在表格上收集的统计数据(密钥的大小,分布直方图),优化程序计算每个查询计划所需工作量的估计值.它选择最有效的计划.

基于成本的优化是启发式的,并且依赖于准确的统计数据.随着查询复杂性的增加,启发式方法可能会产生错误的计划,这可能会非常低效.

在这种情况下可以使用查询提示来强制查询计划中的某些策略,例如连接类型.例如,对于通常返回非常小的结果集的查询,您可能希望强制嵌套循环连接.您可能还希望强制执行某些表的连接顺序.

O/R映射器(或任何生成SQL的工具)生成自己的查询,通常不会有提示信息.如果此查询运行效率低下,则您的选项有限,其中一些选项包括:

检查表上的索引.可能你可以添加一个索引.某些系统(例如Oracle的最新版本)允许您跨多个表索引连接.

一些数据库管理系统(再次,Oracle会想到)允许您手动将查询计划与特定查询字符串相关联.查询计划由查询的哈希值缓存.如果查询是参数化的,则基本查询字符串是常量,并将解析为相同的哈希值.

作为最后的手段,您可以修改数据库模式,但这只有在您控制应用程序时才有可能.

如果您控制SQL,则可以提示查询.在实践中,实际上需要这样做是相当罕见的.具有复杂数据库模式的O/R映射器上更常见的故障模式是它们使得难以表达复杂的查询谓词或对大量数据执行复杂操作.

我倾向于提倡使用O/R映射器来完成它适合的98%的工作,并将它们放到存储过程中,它们是适当的解决方案.如果您确实需要提示查询,那么这可能是合适的策略.除非您的应用程序有某些不寻常之处(例如某种DSS),否则您只需要在少数情况下逃离O/R映射器.您可能还会发现(再次,一个例子是使用聚合数据的DSS工具),O/R映射器实际上并不是应用程序的合适策略.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有