ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

【Oracle-OCP】第四次课

2019-06-15 21:51:06  阅读:304  来源: 互联网

标签:ssh sql Oracle OCP db01 root id select 第四次


Category

设置Putty免密登录

在Windows管理Linux服务器时,常使用putty登陆ssh进行远程管理。默认登陆验证方式为密码认证,该方式虽然简单,但每次登陆都要输入一长串的密码,相当麻烦。而且,如果万一把root允许登陆打开,还有可能被强力破解,导致严重的后果。
所以,通常建议用密钥登陆验证代替密码方式,即简单,又可靠。

为什么要使用公钥认证
通常,通过ssh登录远程服务器时,使用密码认证,分别输入用户名和密码,两者满足一定规则就可以登录。但是密码认证有以下的缺点:

a)用户无法设置空密码(即使系统允许空密码,也会十分危险)
b)密码容易被人偷窥或猜到
c)服务器上的一个帐户若要给多人使用,则必须让所有使用者都知道密码,导致密码容易泄露,而且修改密码时必须通知所有人

而使用公钥认证则可以解决上述问题。

a)公钥认证允许使用空密码,省去每次登录都需要输入密码的麻烦
b)多个使用者可以通过各自的密钥登录到系统上的同一个用户
c)即使修改了对应用户的密码,也不会影响登陆
d)若同时禁用密码认证,则只要保证私钥的安全,不会受到暴力破解的威胁

方法一

使用puttygen制作密钥

在这里插入图片描述
在这里插入图片描述
单击 Generate 按钮,并使用鼠标在“key”框内移动,以获得足够的随机数据供生成密钥使用:
※期间,你会看到进度条上面有个提示“Please generate some radomness by moving the mouse over the blank area.”,意思就是让你用鼠标在空白区域随机移动。随着鼠标在空白区域的移动,进度条会一直走下去。停止移动鼠标,进度条也就停止了。所以,那我们要移动鼠标,直到进度条走满为止。
在这里插入图片描述
完成后的窗口如下:

公钥部分:把上边那一段文字全选->复制备用。(不要点击“保存公钥(Save Public Key)”,点那个保存的公钥没有用!)
私钥部分:点击“保存私钥(Save Private Key)”,保存一个.ppk文件。
注:求您别给密钥文件加密码——加了密码,每次使用.ppk文件时就都需要提供,就背离自动登录这个目的。
在这里插入图片描述
设置自动输入用户名
在连接->数据选项里。(英文版:Connection->Data)
在这里插入图片描述

PuTTY关联私钥文件
在“连接 -> SSH -> 认证”选项中,“认证私钥文件”选择刚才的.ppk文件。
(英文版:Connection -> SSH -> Auth, Private keyfile for authentication)
在这里插入图片描述
在“Session -> Loging中
Host Name(or IP address) : 你的IP地址
Saved Sessions:自定义一个名称
点击Save,那么以后每次登录时双击你自定义的这个名称即可实现免密登录
在这里插入图片描述

拷贝公钥信息至authorized_keys

上面密钥信息窗口的“Key”框最后生成的就是公钥信息:

需要把该信息拷贝到Linux服务器的特定文件中:~/.ssh/authorized_keys
其中,“~”表示对应用户的主目录,以root为例。
若.ssh目录不存在,请创建它,并把公钥信息写入文件中:

#mkdir ~/.ssh

把公钥布到服务器上(假设这个服务器ip:地址为192.168.1.20)

[root@db01 .ssh]# ssh-copy-id root@192.168.1.20

拷贝公钥信息

#vi ~/.ssh/authorized_keys

示例

