问一个 oracle 的 问题
发布网友
发布时间:2022-04-10 10:08
我来回答
共5个回答
热心网友
时间:2022-04-10 11:38
sql语句 第一次执行之前会有个硬解析的过程。
1. 加载到共享池中 - SQL源代码被加载到内存中。
2. 语法解析 - Oracle检查语法拼写错误。
3. 语*析 - Oracle验证来自数据字典的所有表名和列名并且验证你是否有权访问这些数据。
4. 查询转换 - 如果允许(query_rewrite=true),oracle将把复杂的SQL转换为等价的简单形式。
5. 优化 - 根据模式的统计信息创建执行计划(在10g中或许会使用动态的样本统计信息)。
6. 创建可执行文件 - Oracle创建一个服务于SQL查询的、调用本地文件的可执行文件。
Oracle提供了 shared_pool_size参数来缓存SQL从而使我们不需要重复解析SQL(也就是第二次执行同一条sql的时候)。但是,如果shared_pool_size设置太小或者在代码中使用了非重用的SQL(例如包含直接量where name="fred"),SQL语句可能会过期。
在Oracle中软解析和硬解析的区别是什么?仅仅是上面用红色标明的第一步。也就是说,软解析不需要重新装载到共享池(以及相关的内存分配)。
通常很高的解析调用次数(>10/秒)表明你的系统有大量不同的SQL语句,或者你的SQL语句没有被重用(例如,没有使用绑定变量)。
硬解析需要把 SQL语句加载到共享池中。硬解析比软解析差很多,因为它牵涉到共享池中内存的分配和管理。一旦被加载,SQL必须完全重新检查语法和语义以及生成可执行目标。
如果shared_pool_size设置的太小或者SQL语句没有重用,则会发生大量的硬解析。
所以要适当的设置共享池大小并且通过主机变量重用SQL。
热心网友
时间:2022-04-10 12:56
这是服务器的缓存技术,重复执行的SQL能快速得到结果。
要让第一次执行都很快的话,注意WHERE和ORDER BY后面的字段都有索引。
热心网友
时间:2022-04-10 14:30
因为第一次要解析编译你的句语,以后他记住了就快了
热心网友
时间:2022-04-10 16:22
执行语句是 有执行计划的,
好比你做一个表关联查询。
先关联数据少的是不是比关联数据多的 查询速度要快啊。。第一次其实就大概做这些操作。第二次 就不需要了。所以要快。。。。其实就是oracle服务刚起来的第一次
热心网友
时间:2022-04-10 18:30
主要是两个原因:
1、sga中的library cache,用于记录sql解析信息。第一次执行的时候要解析sql,第二次执行的时候不用解析了。
2、data buffer cache,用于缓存数据块。第一次取数要到硬盘上去取,第二次能在内存中找到,这个节省了很多时间。