使用show_space时的一类错误现象

本文介绍了一个用于Oracle数据库的空间管理过程show_space,该过程能够显示指定段的空间使用情况,包括总块数、未使用块数等,并能根据不同参数展示更多详细信息。

SQL> create or replace procedure show_space
  2  ( p_segname_1 in varchar2,
  3  p_space in varchar2 default 'MANUAL',
  4  p_type_1 in varchar2 default 'TABLE' ,
  5  p_analyzed in varchar2 default 'N',
  6  p_owner_1 in varchar2 default user)
  7  as
p_segname varchar2(100);
  8    9  p_type varchar2(10);
 10  p_owner varchar2(30);
 11 
 12  l_unformatted_blocks number;
 13  l_unformatted_bytes number;
l_fs1_blocks number;
 14   15  l_fs1_bytes number;
 16  l_fs2_blocks number;
 17  l_fs2_bytes number;
l_fs3_blocks number;
 18   19  l_fs3_bytes number;
 20  l_fs4_blocks number;
 21  l_fs4_bytes number;
 22  l_full_blocks number;
 23  l_full_bytes number;
 24 
l_free_blks number;
 25   26  l_total_blocks number;
 27  l_total_bytes number;
 28  l_unused_blocks number;
 29  l_unused_bytes number;
 30  l_LastUsedExtFileId number;
 31  l_LastUsedExtBlockId number;
 32  l_LAST_USED_BLOCK number;

 33   34  procedure p( p_label in varchar2, p_num in number )
 35  is
begin
 36   37  dbms_output.put_line( rpad(p_label,40,'.') ||
 38  p_num );
 39  end;
 40  begin
 41  p_segname := upper(p_segname_1); -- rainy changed
p_owner := upper(p_owner_1);
 42   43  p_type := p_type_1;
 44 
 45  if (p_type_1 = 'i' or p_type_1 = 'I') then --rainy changed
p_type := 'INDEX';
 46   47  end if;
 48 
 49  if (p_type_1 = 't' or p_type_1 = 'T') then --rainy changed
p_type := 'TABLE';
 50   51  end if;
 52 
if (p_type_1 = 'c' or p_type_1 = 'C') then --rainy changed
 53   54  p_type := 'CLUSTER';
 55  end if;

 56   57 
 58  dbms_space.unused_space
 59  ( segment_owner => p_owner,
segment_name => p_segname,
 60   61  segment_type => p_type,
 62  total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
 63   64  unused_blocks => l_unused_blocks,
 65  unused_bytes => l_unused_bytes,
 66  LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
 67   68  LAST_USED_BLOCK => l_LAST_USED_BLOCK );
 69 
 70  if p_space = 'MANUAL' or (p_space <> 'auto' and p_space <> 'AUTO') then
dbms_space.free_blocks
 71   72  ( segment_owner => p_owner,
 73  segment_name => p_segname,
 74  segment_type => p_type,
 75  freelist_group_id => 0,
 76  free_blks => l_free_blks );
 77 
 78  p( 'Free Blocks', l_free_blks );
 79  end if;
 80 
 81  p( 'Total Blocks', l_total_blocks );
 82  p( 'Total Bytes', l_total_bytes );
 83  p( 'Unused Blocks', l_unused_blocks );
 84  p( 'Unused Bytes', l_unused_bytes );
 85  p( 'Last Used Ext FileId', l_LastUsedExtFileId );
 86  p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
 87  p( 'Last Used Block', l_LAST_USED_BLOCK );
 88 
 89 
 90  /*IF the segment is analyzed */
 91  if p_analyzed = 'Y' then
