A. 通过分析sql语句的执行计划优化SQL
如何干预执行计划
-
-
使用hints提示
基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要DBA进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从而使语句高效的运行。例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描。在Oracle中,是通过为语句添加hints(提示)来实现干预优化器优化的目的。
hints是oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划。我们可以用hints来实现:
1.
使用的优化器的类型
2.基于代价的优化器的优化目标,是all_rows还是first_rows。
3.
表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。
4.
表之间的连接类型
5.
表之间的连接顺序
6.
语句的并行程度
除了”RULE”提示外,一旦使用的别的提示,语句就会自动的改为使用CBO优化器,此时如果你的数据字典中没有统计数据,就会使用缺省的统计数据。所以建议大家如果使用CBO或HINTS提示,则最好对表和索引进行定期的分析。
如何使用hints:
Hints只应用在它们所在sql语句块(statement
block,由select、update、delete关键字标识)上,对其它SQL语句或语句的其它部分没有影响。如:对于使用union操作的2个sql语句,如果只在一个sql语句上有hints,则该hints不会影响另一个sql语句。
我们可以使用注释(comment)来为一个语句添加hints,一个语句块只能有一个注释,而且注释只能放在SELECT,
UPDATE,
or
DELETE关键字的后面
使用hints的语法:
{DELETE|INSERT|SELECT|UPDATE}
/*+
hint
[text]
[hint[text]]...
*/
or
{DELETE|INSERT|SELECT|UPDATE}
--+
hint
[text]
[hint[text]]...
注解:
1.DELETE、INSERT、SELECT和UPDATE是标识一个语句块开始的关键字,包含提示的注释只能出现在这些关键字的后面,否则提示无效。
2.“+”号表示该注释是一个hints,该加号必须立即跟在”/*”的后面,中间不能有空格。
3.hint是下面介绍的具体提示之一,如果包含多个提示,则每个提示之间需要用一个或多个空格隔开。
4.text
是其它说明hint的注释性文本
如果你没有正确的指定hints,Oracle将忽略该hints,并且不会给出任何错误。
B. 如何查看Oracle执行计划,并通过执行计划优化SQL
一、通过PL/SQL Dev工具
1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。
2、先执行 EXPLAIN PLAN FOR select * from tableA where paraA=1,再 select * from table(DBMS_XPLAN.DISPLAY)便可以看到oracle的执行计划了,看到的结果和1中的一样,所以使用工具的时候推荐使用1方法。
注意:PL/SQL Dev工具的Command window中不支持set autotrance on的命令。还有使用工具方法查看计划看到的信息不全,有些时候我们需要sqlplus的支持。
C. 如何查看Oracle执行计划,并通过执行计划优化SQL
一、通过PL/SQL Dev工具 1、直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果。其中,Cost表示cpu的消耗,单位为n%,Cardinality表示执行的行数,等价Rows。
D. 怎么结合mysql的执行计划来优化sql
一,SQL查询优化:指,使用的语句是不是冗余的,就是有没有无用的。
你可用用explain 你的语句来比较分板一番。比如:select * from wc where 1;与select * from wc二者的执行时间不一样的;
二,SQL执行计划就是用于描述SQL引擎在执行一个sql语句时的所有步骤,通过执行计划,我们可以知道哪个表是驱动表,如何访问一个表:是通过索引访问还是通过表扫描,如何进行连接:使用嵌套连接,合并连接还是哈希连接,连接的顺序等等;
在我们处理执行计划的过程中,一般有三个步骤:
获取执行计划
理解执行计划
判断其效率
2.获取执行计划的方式
Oracle提供了以下几种方法获得sql语句的执行计划:
2.1 explain plan
这种方法用于给出当前的sql文本的评估的执行计划,oracle并不会执行相应的sql语句,而且如果sql语句有绑定参数,那么得到的执行计划并不一定就是确切的执行计划,还要根据条件中的列是否有直方图和cursor_sharing参数的配置值来判断。
a. 在sqlplus 中执行explain plan
SQL>Explain plan set sql_id=’mysql’ for select * from temp;
b. 使用dbms_xplan显示执行计划
select * from table(dbms_xplan.display());
或者:select * from table(dbms_xplan.display(statement_id => ‘mysql’));
三,优化器;是SQL执行效率的重构工具。
可以帮助将低效率的SQL优化成为高效率的。
一般主要针对查询语句。
将更多的判断条件已到叶子节点上去操作。
E. SQL优化求助,附执行计划
我不知你的DB是什么,这里介绍Oracle的方法。
在dos中通过sqlplus登陆Oracle。
setheadon
setechoon
setfeedbackon
setautotracetraceonly
select*fromA,BwhereA.id=B.id;
explain plan如下:
F. 有没有书介绍oracle sql语句的优化以及观察oracle sql的执行计划,根据执行计划修改sql
《基于成本的oracle优化法则》
Cost Based Oracle Fundamentals
来自网络
G. 如何查看sqlserver执行计划来判断SQL语句效率
对于执行计划,特别是2008,先看看有没有丢失索引。然后看执行计划里面的图标,哪个的百分比是最大的。重点优化那个。还要看有没有表扫描、聚集索引扫描等。执行计划是一本书才勉强说得完的东西。
H. sql 怎么修改执行计划 博客园
PersistenceConfig(持久层配置)
我们想要一个配置了所有可用仓库的MONGODB配置。在这个简单的应用中我们只用了一个仓库,所以配置也非常的简单:
@Configuration
class PersistenceConfig {
@Bean
public AccountRepository accountRepository() throws UnknownHostException {
return new MongoAccountRepository(mongoTemplate());
I. 优化SQL的另一种思维5 如何分析ORACLE执行计划
《优化SQL的另一种思维》目录一、性能调整综述二、有效的应用设计三、SQL语句处理的过程四、ORACLE的优化器
七、整体实例分析客户端程序优化SQL步骤tkprof程序整体实例解说
【IT专家网独家】例1:假设LARGE_TABLE是一个较大的表,且username列上没有索引
,则运行下面的语句:
SQLSELECT*FROMLARGE_TABLEwhereUSERNAME=‘TEST’;
QueryPlan
-----------------------------------------
SELECTSTATEMENTOptimizer=CHOOSE(Cost=1234Card=1Bytes=14)
TABLEACCESSFULLLARGE_TABLE[:Q65001][ANALYZED]
在这个例子中,TABLE ACCESS FULL LARGE_TABLE是第一个操作,意思是在LARGE_TABLE表上做全表扫描。当这个操作完成之后,产生的row source中的数据被送往下一步骤进行处理,在此例中,SELECT STATEMENT操作是这个查询语句的最后一步。
Optimizer=CHOOSE 指明这个查询的optimizer_mode,即optimizer_mode初始化参数指定的值,它并不是指语句执行时真的使用了该优化器
。决定该语句使用何种优化器的唯一方法是看后面的cost部分。例如,如果给出的是下面的形式,则表明使用的是CBO优化器,此处的cost表示优化器认为该执行计划的代价:
SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14)
然而假如执行计划中给出的是类似下面的信息,则表明是使用RBO优化器,因为cost部分的值为空,或者压根就没有cost部分。
SELECT STATEMENT Optimizer=CHOOSE Cost=
SELECT STATEMENT Optimizer=CHOOSE
cost属性的值是一个在oracle内部用来比较各个执行计划所耗费的代价的值,从而使优化器可以选择最好的执行计划。不同语句的cost值不具有可比性,只能对同一个语句的不同执行计划的cost值进行比较。
[:Q65001] 表明该部分查询是以并行方式运行的。里面的数据表示这个操作是由并行查询的一个slave进程处理的,以便该操作可以区别于串行执行的操作。
[ANALYZED] 表明操作中引用的对象被分析过了,在数据字典中有该对象的统计信息可以供CBO使用。
例2:假定A、B、C都是不是小表,且在A表上一个组合索引:A(a.col1,a.col2) ,注意a.col1列为索引的引导列。
考虑下面的查询:
J. oracle怎么根据执行计划调优sql
rdb和aof两种方法都用上,多重保险。 appendfsync设为always。// 单节点测性能,连续100000次算平均时间,和per second比对,性能损失不大。 性能会有些许损失,但任务执行为异步操作,无需用户同步等待,为了保证数据安全,这样是值得的。