oracle training 测试数据

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");

	}
}






你可能感兴趣的:(oracle)