databasemetadata,databasemetadatagetPrimarykey

http://www.itjxue.com  2023-01-17 08:58  来源:未知  点击次数: 

java.sql.DatabaseMetaData查索引时的问题

提示使用主关键字索引条目比不使用主关键字索引检索得快。

假设表p e r s o n把它的i d表列作为主关键字,用下列代码设置约束:

alter table person add constraint person_pk primary key (id) using index storage (initial 1m next 1m pctincrease 0) tablespace prd_indexes ;

处理下列S Q L语句时:select last_name ,first_name ,salary from person where id = 289 ;

在查找一个已确定的“ i d”表列值时, O r a c l e将直接找到p e r s o n _ p k。如果其未找到正确的索引条目,O r a c l e知道该行不存在。主关键字索引具有下列两个独特之处:

 1.1因为索引是唯一的, 所以O r a c l e知道只有一个条目具有设定值。如果查找到了所期望的条目,则立即终止查找。

 1.2一旦遇到一个大于设定值的条目,索引的顺序搜索可被终止;

ORDER BY中用索引

ORDER BY 子句只在两种严格的条件下使用索引.

ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

ORDER BY中所有的列必须定义为非空.

WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

例如:

表DEPT包含以下列:

dept_code pk not null

dept_desc not null

dept_type null

非唯一性的索引(dept_type) ,

低效: (索引不被使用)

select dept_code from dept order by dept_type

explain plan: sort order by table access full

高效: (使用索引)

select dept_code from dept where dept_type 0

explain plan:

table access by rowid on emp

index range scan on dept_idx

Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引

语法为:

开始监控:alter index index_name monitoring usage;

检查使用状态:select * from v$object_usage;

停止监控:alter index index_name nomonitoring usage;

当然,如果想监控整个用户下的索引,可以采用如下的脚本:

set heading off

set echo off

set feedback off

set pages 10000

spool start_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;' FROM dba_indexes WHERE owner = USER;

spool off

set heading on

set echo on

set feedback on

------------------------------------------------------------------------------------------------------------------------------

set heading off

set echo off

set feedback off

set pages 10000

spool stop_index_monitor.sql

SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;' FROM dba_indexes WHERE owner = USER;

spool off

set heading on

set echo on

set feedback on

我也不懂

希望这对你一帮助

请教DatabaseMetaData.getTables方法中各参数的含义,严重谢,0

getTables

ResultSet getTables(String catalog,

String schemaPattern,

String tableNamePattern,

String[] types)

throws SQLException检索可在给定类别中使用的表的描述。仅返回与类别、模式、表名称和类型标准匹配的表描述。它们根据 TABLE_TYPE、TABLE_SCHEM 和 TABLE_NAME 进行排序。

每个表描述都有以下列:

TABLE_CAT String = 表类别(可为 null)

TABLE_SCHEM String = 表模式(可为 null)

TABLE_NAME String = 表名称

TABLE_TYPE String = 表类型。典型的类型是 "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM"。

REMARKS String = 表的解释性注释

TYPE_CAT String = 类型的类别(可为 null)

TYPE_SCHEM String = 类型模式(可为 null)

TYPE_NAME String = 类型名称(可为 null)

SELF_REFERENCING_COL_NAME String = 有类型表的指定 "identifier" 列的名称(可为 null)

REF_GENERATION String = 指定在 SELF_REFERENCING_COL_NAME 中创建值的方式。这些值为 "SYSTEM"、"USER" 和 "DERIVED"。(可能为 null)

注: 有些数据库可能不返回用于所有表的信息。

参数:

catalog - 类别名称,因为存储在数据库中,所以它必须匹配类别名称。该参数为 "" 则检索没有类别的描述,为 null 则表示该类别名称不应用于缩小搜索范围

schemaPattern - 模式名称的模式,因为存储在数据库中,所以它必须匹配模式名称。该参数为 "" 则检索那些没有模式的描述,为 null 则表示该模式名称不应用于缩小搜索范围

tableNamePattern - 表名称模式,因为存储在数据库中,所以它必须匹配表名称

types - 要包括的表类型组成的列表,null 表示返回所有类型

返回:

ResultSet - 每一行都是一个表描述

抛出:

SQLException - 如果发生数据库访问错误

~~~~~~~~~~

需要匹配上面的表描述啊

JDBC如何获得数据库的约束信息

以MySQL5为例,看看实现过程:

首先为了描述表和列的关系,必须做个简单建模:

表对象、列对象,之间是一对多关系。

public class TableInfoBean {

private String tableName;

private String tableComment;

private ListColumnBean columnList=new ArrayListColumnBean();

public class ColumnBean {

private String columnName;

private String columnComment;

private String SqlType;

这个关系很简单,就这么搞定了,用来保存一个表信息。

下面就是如何从数据库读取表信息了。

在这里依赖一个类DatabaseMetaData,这个对象可以从数据库连接来获取。有了它万事大吉了,想知道什么问它即可:

DatabaseMetaData databaseMetaData = conn.getMetaData();

//获取所有表

ResultSet tableSet = databaseMetaData.getTables(null, "%", "%", new String[]{"TABLE"});

//获取tableName表列信息

ResultSet columnSet = databaseMetaData.getColumns(null, "%", tableName, "%");

上面代码会得到两个结果集,对照DatabaseMetaData 的文档,我们可以通过结果集的列名来获取想要的信息,例如

String tableName = tableSet.getString("TABLE_NAME");

String tableComment = tableSet.getString("REMARKS");

String columnName = columnSet.getString("COLUMN_NAME");

String columnComment = columnSet.getString("REMARKS");

String sqlType = columnSet.getString("DATA_TYPE");

含义很清楚我就不做解释了。

逐个遍历表,然后得到一个TableInfoBean的集合,这个集合就是数据库中所有表的信息了

(责任编辑:IT教学网)

更多

相关Photoshop教程文章