oracle training 测试数据

本文探讨了SQL性能优化中的关键因素,包括ID为varchar类型时的索引失效问题,复合索引的有效性,以及ID not null约束下的性能影响。通过实例分析,展示了如何通过创建to_number函数索引、使用hint语句以及注意数据库设计时的细节来提高查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sqlplus sys/zhou215 as sysdba
Startup
Connect oracle/oracle


由于虚拟机是linux的 plsql没有linux的版本,需要通过本机连上虚拟机
配置
查看ip /sbin/ifconfig -a 192.168.81.128
将虚拟机的ip填到net manager中的listner 通过netmgr命令
再通过lsnrctl start listener 启动listener
用 select name from v$database; 得到sid
这样就能通过 oracle sql developer来连接


Testtab1 200w 带索引
Testtab2 200w 带索引
Testtab3 400w 带索引 id not null id很多都是1000
Testtab4 200w 带索引 id not null

Testtab5 10 不带索引


[b]----------高水位问题----------[/b]


select id from TESTTAB5; 8秒

analyze table TESTTAB5 COMPUTE statistics;

SELECT table_name, blocks, empty_blocks, num_rows FROM user_tables WHERE table_name = 'TESTTAB5';


    TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
1 TESTTAB5 74357 395 10

alter table TESTTAB5 move;


    TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
1 TESTTAB5 4 4 10

select id from TESTTAB5; 0秒


[b]----------ID为varchar时 索引失效----------[/b]


select id from TESTTAB1 where id =1; 11秒

select id from TESTTAB1 where id ='1'; 0秒

id是varchar的

在sqlplus中可以用set autotrace on 看到
TABLE ACCESS FULL

在plsql developer中可以用
explain plan for
select id from TESTTAB1 where id ='1';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
来查看到 INDEX RANGE SCAN


db中id是varchar类型,加了索引
Select * from table1 where id = 1;
这时候不会用到索引,会全表扫描。
补救方法 可以创建一个to_number的函数索引
设计db时要注意。


[b]----------复合索引问题----------[/b]


Id id2 id3 为复合索引

select * from testtab2 where id=31; 0秒
select * from testtab2 where id2=31; 8秒
select * from testtab2 where id2=31 and id3=31; 9秒

只有在id有值的情况下,复合索引才有效

可以用hint语句 强制用索引

[b]----------索引not null----------[/b]

当索引没有设置成not null时,
Order by id 是全表扫描的

explain plan for
select * from testtab4 order by id ;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

explain plan for
select * from testtab1 order by id ;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

--38秒


[b]-----createStatement vs prepareStatement--------[/b]

package com.tristan;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
* 由于shared pool存放了执行计划(全表扫描)所以导致以后prepareStatement用不到索引了
* oracle重启后清空shared pool 就很快了
* 或是清理执行计划
* Alter system flush shared pool;
*/
public class TestJDBC {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.81.128:1521:ORCL", "oracle",
"oracle");

long begin = System.currentTimeMillis(); // 测试起始时间

test1(con);

long end = System.currentTimeMillis(); // 测试结束时间
System.out.println("操作所需时间:" + (end - begin) + " 毫秒"); // 打印使用时间

}

//18027 ms
private static void test1(Connection con) throws Exception {
PreparedStatement pStmt = con
.prepareStatement("select * from Testtab3 where id = ?");
pStmt.setInt(1, 32);
ResultSet result = pStmt.executeQuery();

}

//57 ms
private static void test2(Connection con) throws Exception {
Statement st = con.createStatement();
ResultSet result = st.executeQuery("select * from Testtab3 where id = 32");

}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值