C# Oracle index索引及partition分区表

1 篇文章 0 订阅

Oracle的命名规则:
1、要以字母开头
2、包含字母和数字,以及# $
3、不能超过30个字符

注意 Oracle的index名、表名、字段名、constraint名、表定义名的长度有限制:30

常见数据库类型表名长度列名长度
mysql6464
oracle3030
db2128128
access6464
SQL SERVER128,临时表116128

创建索引

CREATE [UNIQUE] INDEX index_name ON table_name(column_name[,column_name…])

说明:

  1. UNIQUE:指定索引列上的值必须是唯一的。称为唯一索引,一般是主键加。不加就是正常索引。

  2. index_name:指定索引名。(我这边的命名规范就是:表名_字段名)

  3. table_name:指定要为哪个表创建索引。

  4. 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。

分区表的概念

当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表的优点:

  1. 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

  2. 增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;

  3. 维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;

  4. 均衡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
分区名称P20151110P20151111P20151112
数据量10503249118356719248433
耗时1:29:370:14:380:02:17

使用方法2和方法3删除分区时,都会堵塞当前分区的写操作,对其他分区无影响
来自:https://blog.csdn.net/hemiao1987/article/details/50225855

详解Oracle partition分区表
https://blog.csdn.net/zc309087694/article/details/52159893

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值