//////////////////root用户接续/////////////////////////////////////
login as: root
root@192.168.1.20's password:
Last login: Sun May 26 09:18:44 2019
[root@db01 ~]#
[root@db01 ~]#
[root@db01 ~]#
[root@db01 ~]#
[root@db01 ~]# ls -a
.                .bash_logout   .cache   initial-setup-ks.cfg  .viminfo
..               .bash_profile  .config  .sqlplus_history
anaconda-ks.cfg  .bashrc        .cshrc   .ssh
.bash_history    bin            .dbus    .tcshrc
//////////////////cd到.ssh路径下/////////////////////////////////////
[root@db01 ~]# cd .ssh
[root@db01 .ssh]# ls
authorized_keys
[root@db01 ~]#
[root@db01 ~]#
[root@db01 ~]#
[root@db01 .ssh]# ll
total 12
-rw-------. 1 root root  408 May 19 15:50 authorized_keys
-rw-------. 1 root root 1675 May 26 09:55 id_rsa
-rw-r--r--. 1 root root  391 May 26 09:55 id_rsa.pub
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDozmyZKUpWP8YPaPk6d3ZYZsh9goScmMsrFn7iURc       gkAwPvbwzwJbBc43c7yjR+lXvI9knKQy+/b9qCUwVfBZYMYkLZOP+CDvj6MH4Z6exgHv0ooDL2g9Jr6S       vYs7FqMwWhMwttOut3vjv64IDsU7AKHAEwMFNiRhjnI0rpWuDAEU272vtNkQA3XhrCy6jKiIU2SYv51A       dlxzWBO524xo9d4JIt64GCgK44iTAkpcOcEU2+OukC3fgd6x7G9svGVR8BcwXZh5JP5vWRLECEEMoiNe       pn7f01wdWv872t/yRL5MQ7Gcyy2JxEOUQS4NODAsgiE34fZgCXq7IGEaBSLJ root@localhost.loca       ldomain
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcF8iezLHYNHvKpiKX3kL7IIGOQQlG0ou9fx1jXVSN       sKoCHAkZKvDt7kfzWOxz5ZpI8RXfUMWdePlpB5LcdxcP9tCdkX7kWNeLeOPsK7B1bU/pkW4at+UtVAhA       jH2Rx1tSIph+hhrwZlzVKztSYuP8nNC1Q2H3Ja0C8AuwLN41HJthTlb/RvaKPy4SVIvDr0tpGEyXOL9p       Dz0NpI0WXlimdf3aicwogOfsOcwKvO0FqEI+t2SmLIczaxNy15DPARBoiBIjB528+2FbIOKwhXsDgz0z       9SgVwOx4rjhYmal3hwxj4XXeS3CVaeqFh2DF5oU5afgUSdRGnO3dXR/2shUz root@db01
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.20 db01


[root@db01 .ssh]#
[root@db01 .ssh]#
////////////////////////////////编辑authorized_keys,添加公钥//////////////////////////////////////
[root@db01 .ssh]# vim authorized_keys
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#

方法二

通过命令ssh-keygen生成公钥,私钥

ssh-keygen
ssh-copy-id root@192.168.1.20

//////////////////root用户接续/////////////////////////////////////
login as: root
root@192.168.1.20's password:
Last login: Sun May 26 09:18:44 2019
[root@db01 ~]#
[root@db01 ~]#
//////////////////通过命令ssh-keygen生成公钥,私钥/////////////////////////////////////
[root@db01 .ssh]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0pbeB9YspiHnrXNUAGFx+2oUn/Or07HBW2i6FJ4MsgQ root@db01
The key's randomart image is:
+---[RSA 2048]----+
|        =+.      |
|       . ...     |
|      E   o.     |
|       o . *..   |
|      o S B.O. . |
|       O @.B =* .|
|        =.= *+.* |
|        .o.oo +. |
|        .o  o+.  |
+----[SHA256]-----+
[root@db01 ~]#
[root@db01 ~]#
///////////////////////////////////////////将公钥传送到远程主机host上面;////////////////////////////
[root@db01 .ssh]# ssh-copy-id root@192.168.1.20
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa       .pub"
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:e3M6SK6AiRacYojlqv/hSGmn0nAgUg9YORtCVloJtAs.
ECDSA key fingerprint is MD5:c3:cd:a0:1d:f9:3a:f7:d9:3d:82:a2:98:ca:92:bf:56.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter        out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompt       ed now it is to install the new keys
root@192.168.1.20's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.1.20'"
and check to make sure that only the key(s) you wanted were added.

