Dba_Segments .blocks=Dba_Tables.Blocks+Dba_Tables.Empty_Blocks ?

本文介绍了一种Oracle数据库中表统计信息不准确导致的问题,并提供了具体的解决方案。通过分析表ACCT来验证统计信息的准确性,最终使得Dba_Segments.blocks等于Dba_Tables.Blocks加上Dba_Tables.Empty_Blocks。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
      运行如下脚本,发现许多表不满足条件:Dba_Segments .blocks=Dba_Tables.Blocks+Dba_Tables.Empty_Blocks
     
  SQL> SELECT ds.segment_type,ds.segment_name ,ds.blocks ds_block,dt.blocks dt_block,dt.empty_blocks dt_emp_block FROM Dba_Segments ds,dba_tables dt
  2  WHERE ds.segment_name=dt.table_name
  3  AND ds.blocks<>(dt.blocks+dt.empty_blocks)
  4  AND ds.owner='TEST_USER'
  5  AND dt.owner='TEST_USER'
  6  AND ds.segment_name='ACCT';
 
SEGMENT_TYPE SEGMENT_NAME     DS_BLOCK   DT_BLOCK DT_EMP_BLOCK
------------------ --------------------------- ---------- ---------- ------------
TABLE                ACCT                       32                5              0
 
SQL>

    这种现象,是由于统计信息不准确造成的,现在对表ACCT进行分析,计算统计信息:
   
    SQL> analyze table acct compute statistics;
 
    Table analyzed
 
    SQL>
   
    然后重新运行上面的查询:
   
  SQL> SELECT ds.segment_type,ds.segment_name ,ds.blocks ds_block,dt.blocks dt_block,dt.empty_blocks dt_emp_block FROM Dba_Segments ds,dba_tables dt
  2  WHERE ds.segment_name=dt.table_name
  3  AND ds.blocks<>(dt.blocks+dt.empty_blocks)
  4  AND ds.owner='TEST_USER'
  5  AND dt.owner='TEST_USER'
  6  AND ds.segment_name='ACCT';
 
SEGMENT_TYPE SEGMENT_NAME           DS_BLOCK   DT_BLOCK DT_EMP_BLOCK
------------------ --------------------------------- ---------- ---------- ------------
 
SQL>
 
 
上面的查询,没有返回结果,说明ACCT表满足如下条件:

Dba_Segments .blocks=Dba_Tables.Blocks+Dba_Tables.Empty_Blocks

可以使用如下脚本进行验证:

     SQL> SELECT ds.segment_type,ds.segment_name ,ds.blocks ds_block,dt.blocks dt_block,dt.empty_blocks dt_emp_block FROM Dba_Segments ds,dba_tables dt
  2  WHERE ds.segment_name=dt.table_name
  3  AND ds.blocks=(dt.blocks+dt.empty_blocks)
  4  AND ds.owner='TEST_USER'
  5  AND dt.owner='TEST_USER'
  6  AND ds.segment_name='ACCT';
 
SEGMENT_TYPE SEGMENT_NAME           DS_BLOCK   DT_BLOCK DT_EMP_BLOCK
------------------ --------------------------------- ---------- ---------- ------------
TABLE         ACCT                                    32               5               27
 
SQL>

