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 不带索引
----------高水位问题----------
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秒
----------ID为varchar时 索引失效----------
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时要注意。
----------复合索引问题----------
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语句 强制用索引
----------索引not null----------
当索引没有设置成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秒
-----createStatement vs prepareStatement--------
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");
}
}