[root@db01 .ssh]#
[root@db01 .ssh]#
[root@db01 .ssh]#

Reference

https://blog.csdn.net/wangjunjun2008/article/details/20037101

数据字典 & 执行计划

数据字典

user_objects | dba_objects

user_objects ,dba_objects是字典表的视图
视图dba_objects记录数据库中所有的对象
dba_objects视图描述如下:

OWNER:对象拥有者
OBJECT_NAME:对象名字
SUBOBJECT_NAME:子对象名字,例如分区
OBJECT_ID:对象ID
DATA_OBJECT_ID:包含该对象的段的字典对象数字
OBJECT_TYPE:对象类型
CREATED:对象创建时间
LAST_DDL_TIME:最后修改兑现给定时间
TIMESTAMP:对象定义时间
STATUS:对象状态
TEMPORARY:对象是否是临时的。
GENERATED:对象名字是否是系统产生的
SECONDARY:是否是通过ODCIIndexCreate方法创建的secondary 对象
NAMESPACE:对象的命名空间
EDITION_NAME:对象司机的命名版本
SHARING:METADATA LINK/OBJECT LINK/NONE ,表示对象格式metadata-linked
EDITIONABLE:对象是否可编辑
ORACLE_MAINTAINED:对象是否通过ORACLE提供的脚本catalog.sql或者catproc.sql维护。

user_objects视图对象如下:
在这里插入图片描述
相关命令

select count(*) from dba_objects;  //sys用户下
select count(*) from user_objects; //scott用户下

大体思路
root用户登陆
切换oracle用户

conn sys用户
startup

conn scoot : connect scoot/tiger
select count(*) from user_objects;

conn sys
select count(*) from dba_objects;

[root@db01 ~]# su oracle
[oracle@db01 root]$
[oracle@db01 root]$
[oracle@db01 root]$ sqls

SQL*Plus: Release 11.2.0.1.0 Production on Tue May 28 21:52:26 2019

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to an idle instance.

idle>
idle>
idle>startup
ORACLE instance started.

Total System Global Area  409194496 bytes
Fixed Size                  2213856 bytes
Variable Size             310380576 bytes
Database Buffers           92274688 bytes
Redo Buffers                4325376 bytes


Database mounted.
Database opened.
idle>idle>idle>
idle>
idle>connect scott/tiger
Connected.
scott@ORCL>
scott@ORCL>
scott@ORCL>select count(*) from user_objects;

  COUNT(*)
----------
        11

scott@ORCL>
scott@ORCL>
scott@ORCL>exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@db01 root]$
[oracle@db01 root]$ sqls

SQL*Plus: Release 11.2.0.1.0 Production on Tue May 28 21:53:55 2019

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

sys@ORCL>
sys@ORCL>
sys@ORCL>select count(*) from dba_objects;

  COUNT(*)
----------
     72485

sys@ORCL>
sys@ORCL>
sys@ORCL>

创建用户 & 授权

创建用户test1,test2,
connect test1后报错ORA-01045 : usertest1 lacks create session privilege; logon denied

create user test1 identified by test1; //创建用户test1 ,密码为test1
create user test2 identified by test2; //创建用户test2 ,密码为test2
connect test1/test1
报错
ORA-01045 : usertest1 lacks create session privilege; logon denied
在这里插入图片描述

sys下授权test1,test2予以connect,resource的角色

Connect sys as sysdba
oracle
grant connect,resource to test1,test2;
在这里插入图片描述

connect test1
授权用户test2予以将test1_t1用户select权限

Connect test1/test1
create table test1_t1(id number);
insert into test1_t1 values(1);
grant select on test1_t1 to test2;
在这里插入图片描述
connect test2,查看有权限看的表

connect test2/test2
select table_name from all_tables; //查看有权限看的表
在这里插入图片描述

