Oracle的命名规则:
1、要以字母开头
2、包含字母和数字,以及# $
3、不能超过30个字符
注意 Oracle的index名、表名、字段名、constraint名、表定义名的长度有限制:30
常见数据库类型 | 表名长度 | 列名长度 |
---|---|---|
mysql | 64 | 64 |
oracle | 30 | 30 |
db2 | 128 | 128 |
access | 64 | 64 |
SQL SERVER | 128,临时表116 | 128 |
创建索引
CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])
说明:
-
UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引,一般是主键加。不加就是正常索引。
-
index_name:指定索引名。(我这边的命名规范就是:表名_字段名)
-
table_name:指定要为哪个表创建索引。
-
column_name:指定要对哪个字段创建索引。可以对多字段创建索引,引申到组合索引。
复合索引: Create Index i_deptno_job on emp(deptno,job);
—>在emp表的deptno、job列建立索引。select * from emp where deptno=66 and job=‘sals’ ->走索引。
select * from emp where deptno=66 OR job=‘sals’ ->将进行全表扫描。不走索引
select * from emp where deptno=66 ->走索引。
select * from emp where job=‘sals’ ->进行全表扫描、不走索引。
如果在where 子句中有OR 操作符或单独引用Job 列(索引列的后面列) 则将不会走索引,将会进行全表扫描。
来自:http://www.cnblogs.com/tianmingt/articles/4444885.html
详细index的创建:
foreach (FieldClass fItem in fList)
{
strB.Append(string.Format("CREATE INDEX {0}_{1} ON {0}({1}) TABLESPACE {2} PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED ); ", table.TableName, fItem.Name, Common.Config.TableOwner));
strB.Append("\r\n");
}
return strB.ToString();
普通index的创建:
foreach (FieldClass fItem in fList)
{
strB.Append(string.Format("CREATE INDEX {0}_{1} ON {0}({1}) TABLESPACE {2} ;", table.TableName, fItem.Name, Common.Config.TableOwner));
strB.Append("\r\n");
}
return strB.ToString();
唯一性索引的话只要在“CREATE INDEX”之间加UNIQUE。
分区表的概念
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
分区表的优点:
改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。
增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
来自:https://www.cnblogs.com/andy6/p/6238512.html
分区表的种类等详细内容 可进入查看。
/// <summary>
/// 创建表分区
/// 2018.12.24
/// </summary>
/// <param name="rdbHelper">数据库操作类</param>
/// <param name="tableName">表名</param>
/// <param name="main">分区值</param>
/// <param name="tableOwner">表拥有者</param>
/// <returns></returns>
private void PartCreate(IRDBHelper rdbHelper, string tableName, string main, string tableOwner)
{
string sql = "SELECT * FROM DBA_TAB_PARTITIONS WHERE TABLE_NAME='{0}' AND PARTITION_NAME LIKE '{1}' AND TABLE_OWNER = '{2}'";
//长度限制故采用此格式的分区名
string partName = "PART_" + main;
try
{
string likeSql = "%_" + main;
DataTable dt = rdbHelper.ExecuteDatatable(tablename, string.Format(sql, tableName, likeSql, tableOwner), true);
//如果不存在分区,创建
if (dt == null || dt.Rows.Count <1)
{
string createTablePartitiopnSql = @"ALTER TABLE {0} ADD PARTITION {1} VALUES ({2})";
string creatPartSql = string.Format(createTablePartitiopnSql, tableName, partName, main);
rdbHelper.ExecuteNonQueryWithException(creatPartSql, CommandType.Text);
}
}
catch (Exception ex)
{
throw new Exception("创建表分区" + partname + "异常:" + ex.Message + "\r\n" + ex.StackTrace);
}
}
删除索引
DROP INDEX index_name;
删除表分区
全删除
ALTER TABLE tableName DROP PARTITION partionName;
清数据 谨慎!!
ALTER TABLE tableName TRUNCATE PARTITION partionName;
建议加上 UPDATE GLOBAL INDEXES;
不然可能由于索引失效导致无法插入数据
分区删除的三种方式:
1. delete完数据再drop分区 (线上现有方式)
2. truncate分区数据再删除的方式
3. 直接drop分区测试结果如下(数据量较大没有多次导入表,分别使用了3个分区进行测试,数据量大致在同一量级) 方法1 方法2 方法3
方法1 | 方法2 | 方法3 | |
---|---|---|---|
分区名称 | P20151110 | P20151111 | P20151112 |
数据量 | 10503249 | 11835671 | 9248433 |
耗时 | 1:29:37 | 0:14:38 | 0:02:17 |
使用方法2和方法3删除分区时,都会堵塞当前分区的写操作,对其他分区无影响
来自:https://blog.csdn.net/hemiao1987/article/details/50225855
详解Oracle partition分区表
https://blog.csdn.net/zc309087694/article/details/52159893