段和区:USER_SEGMENTS 和USER_EXTENTS

段和区:USER_SEGMENTS 和USER_EXTENTS

如第22 章所述,空间以段(segment)为单位分配给对象(如表、群集和索引),它们在物理上对应于在数据库中创建的逻辑对象。可以查询USER_SEGMENTS 视图来查看当前的存储参数和段内有效空间的使用情况。当超出某一存储限制时,USER_SEGMENTS 视图将非常有用,它的列如下面的清单所示。

 
 
  1. SEGMENT_NAME  
  2. PARTITION_NAME  
  3. SEGMENT_TYPE  
  4. SEGMENT_SUBTYPE  
  5. TABLESPACE_NAME  
  6. BYTES  
  7. BLOCKS  
  8. EXTENTS  
  9. INITIAL_EXTENT  
  10. NEXT_EXTENT  
  11. MIN_EXTENTS  
  12. MAX_EXTENTS  
  13. MAX_SIZE  
  14. RETENTION  
  15. MINRETENTION  
  16. PCT_INCREASE  
  17. FREELISTS  
  18. FREELIST_GROUPS  
  19. BUFFER_POOL 

段由称为区(extent)的连续区域组成。构成段的区将在USER_EXTENTS 视图中描述。在USER_EXTENTS 视图中,将看到段内每个区的实际大小,这对跟踪next 和pctincrease 设置(在字典托管的表空间中)的变化所产生的影响很有帮助。除了Segment_Name 列、Segment_Type列和Tablespace_Name 列之外,USER_EXTENTS 视图还有3 个新列,即Extent_ID(识别段内的区),Bytes(区的大小,以字节为单位)、Blocks(区的大小,以Oracle 块为单位)。

USER_SEGMENTS 视图和USER_EXTENTS 视图都有“DBA”版本,该版本有助于列出所有者的对象的空间使用情况。DBA_SEGMENTS 视图和DBA_EXTENTS 视图都有一个附加的Owner 列。 如果想要列出在表空间中拥有段的全部所有者,则可以在DBA_SEGMENTS视图中基于Tablespace_ Name 列进行查询,然后列出表空间中段的全部所有者。这些视图都没有“ALL”版本。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码解释:void CopleyAmplifier::SetNewPVTMotionStartTime(boost::posix_time::ptime time,CouchTrjType pvt_point) { //Record the time stamp and data. m_bool_pvt_started = true; m_start_motion_time_us = PosixTime2Integer<unsigned long long>(time); m_last_pvt_data.p = m_start_pos; //Send the last dummy data calculated by the motion start time. ptime current_time = microsec_clock::universal_time(); ptime couch_time = Integer2PosixTime<unsigned long long>(pvt_point.t, current_time); ptime couch_to_L1_time = Integer2PosixTime<unsigned long long>(pvt_point.timeReachToBuffer, current_time); unsigned char next_point_time = round((pvt_point.t-m_start_motion_time_us)/1000.0)-m_total_motion_time_ms; if(next_point_time<4) { GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion start time:%s. First couch time:%s.First couch to L1 time:%s.", boost::posix_time::to_simple_string(time).c_str(), boost::posix_time::to_simple_string(couch_time).c_str(), boost::posix_time::to_simple_string(couch_to_L1_time).c_str()); GcLogInfo(m_log_id, __FUNCTION__, "next_point_time: %d.",next_point_time); BOOST_THROW_EXCEPTION(AxisException() <<Axis_Error_Msg("Start PVT time failed! No enough time for First PVT data!")); } AmpPVTData dummy_data = {next_point_time,0,0}; //Send the left dummy data. dummy_data.time = next_point_time; Gantry::Array seg_cmd = ComposePVTRawData(dummy_data,m_next_pvt_index,1); GcLogDebugExpect(m_need_trace, m_log_id, __FUNCTION__, "<CopleyStartPVT>The %dth PVT dummy data.", m_next_pvt_index); WriteSDO(Gantry::ODAddress(COPLEY_PVT_DATA, 0), (unsigned long long)seg_cmd.GetValue<unsigned long long>()); GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion start time:%s. First couch time:%s.First couch to L1 time:%s.", boost::posix_time::to_simple_string(time).c_str(), boost::posix_time::to_simple_string(couch_time).c_str(), boost::posix_time::to_simple_string(couch_to_L1_time).c_str()); m_total_motion_time_ms += dummy_data.time; m_lasttrj_segments.push_back(seg_cmd.GetValue<unsigned long long>()); ++m_next_pvt_index; GcLogInfo(m_log_id, __FUNCTION__, "<CopleyStartPVT>Motion Started. Start position %f mm.", pvt_point.p); }
07-14
这段代码是一个函数 `CopleyAmplifier::SetNewPVTMotionStartTime` 的实现。下面是对每一行代码的解释: 1. `m_bool_pvt_started = true;`:将成员变量 `m_bool_pvt_started` 的值设置为 `true`,表示 PVT(位置-速度-时间)运动已经开始。 2. `m_start_motion_time_us = PosixTime2Integer<unsigned long long>(time);`:将传入的时间戳 `time` 转换为一个无符号长长整型,并将其赋值给成员变量 `m_start_motion_time_us`,表示运动的起始时间。 3. `m_last_pvt_data.p = m_start_pos;`:将成员变量 `m_last_pvt_data` 的位置成员 `p` 设置为起始位置 `m_start_pos`。 4. 获取当前时间和计算时间差:通过 `microsec_clock::universal_time()` 获取当前时间,然后使用 `Integer2PosixTime<unsigned long long>` 将 `pvt_point.t` 和 `pvt_point.timeReachToBuffer` 转换为时间戳,并与当前时间进行计算。 5. 计算下一个点的时间:通过 `(pvt_point.t - m_start_motion_time_us) / 1000.0` 计算出下一个点与运动起始时间的时间差,并将结果四舍五入为整数,并减去 `m_total_motion_time_ms` 得到 `next_point_time`。 6. 检查下一个点的时间是否足够:如果 `next_point_time` 小于 4,表示没有足够的时间来发送第一个 PVT 数据,将抛出 `AxisException` 异常。 7. 创建一个 `AmpPVTData` 结构体 `dummy_data`,并初始化其中的字段。 8. 调用 `ComposePVTRawData` 函数将 `dummy_data`、`m_next_pvt_index` 和 1 组合成一个 `Gantry::Array` 类型的数据 `seg_cmd`。 9. 使用 `WriteSDO` 函数将 `seg_cmd.GetValue<unsigned long long>()` 写入到 `COPLEY_PVT_DATA` 的地址中。 10. 更新一些日志信息和计算总运动时间。 11. 将 `seg_cmd.GetValue<unsigned long long>()` 添加到 `m_lasttrj_segments` 容器中,并递增 `m_next_pvt_index`。 12. 更新一些日志信息,表示运动已经开始,并输出起始位置。 总体来说,这段代码的作用是设置 PVT 运动的起始时间,并发送第一个 PVT 数据。具体的逻辑和功能可能需要结合上下文和相关的函数来理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值