查询一张表里都有什么字段

假如你想查询dba_users这张表里都有什么字段,但表名记不清了只记得表名里包含user,该怎么办?
可以根据数据字典的视图先查出表名,再根据表名查询表中字段,具体可以这样做:

desc dict
select table_name from dict where table_name like ‘%_USER%’;
在这里插入图片描述

成功锁定表名为dba_users,接下来查询该表字段

set linesize80
desc dba_users
在这里插入图片描述

执行计划

在将执行计划之前我们先来复习依稀Shared pool的概念,以便于更好的理解后面的实验

SHARED POOL

在这里插入图片描述
SHARED POOL = data dictionary cache +library cache
可以认为SHARED POOL就是library cache,因为data dictionary cache很稳定,且很少用到

data dictionary cache

举例来说 一个用户查表怎么查?

  1. 先去dba_objects 去查有没有这张表
  2. 再去all_objects去查有没有权限
  3. 当前用户(test2)想查看自己有哪个表的权限
    test2@DB01>select table_name from all_tables where table_name line ‘%TEST%’

存储这样字典表的地方叫data dictionary cache
data dictionary cache基本不需要优化

library cache

执行计划计算结果以两种方式进行,一是连接的方式,二是扫描的方式

连接方式

  • RBO基于规则的优化器
  • CBO基于成本的优化器
    如:select ~ rom t1,t2,t3 where t1.id = t2.id and t1.name = t3.name;
    把所有case先列出来,看哪个更好算,选择代价最低的=》执行计划
    Execution plan tree 在选择的方案里选择最好的

扫描方式

  • Index 扫描
  • Table scan 扫描
    算要选择索引扫描还是全表扫描

这样通过两种方式算出来的结果就放在library cache里

执行计划存储原理

这里讲的是一条sql经历了什么,可以通过查询历史记录的方式来查看

sys用户赋予scott用户以查看视图的权限

//sys用户下 
grant select any dictionary to scott;

scott用户查看相关视图

//Scott用户下
set linesize 80
Desc V$sql 

test2用户下执行SQL语句

connect test2/test2
test2@ORCL>select * from test1.TEst1_t1;

scott用户下查询历史
查询历史时,sql_text 条件要约转成大写
因为在上一步骤执行的sql(select * from test1.TEst1_t1;)中含有大写

错误示范

test2@ORCL>connect scott/tiger
scott@DB01>select sql_id, sql_text from v$sql where sql_text like '%TEST1%';

在这里插入图片描述
正确示范

scott@ORCL>select sql_id, sql_text from v$sql where upper(sql_text) like '%TEST1%';

在这里插入图片描述
5ax86s012g02k
select * from test1.TEst1_t1
这样一行记录对应的就是 text id ,text name

把这条sql生成Hash value( text id) 和exection plan( text id)
将这些存到library cache

查看执行计划

explain plan for (select * from dept);
select * from table(dbms_xplan.display);

在这里插入图片描述

Hash值和value处理原理具体解释

假设在scoot用户下执行三条SQL语句后查看text_id,text_value

select * from dept;
select * from DEPT;
Select * from dept;
select sql_id, sql_text from v$sql where upper(sql_text) like 'SELECT * FROM DEPT';

结果如下
在这里插入图片描述
解析
三个sql
select * from dept; (t)
select * from DEPT; (T)
Select * from dept; (Select)
DEV1这个人执行了T,生成了id,和执行计划(value)
DEV2执行了t,也生成了id,和执行计划(value)
如果再来一个DEV4,他也执行了和DEV1一样的sql语句,那么它就根据这个sql去找一样的,找到了DEV1的sql的id,再根据这个id直接去找执行计划,而不用再生成同样的执行计划了

在这里插入图片描述

如果执行 select * from t; 两遍会怎么样?