dbms_space.space_usage(segment_owner => p_owner ,
 92   93  segment_name => p_segname ,
segment_type => p_type ,
 94   95  unformatted_blocks => l_unformatted_blocks ,
unformatted_bytes => l_unformatted_bytes,
 96   97  fs1_blocks => l_fs1_blocks,
fs1_bytes => l_fs1_bytes ,
 98   99  fs2_blocks => l_fs2_blocks,
fs2_bytes => l_fs2_bytes,
100  101  fs3_blocks => l_fs3_blocks ,
fs3_bytes => l_fs3_bytes,
102  103  fs4_blocks => l_fs4_blocks,
fs4_bytes => l_fs4_bytes,
104  105  full_blocks => l_full_blocks,
full_bytes => l_full_bytes);
106  107  dbms_output.put_line(rpad(' ',50,'*'));
dbms_output.put_line('The segment is analyzed');
108  109  p( '0% -- 25% free space blocks', l_fs1_blocks);
110  p( '0% -- 25% free space bytes', l_fs1_bytes);
p( '25% -- 50% free space blocks', l_fs2_blocks);
111  112  p( '25% -- 50% free space bytes', l_fs2_bytes);
p( '50% -- 75% free space blocks', l_fs3_blocks);
113  114  p( '50% -- 75% free space bytes', l_fs3_bytes);
115  p( '75% -- 100% free space blocks', l_fs4_blocks);
p( '75% -- 100% free space bytes', l_fs4_bytes);
116  117  p( 'Unused Blocks', l_unformatted_blocks );
p( 'Unused Bytes', l_unformatted_bytes );
118  119  p( 'Total Blocks', l_full_blocks);
p( 'Total bytes', l_full_bytes);
120  121 
end if;
122  123 
124  end;
125  /

Procedure created.

Elapsed: 00:00:00.16
SQL> exec show_space('bbed','auto');
BEGIN show_space('bbed','auto'); END;

*
ERROR at line 1:
ORA-18008: cannot find OUTLN schema
ORA-06512: at "SYS.STANDARD", line 264
ORA-06512: at line 1


Elapsed: 00:00:00.02
SQL> exec show_space('bbed','auto','T','Y');
BEGIN show_space('bbed','auto','T','Y'); END;

*
ERROR at line 1:
ORA-18008: cannot find OUTLN schema
ORA-06512: at "SYS.STANDARD", line 264
ORA-06512: at line 1


Elapsed: 00:00:00.01
SQL>

上述情况主要是有人删除了outln用户造成的,呵呵,重建outln用户即可。

 

 

 

 

 

 

 