WITH seg_data AS ( /* 预分类处理段数据 */ SELECT s.owner, s.segment_name, s.partition_name, s.bytes, CASE WHEN s.segment_type IN ('TABLE', 'TABLE PARTITION') THEN 'TABLE' WHEN s.segment_type IN ('INDEX', 'INDEX PARTITION') THEN 'INDEX' WHEN s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION', 'LOBINDEX') THEN 'LOB' ELSE 'OTHER' END AS category FROM dba_segments s ) SELECT t.owner, t.table_name, ROUND(SUM(CASE WHEN sd.category = 'TABLE' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS table_size_gb, ROUND(SUM(CASE WHEN sd.category = 'INDEX' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS index_size_gb, ROUND(SUM(CASE WHEN sd.category = 'LOB' THEN sd.bytes ELSE 0 END) / 1073741824, 2) AS lob_size_gb, ROUND(SUM(sd.bytes) / 1073741824, 2) AS total_size_gb FROM dba_tables t /* 精确连接逻辑 */ LEFT JOIN ( /* 普通表段 */ SELECT owner, segment_name AS table_name, bytes, category FROM seg_data WHERE category = 'TABLE' UNION ALL SELECT p.table_owner AS owner, p.table_name, s.bytes, s.category FROM seg_data s JOIN dba_tab_partitions p ON s.partition_name = p.partition_name AND s.owner = p.table_owner WHERE s.category = 'TABLE' UNION ALL SELECT i.owner, i.table_name, s.bytes, s.category FROM seg_data s JOIN dba_indexes i ON s.segment_name = i.index_name AND s.owner = i.owner WHERE s.category = 'INDEX' UNION ALL SELECT l.owner, l.table_name, s.bytes, s.category FROM seg_data s JOIN dba_lobs l ON (s.segment_name = l.segment_name OR s.segment_name = l.index_name) AND s.owner = l.owner WHERE s.category = 'LOB' ) sd ON t.owner = sd.owner AND t.table_name = sd.table_name GROUP BY t.owner, t.table_name ORDER BY total_size_gb DESC; 能很快的出来结果 ,但数据都是0 ,请优化
08-01
import pandas as pd # 读取数据 df = pd.read_csv('../data/shenzhen/ETData/shenzhen_with_grid.csv') # 按ID分组并排序时间 df.sort_values(by=['id', 'time'], inplace=True) # 初始化新列 df['traj_id'] = 0 df['end_grid_id'] = '' # 处理每个ID的轨迹 for id, group in df.groupby('id'): indices = group.index.tolist() n = len(indices) end_indices = [] # 寻找连续三个速度为0的结束位置 for i in range(2, n): if (group.iloc[i - 2]['speed'] == 0 and group.iloc[i - 1]['speed'] == 0 and group.iloc[i]['speed'] == 0): end_indices.append(i) # 生成分段 segments = [] start = 0 prev_end = -1 for end in end_indices: if end > prev_end: segments.append((start, end)) start = end + 1 prev_end = end if start <= n - 1: segments.append((start, n - 1)) # 分配轨迹编号和末尾grid_id traj_id = 1 for seg in segments: s, e = seg end_grid = group.iloc[e]['grid_id'] # 使用 group 的索引来更新轨迹编号和末尾 grid_id segment_indices = group.iloc[s:e + 1].index.tolist() df.loc[segment_indices, 'traj_id'] = traj_id df.loc[segment_indices, 'end_grid_id'] = end_grid traj_id += 1 # 保存结果 df.to_csv('./data.csv', index=False)C:\Users\Windows\.conda\envs\deeplearning\python.exe D:\study\modle\trajectory_generation.py Traceback (most recent call last): File "D:\study\modle\trajectory_generation.py", line 46, in <module> df.loc[segment_indices, 'end_grid_id'] = end_grid File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\indexing.py", line 818, in __setitem__ iloc._setitem_with_indexer(indexer, value, self.name) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\indexing.py", line 1795, in _setitem_with_indexer self._setitem_with_indexer_split_path(indexer, value, name) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\indexing.py", line 1888, in _setitem_with_indexer_split_path self._setitem_single_column(loc, value, pi) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\indexing.py", line 1992, in _setitem_single_column self.obj._mgr.column_setitem(loc, plane_indexer, value) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\internals\managers.py", line 1392, in column_setitem self.iset(loc, new_mgr._block.values, inplace=True) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\internals\managers.py", line 1259, in iset blk.set_inplace(blk_locs, value_getitem(val_locs)) File "C:\Users\Windows\.conda\envs\deeplearning\lib\site-packages\pandas\core\internals\blocks.py", line 859, in set_inplace self.values[locs] = values KeyboardInterrupt Process finished with exit code -1073741510 (0xC000013A: interrupted by Ctrl+C) 给出解决的代码
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值