第一遍
从内存到磁盘,没找着,因为以前没执行过,miss了
Id ,value 存到library cache里
t表的data dictionary(t表信息) 存到data dict cache里
t表的执行结果存到buffer cache里
第二遍
根据sql语句到library cache里找到了一样的sql,那用它的id,用它的value(这里的意思是不会再额外生成执行计划了gen)
执行的结果可以在buffer cache里找到,命中了

写入顺序是怎么样的?
在这里插入图片描述

实验

缓冲优化让第2次执行更快

alter system flush shared_pool的作用

The FLUSH SHARED POOL clause lets you clear all data from the shared pool in the system global area (SGA). The shared pool stores Cached data dictionary information and Shared SQL and PL/SQL areas for SQL statements, stored procedures, function, packages, and triggers.
This statement does not clear shared SQL and PL/SQL areas for items that are currently being executed. You can use this clause regardless of whether your instance has the database dismounted or mounted, open or closed.

测试一
----------------------------------------------------------------------------------------
drop table t purge;
create table t as select  * from dba_objects;

set linesize 1000 
set autotrace on  #设置自动追踪 ,同时输出执行结果以及统计信息和执行计划信息。
set timing on  #显示执行SQL操作的时间

--第1次执行

select count(*) from t;

--第2次执行
--该命令只是为了先不考虑解析的优化,单纯考虑第2次执行物理读减少带来的优化效应
alter system flush shared_pool;
select count(*) from t;



附:贴出部分执行结果
-----------------------------------------------------------------------------------------------------------------------------
SQL> --第1次执行
SQL> select count(*) from t;

  COUNT(*)
----------
     72884

已用时间:  00: 00: 00.12

执行计划
------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   291   (1)| 00:00:04 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 60918 |   291   (1)| 00:00:04 |
-------------------------------------------------------------------
统计信息
----------------------------------------------------------
         28  recursive calls
          0  db block gets
       1103  consistent gets
       1038  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
          

SQL> --第2次执行
SQL> --该命令只是为了先不考虑解析的优化,单纯考虑第2次执行物理读减少带来的优化效应
SQL> alter system flush shared_pool;
系统已更改。
已用时间:  00: 00: 00.11
SQL> select count(*) from t;
  COUNT(*)
----------
     72884
已用时间:  00: 00: 00.04
执行计划
------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   291   (1)| 00:00:04 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 60918 |   291   (1)| 00:00:04 |
-------------------------------------------------------------------
统计信息
----------------------------------------------------------
        282  recursive calls
          0  db block gets
       1131  consistent gets
          0  physical reads
          0  redo size
        425  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          1  rows processed

SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]OPTION 说明

  • SET AUTOTRACE OFF 此为默认值,即关闭Autotrace
  • SET AUTOTRACE ON 同时输出执行结果以及统计信息和执行计划信息。
  • SET AUTOTRACE ON EXPLAIN 只打开执行计划报表,显示命令结果,不显示统计信息。
  • SET AUTOTRACE ON STATISTICS 只打开统计信息报表,显示命令结果,不显示执行计划。
  • SET AUTOTRACE TRACEONLY 不显示命令的执行结果,显示执行计划和统计信息,但在traceonly的后面仍然可以追加explain或者statistics,等同于set autotrace on [explain|statistics]但是不显示执行结果。
测试二
----------------------------------------------------------------------------------------
1.查看shared_pool中碎片
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
     7260
2.使用一个以前未曾使用过的查询,来让share pool分配内存,增加share pool中的chunk碎片
SQL> select count(*) from user_tables;
COUNT(*)
----------
      667
3.再次查询shared_pool中的碎片
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
     7515
每个buckets的碎片数量>2000就认为是不太好的一个情况,可能会引起share pool latch争用!
4.使用alter system flush shared_pool命令,并再次查询shared_pool中的碎片
SQL> alter system flush shared_pool;
系统已更改。
SQL> select count(*) from x$ksmsp;
COUNT(*)
----------
     7194
-----------------------------------------------------------------------------------------------------------------------
总结:执行这个语句的结果是将缓存在library cache和data dictionary cache 中的sql,pl/sql和数据字典定义都从共享池中清除了
在负载很重的生产库里执行flush shared_pool无异于自杀...慎用!