1 Booking_ID 每个预定的唯一标识符 完整代码截图: 由于该数据文件字段名较多,若不设置输出结果参数,则: 所以,需要设置Pandas输出的总宽度,确保列不会因为屏幕宽度限制而被换行或折叠。并且在pd.set_option(&#39;display.max_columns&#39;, None)这个选项设置为None,表示显示所有列,而不进行截断。让字段显示完整一些。由结果可知还有18个字段,数据量保持不变为36275。 (二)缺失值处理 缺失值处理代码代码展示: 主要语句包括:df.isnull():生成一个与数据框df相同大小的布尔矩阵,其中缺失值的位置为True,非缺失值的位置为False。 .sum():对布尔矩阵按列求和,统计每列中缺失值的数量。 df.dropna():删除数据框中包含任何缺失值的行。如果需要删除包含缺失值的列,可以设置参数axis=1。 其实从结果可以看出,从上一步已经得到的处理过的数据集,19个字段并没有缺失值,也并不需要删除含有缺失值的行,数据量没有任何变化。此处代码有冗余,仅仅只是为了展示需要的操作。数据量依旧是36275。 (三)数据可视化 绘制直方图、柱状图、饼图有助于分析各特征间的关系,以及特征值的占比关系。 1.预定是否取消占比饼图【查看预定取消与未取消的占比关系】 import matplotlib.pyplot as plt # 统计预定状态 booking_status_counts = df[&#39;booking_status&#39;].value_counts() # 绘制饼图 plt.figure(figsize=(6, 6)) plt.pie(booking_status_counts, labels=booking_status_counts.index, autopct=&#39;%1.1f%%&#39;, startangle=90) plt.title(&#39;预定是否取消占比&#39;) plt.show() 此处代码需要考虑字体输出,数据可视化可能造成字体的乱码。 所以,需要修改字体设置,并应用于后续所有的图表。完整的代码展示如图所示: plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;]:设置Matplotlib的字体为黑体,确保中文能够正确显示。 df[&#39;booking_status&#39;].value_counts():统计booking_status字段中不同值的数量。 plt.pie(...):绘制饼图,展示booking_status字段中“取消”和“未取消”的比例。 代码结果展示: 这里特别地,由于后面有很多相同类型或者不同类型的图表绘制要求所以,写一个绘图函数,后续直接调用会非常简单: import pandas as pd import matplotlib.pyplot as plt # 设置中文字体以避免乱码 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 使用黑体字 plt.rcParams[&#39;axes.unicode_minus&#39;] = False # 解决负号&#39;-&#39;显示为方块的问题 def plot_data_analysis(df, plot_type, column=None, by_column=None, stacked=False): """ 数据分析绘图函数 参数: - df: 输入的数据框 (pandas DataFrame) - plot_type: 图表类型(如&#39;pie&#39;, &#39;hist&#39;, &#39;box&#39;, &#39;kde&#39;, &#39;bar&#39;) - column: 要绘制的列名 (str) - by_column: 分组依据的列名(适用于箱线图和堆叠柱状图) (str) - stacked: 是否堆叠(适用于堆叠柱状图,默认为False) (bool) """ if plot_type == &#39;pie&#39;: # 饼图:统计指定列的值分布,并绘制饼图 counts = df[column].value_counts() # 统计该列中每个值的数量 labels = [f"{label} ({count})" for label, count in zip(counts.index, counts)] # 标签格式化 plt.figure(figsize=(6, 6)) # 设置图形大小 plt.pie(counts, labels=labels, autopct=&#39;%1.1f%%&#39;, startangle=90) # 绘制饼图,显示百分比 plt.title(f"{column} 的分布占比", fontsize=14) # 修改标题为更具描述性的名称 elif plot_type == &#39;hist&#39;: # 直方图:绘制指定列的频数分布 plt.figure(figsize=(8, 5)) # 设置图形大小 plt.hist(df[column], bins=10, color=&#39;blue&#39;, alpha=0.7) # 绘制直方图,设置颜色和透明度 plt.title(f"{column} 的频数分布情况", fontsize=14) # 修改标题为更具描述性的名称 plt.xlabel(column, fontsize=12) # 设置x轴标签 plt.ylabel(&#39;频数&#39;, fontsize=12) # 设置y轴标签 elif plot_type == &#39;box&#39;: # 箱线图:绘制指定列与分组列的关系 plt.figure(figsize=(8, 5)) # 设置图形大小 df.boxplot(column=column, by=by_column, grid=False) # 绘制箱线图,按by_column分组 plt.title(f"{column} 在不同 {by_column} 下的分布", fontsize=14) # 修改标题为更具描述性的名称 plt.xlabel(by_column, fontsize=12) # 设置x轴标签 plt.ylabel(column, fontsize=12) # 设置y轴标签 elif plot_type == &#39;kde&#39;: # 密度图:绘制指定列的概率密度分布 plt.figure(figsize=(8, 5)) # 设置图形大小 df[column].plot(kind=&#39;kde&#39;, color=&#39;red&#39;) # 绘制密度图,设置颜色 plt.title(f"{column} 的概率密度分布曲线", fontsize=14) # 修改标题为更具描述性的名称 plt.xlabel(column, fontsize=12) # 设置x轴标签 elif plot_type == &#39;bar&#39;: # 堆叠柱状图:绘制指定列与分组列的交叉关系 crosstab_data = pd.crosstab(df[column], df[by_column]) # 创建交叉表 crosstab_data.plot(kind=&#39;bar&#39;, stacked=stacked, figsize=(10, 6)) # 绘制堆叠柱状图 plt.title(f"{column} 和 {by_column} 的对比分析", fontsize=14) # 修改标题为更具描述性的名称 plt.xlabel(column, fontsize=12) # 设置x轴标签 plt.ylabel(&#39;频数&#39;, fontsize=12) # 设置y轴标签 else: # 如果传入不支持的图表类型,打印错误信息 print("不支持的图表类型") return # 自动调整布局并显示图形 plt.tight_layout() plt.show() 通过直接调用函数,输出的效果完全相同。 2.成人儿童数量频数图【对比两变量的数据分布】 3.成人儿童预定状态对比图【查看两变量与目标变量之间的关系】 4.房间平均价格密度分布图【查看数据分布】 该图表可以帮助我们了解酒店定价策略是否合理,以及是否存在价格过高的情况。表示每天预定的平均价格。通过密度图可以分析价格分布是否存在多峰现象或异常值。 5.新老顾客占比饼图【查看数据占比分布】 使用变量repeated_guest,表示客户是否为常客,通过饼图分析常客比例,从而评估客户忠诚度。如图所示,常客占比极低。 6.新老顾客是否取消频数图【查看两变量与目标变量之间的关系】 使用变量repeated_guest, booking_status,分析新老顾客与预定状态(是否取消)之间的关系。例如,新顾客是否更倾向于取消预订。如图所示: 7.是否需要停车位占比饼图【查看数据占比分布】 使用变量required_car_parking_space表示客户是否需要停车位。通过饼图可以分析停车位需求比例,从而优化停车场资源配置。如图所示: 需要使用停车场的顾客数量占比较低。 8.是否需要停车位与预定状态对比图【查看两变量与目标变量之间的关系】 使用变量required_car_parking_space, booking_status分析是否需要停车位与预定状态(是否取消)之间的关系。例如,是否需要停车位的客户更倾向于完成预订。 判断停车位和与预定行为的影响。 9.客户在预定之前是否取消过的总数频数图【查看数据分布】 使用变量no_of_previous_cancellations。分析表示客户在当前预定之前取消预定的次数。通过直方图可以分析客户的预订历史。 10.用户属性堆叠柱状图【查看用户属性各特征值的数据分布】 使用变量market_segment_type, booking_status。分析表示客户来自的市场部分(例如旅行社、在线平台等)。通过堆叠柱状图可以分析不同市场部分的预订行为。 通过上图可以识别不同市场部分的客户特征和预订行为。 (四)特征变量选择 特征选择依据: 1.根据随机森林特征重要性排序,选择阈值在0.01以上的特征变量。 2.卡方检验,对分类特征采取卡方检验来选择特征变量,选择P值小于0.05的显著性特征变量。 根据上述特征选择依据,最终保留15个关键特征,如表4所示。 表4 保留特征及意义 序号 特征 意义 1 no_of_adults 成人数量 2 no_of_children 儿童数量 3 no_of_weekend_nights 顾客预定入住酒店的周末晚数 4 no_of_week_nights 顾客预定住宿的周晚数(周一至周五) 5 lead_time 预定日期和抵达日期之间的天数 6 arrival_year 抵达日期的年份 7 arrival_month 抵达日期的月份 8 arrival_date 抵达的日期 9 no_of_previous_cancellations 在当前预定之前,顾客以前取消预定的数量 10 no_of_previous_bookings_not_canceled 在当前预定前未被顾客取消的先前预定的数量 11 avg_price_per_room 每天预定的平均价格 12 no_of_special_requests 顾客提出的特殊要求的总数(例如高楼层,从房间看风景等) 13 required_car_parking_space 顾客是否需要停车位 14 repeated_guest 是否为常客 15 booking_status 预定是否取消的标志 该部分数据处理与上一个步骤完全相同,只需要多删除3个字段,并且也进行缺失值的处理,完整代码展示: df_cleaned.columns 返回当前 DataFrame 的所有列名。 dropna() 方法会删除包含任何缺失值的行。 如果数据集中没有缺失值,则不会执行删除操作。运行结果如下所示: 表5 特征描述性说明 序号 特征 特征类型 数值类型 取值范围 1 no_of_adults 数值型 整数 [0,4] 2 no_of_children 数值型 整数 [0,10] 3 no_of_weekend_nights 数值型 整数 [0,7] 4 no_of_week_nights 数值型 整数 [0,17] 5 lead_time 数值型 整数 [0,443] 6 no_of_previous_cancellations 数值型 整数 [0,13] 7 no_of_previous_bookings_not_canceled 数值型 整数 [0,58] 8 avg_price_per_room 数值型 实数 [0,540] 9 no_of_special_requests 数值型 整数 [0,5] 10 arrival_year 数值型 整数 [2017,2018] 11 arrival_month 数值型 整数 [1,12] 12 arrival_date 数值型 整数 [1,31] 13 required_car_parking_space 类别型 整数 [0,1] 14 repeated_guest 类别型 整数 [0,1] 15 booking_status 类别型 整数 [0,1] 完整代码如下所示: 将特征分为数值型和分类型两类,便于后续分别处理。根据问题描述中的关键特征列表,提取所需列。使用 .copy() 方法确保 df_selected 是一个独立的 DataFrame,而不是父 DataFrame 的切片。StandardScaler 是 Scikit-learn 提供的一个工具,用于将数据标准化为均值为 0、标准差为 1 的分布。 使用fit_transform() 方法会对数据进行标准化处理。 使用 .loc 明确指定要修改的列,避免 SettingWithCopyWarning 警告。(如果不用会反复报错) 运行结果如下所示: head() 方法返回 DataFrame 的前几行,默认为 5 行。通过查看标准化后的数据,可以验证操作是否正确。 (五)数据标准化 ①针对以下得出的所有特征变量,采取标准化处理。 表6 最终进行标准化的特征 序号 特征 意义 1 no_of_adults 成人数量 2 no_of_children 儿童数量 3 no_of_weekend_nights 顾客预定入住酒店的周末晚数 4 no_of_week_nights 顾客预定住宿的周晚数(周一至周五) 5 lead_time 预定日期和抵达日期之间的天数 6 no_of_previous_cancellations 在当前预定之前,顾客以前取消预定的数量 7 no_of_previous_bookings_not_canceled 在当前预定前未被顾客取消的先前预定的数量 8 avg_price_per_room 每天预定的平均价格 9 no_of_special_requests 在当前预定之前,顾客以前取消预定的数量 10 arrival_year 抵达日期的年份 11 arrival_month 抵达日期的月份 12 arrival_date 抵达的日期 运行结果: 想要获取不省略显示的所有字段,调整一下Pandas 显示选项设置: 包括pd.set_option(&#39;display.max_columns&#39;, None):确保不会因为列数过多而省略某些列。pd.set_option(&#39;display.width&#39;, 1000):设置显示宽度为 1000,避免因屏幕宽度不足导致列换行。 以及df_encoded.describe(include=&#39;all&#39;):默认情况下,describe() 只会显示数值型特征的统计信息。使用 include=&#39;all&#39; 参数后,describe() 会显示所有字段的统计信息,包括分类型特征和数值型特征。 所以添加一段代码df_encoded = df_selected.copy()使用 .copy() 方法创建 df_selected 的独立副本。这样可以避免对原始数据 df_selected 的直接修改,防止出现 SettingWithCopyWarning 警告。代码如下所示: # 创建一个新的独立 DataFrame df_encoded = df_selected.copy() # 使用 .copy() 方法创建独立副本,避免修改原始数据 # 将分类特征映射为二进制值 df_encoded[&#39;required_car_parking_space&#39;] = df_encoded[&#39;required_car_parking_space&#39;].map({0: 0, 1: 1}) # 将 required_car_parking_space 转换为二进制值 df_encoded[&#39;repeated_guest&#39;] = df_encoded[&#39;repeated_guest&#39;].map({0: 0, 1: 1}) # 将 repeated_guest 转换为二进制值 df_encoded[&#39;booking_status&#39;] = df_encoded[&#39;booking_status&#39;].map({&#39;Not_Canceled&#39;: 1, &#39;Canceled&#39;: 0}) # 将 booking_status 转换为二进制值 # 查看编码后的数据 print(df_encoded.head()) # 打印前5行数据,检查编码结果 # 设置 Pandas 的显示选项以显示所有字段的描述性统计信息 pd.set_option(&#39;display.max_columns&#39;, None) # 确保不省略任何列 pd.set_option(&#39;display.width&#39;, 1000) # 设置显示宽度,避免换行 # 查看最终数据集的描述性统计(显示所有字段) print(df_encoded.describe(include=&#39;all&#39;)) # 使用 include=&#39;all&#39; 参数显示所有字段的统计信息 运行结果如下: 根据上述运行结果,我们可以获取标准化后部分数据如表7所示。 表7 标准化后部分特征 特征名称 特征名称 特征名称 特征名称 特征名称 特征名称 no_of_week_nights no_of_weekend_nights lead_time no_of_special_requests avg_price_per_room arrival_date -0.144803 0.217401 1.614896 -0.788140 -1.095033 -1.555662 0.563972 1.365993 -0.933701 0.483760 0.092806 -1.098013 -0.853578 1.365993 -0.980250 1.755661 -1.237528 1.419055 2.690296 -0.931190 1.463610 -0.788140 -0.097567 0.503757 0.563972 0.217401 -0.433291 0.483760 1.834665 -0.525952 -0.144803 1.365993 0.730452 -0.788140 -0.355483 0.160521 ②将required_car_parking_space、repeated_guest以及booking_status三个分类特征采用0/1编码,设为二分类标签: 使用 map() 方法将分类特征转换为二进制值。例如,booking_status 中的 Not_Canceled 被映射为 1,Canceled 被映射为 0。验证分类特征是否正确转换为二进制值。最后通过describe() 方法会生成数据集的描述性统计信息(如均值、标准差、最小值、最大值等)。代码如下所示: 使用df_encoded.head()打印前 5 行数据,验证分类特征是否正确转换为二进制值。 由以上结果可知实现了三个分类特征进行二分类标签编码(0/1)。最后统计一下,数据处理前后的字段数量和数据总量: # 数据处理前的统计 print("数据处理前:") print(f"字段数量: {len(df.columns)}") # 统计原始字段数量 print(f"数据总量: {df.shape[0]}") # 统计原始数据总量 # 去除无效特征 columns_to_remove = [&#39;Booking_ID&#39;, &#39;arrival_year&#39;, &#39;arrival_month&#39;, &#39;arrival_date&#39;] df_cleaned = df.drop(columns=columns_to_remove) # 删除包含缺失值的行 if df_cleaned.isnull().sum().sum() > 0: df_cleaned = df_cleaned.dropna() print("已删除包含缺失值的行") # 筛选保留的关键特征 key_features = [ &#39;no_of_adults&#39;, &#39;no_of_children&#39;, &#39;no_of_weekend_nights&#39;, &#39;no_of_week_nights&#39;, &#39;lead_time&#39;, &#39;no_of_previous_cancellations&#39;, &#39;no_of_previous_bookings_not_canceled&#39;, &#39;avg_price_per_room&#39;, &#39;no_of_special_requests&#39;, &#39;required_car_parking_space&#39;, &#39;repeated_guest&#39;, &#39;booking_status&#39; ] df_selected = df_cleaned[key_features].copy() # 数据处理后的统计 print("\n数据处理后:") print(f"字段数量: {len(df_selected.columns)}") # 统计处理后的字段数量 print(f"数据总量: {df_selected.shape[0]}") # 统计处理后的数据总量 运行结果如下所示: 可知保留了12个字段且不存在删除缺失值的行。最终被去除的字段是被去除的字段: [&#39;type_of_meal_plan&#39;, &#39;room_type_reserved&#39;, &#39;market_segment_type&#39;, &#39;Booking_ID&#39;, &#39;arrival_year&#39;, &#39;arrival_month&#39;, &#39;arrival_date&#39;根据实验操作写一份详尽的实验总结.
06-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值