2021-03-09

ORACLE迁移索引并行未生效处理方式

案例是 本地服务器 oracle12c->19c实施过程中遇到的问题及解决方法如下:

为提高oracle数据导入效率,尽可能减少数据迁移时间,现总结如下: 
使用网络泵进行数据库迁移命令: 
impdp system/******** directory=LOG_DIR parallel=8 network_link=sourcedb schemas=CCFMP  transform=disable_archive_logging:y logtime=all logfile=LOG_DIR:impdp_bdi20201211.log exclude=statistic 
    虽然impdp设置了并行参数parallel=8,但是在迁移索引时是不使用并行的,parallel并行参数不起作用,查看数据泵日志,impdp已迁移索引数据*00G,耗时*小时,每小时迁移索引数据量*G左右,为提升索引创建效率,采用如下方式手工生成索引创建脚本,同时使用并行度参数,每小时迁移索引数据量**0G左右,较数据泵方式迁移效率提升2.6倍。 
在源库上执行: 
su - oracle 
sqlplus / as sysdba 

set pagesize 0 
set long 900000 
set feedback off 
set echo off 
set linesize 255 
spool "/tmp/create_index.sql"; 
select dbms_metadata.get_ddl('INDEX',u.index_name,u.owner) ||'parallel'|| ';' from dba_indexes u  where u.owner in ('CCFMP'); 
spool off; 

注:CCFMP为待迁移的数据库schema用户,需要根据实际迁移情况修改。 
将索引创建脚本ftp上传到目标数据库,执行索引创建脚本: 
su - oracle 
sqlplus / as sysdba 
SQL>@create_index.sql 
这样impdp语句在遇到已创建的索引时会提示索引已创建并跳过,从而提升迁移速度。 
 

为避免开启索引并发度引起性能争用,索引数据迁移完成后,关闭并行度。 
在源库上执行: 
su - oracle 
sqlplus / as sysdba 
SQL>set pagesize 0 
set long 900000   
set feedback off 
set echo off 
set linesize 255 
SQL>alter_index.sql 
SQL>select ’alter index ’ || u.index_name || ' noparallel;'  from dba_indexes u  where u.owner in ('CCFMP'); 
SQL>spool off; 
将索引修改脚本ftp上传到目标数据库,执行索引修改脚本: 
su - oracle 
sqlplus / as sysdba

SQL>@alter_index.sql

<think>好的,用户现在的问题是关于如何在Pandas的DataFrame中为日期列命名,特别是提到“tdays”。让我先回顾一下之前的对话历史,看看有没有相关的信息可以借鉴。 用户之前提到了引用[1],其中有一段代码是关于创建DataFrame并设置列名和索引的。具体来说,用户展示了如何将数据提取到DataFrame中,并且将索引设置为日期数据。例如: import pandas as pd df = pd.DataFrame() df['GDP'] = data.Data[0] df.index = data.Timesdf 这里可以看到,用户使用df.index来设置索引,而索引可能是日期数据。不过用户的问题是关于如何为日期列命名,也就是将日期数据作为列而不是索引的情况。这时候可能需要指导用户如何将日期数据作为普通列,并为其命名。 用户提到的另一个引用是引用[2]和引用[3],其中涉及到处理日期和假期的函数,以及从Excel读取数据并处理日期格式的操作。例如,在引用[3]中,用户处理了日期字符串,替换了其中的字符,可能是为了转换成Pandas可识别的日期格式。这提示用户可能在处理外部数据时遇到日期格式的问题,需要正确解析并命名日期列。 另外,用户提供的引用[4]和引用[5]中,有使用Pandas读取Excel文件,并进行数据合并和计算的例子。例如,在引用[4]中,用户读取多个Excel文件,合并数据,并保存结果。这可能涉及到如何正确命名列,尤其是日期列,以便后续操作。 用户当前的问题是:“我想为给定的日期数据列命名以及可能涉及DataFrame操作 请问如何在pandas DataFrame中为日期列命名 tdays”。结合之前的引用,特别是引用[1]中的例子,用户可能已经有一个DataFrame,其中日期数据可能作为索引或者某个列,现在需要将其命名为“tdays”。 首先,需要确定用户的日期数据目前处于DataFrame中的什么位置。如果是作为索引,那么用户可能需要将其转换为列并命名。如果是作为现有列,可能需要重命名。或者,用户可能在读取数据时需要指定列名,比如从文件读取时没有列名,需要手动添加。 根据引用[1]中的例子,用户使用df.index = data.Timesdf将索引设置为日期数据。如果现在用户希望将日期作为列而不是索引,就需要先将索引重置为普通列,再进行命名。例如,使用df.reset_index(inplace=True)将索引转换为列,然后重命名该列为“tdays”。 另外,引用[3]中的MATLAB代码处理日期字符串,替换字符以便正确解析。这可能意味着用户的数据源中的日期格式需要调整,比如将“-”替换为“/”,或者去除空格。在Pandas中,读取数据时可能需要使用pd.to_datetime()来转换日期列,并确保格式正确。例如,如果日期列是字符串,用户需要先解析为日期类型,然后再命名列。 用户还可能遇到的情况是,从Excel或CSV文件读取数据时,日期列没有正确的列名,需要手动指定。例如,在引用[4]中,用户使用pd.read_excel时可能没有指定列名,导致默认的列名,需要后续重命名。 可能的步骤包括: 1. 读取数据时指定列名,如使用pd.read_csv或pd.read_excel的names参数。 2. 重命名现有列,使用df.rename(columns={'旧列名': 'tdays'}, inplace=True)。 3. 转换索引为列并命名,如果日期数据当前是索引的话。 4. 处理日期格式,确保正确解析。 需要提醒用户注意日期格式的问题,比如在读取数据时使用parse_dates参数,或者使用pd.to_datetime进行转换。同时,如果用户的数据中包含多个日期列,可能需要明确指定哪一列需要命名为“tdays”。 此外,用户提到的“tdays”可能与引用[2]中的自定义假期有关,可能需要将日期列正确命名后,用于后续的假期处理或时间序列分析。因此,正确的命名和格式转换是后续操作的基础。 总结,用户的需求可能包括: - 将现有的日期索引转换为列并命名为“tdays”。 - 重命名现有的日期列为“tdays”。 - 在读取数据时直接指定日期列的名称为“tdays”。 - 确保日期列的格式正确,以便进行后续的DataFrame操作。 需要根据用户的具体数据结构和处理步骤,提供相应的代码示例和解释,确保用户能够正确应用这些方法。同时,需要参考之前的引用中提到的代码,给出符合用户已有代码风格的解决方案,比如使用类似的变量名和结构。</think>在Pandas中为日期列命名并操作DataFrame,可参考以下方法(结合引用[1][4][5]的代码实践): --- ### 一、基础命名方法 ```python import pandas as pd # 创建带日期列的DataFrame(从引用[1]扩展) df = pd.DataFrame({ 'GDP': [23.7, 24.1, 25.3], # 数值数据列 'date_col': pd.date_range('2023-01-01', periods=3) # 待命名的日期列 }) # 重命名为tdays列(核心操作) df = df.rename(columns={'date_col': 'tdays'})[^1] ``` --- ### 二、读取数据时直接命名 结合引用[4]的Excel读取代码: ```python # 读取Excel时指定列名(假设原数据无表头) df = pd.read_excel(r"C:\path\to\file.xlsx", names=['tdays', 'value1', 'value2'], # 第一个位置设为tdays parse_dates=['tdays']) # 自动解析日期[^4] ``` --- ### 三、日期索引转命名列 若日期数据已在索引中(如引用[1]的`df.index = data.Times`): ```python # 将索引转为tdays列 df = df.reset_index().rename(columns={'index': 'tdays'}) ``` --- ### 四、时间序列操作验证 ```python # 验证是否为有效日期类型 df['tdays'] = pd.to_datetime(df['tdays']) # 强制转换日期格式 # 提取年月日(演示后续操作) df['year'] = df['tdays'].dt.year df['month'] = df['tdays'].dt.month_name() ``` --- ### 五、完整流程示例 结合引用[5]的包导入: ```python import pandas as pd from datetime import datetime # 生成测试数据 dates = [datetime(2023,1,1), datetime(2023,1,2), datetime(2023,1,3)] values = [100, 105, 98] # 创建并命名日期列 df = pd.DataFrame({'tdays': dates, 'price': values}) # 设置日期为索引(可选) df.set_index('tdays', inplace=True)[^1] ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值