注释######################################################################

X$KSMSP的名称含义为:
[K]ernal [S]torage [M]emory Management [S]GA Hea[P]

其中每一行都代表着shared pool中的一个chunk

我们看一下x$ksmsp的结构:
在这里插入图片描述
我们关注以下几个字段:

KSMCHCOM是注释字段,每个内存块被分配以后,注释会添加在该字段中.
x$ksmsp.ksmchsiz代表块大小

x$ksmsp.ksmchcls列代表类型,主要有四类,说明如下:

free
Free chunks–不包含任何对象的chunk,可以不受限制的被分配.

recr
Recreatable chunks–包含可以被临时移出内存的对象,在需要的时候,这个对象可以
被重新创建.例如,许多存储共享sql代码的内存都是可以重建的.

freeabl
Freeable chunks–包含session周期或调用的对象,随后可以被释放.这部分内存有时候
可以全部或部分提前释放.但是注意,由于某些对象是中间过程产生的,这些对象不能
临时被移出内存(因为不可重建).

perm
Permanent memory chunks–包含永久对象.通常不能独立释放.

我们可以通过查询x$ksmsp视图来考察shared pool中存在的内存片的数量
不过注意:Oracle的某些版本(如:10.1.0.2)在某些平台上(如:HP-UX PA-RISC 64-bit)查
询该视图可能导致过度的CPU耗用,这是由于bug引起的.

参考
https://blog.csdn.net/rambo_china/article/details/5414949

keep让sql跑更快

把表放到keep poor里,让sql跑的更快
keep cache =5% * buffer cache ,用于设置size



===========================================================================================================
--前提:必须保证db_keep_cache_size值不为0,所以首先有如下操作:
--此处只是做试验,所以暂缺设置100M这么大。
alter system set db_keep_cache_size=100M;
drop table t;
create table t as select * from dba_objects;
create index idx_object_id on t(object_id);

--未执行KEEP命令,通过如下查询出BUFFER_POOL列值为DEFAULT,表示未KEEP。

select BUFFER_POOL from user_tables where  TABLE_NAME='T';
select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';
 


alter index idx_object_id storage(buffer_pool keep); 
--以下将索引全部读进内存
select /*+index(t,idx_object_id)*/ count(*) from t where object_id is not null; 
--以下将数据全部读进内存
alter table t storage(buffer_pool keep); 
select /*+full(t)*/ count(*) from  t;

--执行KEEP操作后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了

select BUFFER_POOL from user_tables where  TABLE_NAME='T';
select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';
 

附:贴出部分执行结果
------------------------------------------------------------------------------------------------------

--未执行KEEP命令,通过如下查询出BUFFER_POOL列值为DEFAULT,表示未KEEP。
select BUFFER_POOL from user_tables where  TABLE_NAME='T';
BUFFER_POOL
-------------------
   DEFAULT

select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';
 
BUFFER_POOL
-------------------
  DEFAULT
  


--执行KEEP操作后,通过如下查询出BUFFER_POOL列值为KEEP,表示已经KEEP成功了
select BUFFER_POOL from user_tables where  TABLE_NAME='T';
 
BUFFER_POOL
-------------------
   KEEP

select BUFFER_POOL from user_indexes where INDEX_NAME='IDX_OBJECT_ID';
 
BUFFER_POOL
-------------------
   KEEP

想了解更多关于「将表keep到内存」的内容请参考:
https://www.cnblogs.com/Richardzhu/p/3437925.html
https://blog.csdn.net/mandy_rxr/article/details/84746872

Evenote
https://app.yinxiang.com/shard/s26/nl/24714331/5bae6010-2bba-4feb-82bb-cfee88eeabb6?title=test

标签:ssh,sql,Oracle,OCP,db01,root,id,select,第四次
来源: https://blog.csdn.net/weixin_42161670/article/details/90613083

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有