远程数据库不允许远程连接进行DDL操作的问题如何解决

hibernate.hbm2ddl.auto设置为update时当映射文件更改字段时为什么数据库中字段不更改 - ITeye问答
hibernate.hbm2ddl.auto设置为update时当映射文件更改字段时为什么数据库中字段不更改
比如说列username从前的长度是50,现在我把长度加到500了,但库里的字段没有改变,为什么啊
注释为@Column(name = "username", length = 500, nullable = false)
当增加字段时数据库中是变化的,但修改与删除时都没有变化
问题补充:我想知道大家在用hibernate.hbm2ddl.auto为update时是否跟我的情况一样,还是说在修改映射时数据库也跟着更改了
问题补充:wuhaowei12345 写道删除掉重新生成
。。。我能操作库,只是想知道原因是什么。。。
问题补充:Sand-Storm 写道这只是相当于映射文件,这肯定是不能改到数据库去啊,
hibernate是靠映射文件才得知数据库里表的信息的,
你用update只是更新数据,如果你用create-drop,那才会帮你自动建表
。。。我知道用create建表,对update的解释为加载hibernate时自动更新数据库结构,而不是你说的更新数据,更改映射文件加一个属性数据库也会同样的增加一个字段这我已经试过了
这只是相当于映射文件,这肯定是不能改到数据库去啊,
hibernate是靠映射文件才得知数据库里表的信息的,
你用update只是更新数据,如果你用create-drop,那才会帮你自动建表
删除掉重新生成
已解决问题
未解决问题扫一扫体验手机阅读
mysql之DDL操作--数据表
<span type="1" blog_id="1837642" userid='
10篇文章,3333人气,0粉丝
高并发架构之路
¥51.00194人订阅
MySQL全通晓
¥51.00166人订阅Oracle Database 12c 中的 DDL 优化
What You See Is What You Get Element Oracle Database 12c 中的 DDL 优化 作者:Mohamed Houri
简介 从 Oracle 11g 开始,实现了一项可以提高数据定义语言操作性能的强大的新优化技术。当您向现有表添加一个非空列、同时希望向这个新增列附加一个常量默认值时,新的 DDL 优化正好发挥作用,立即完成 DDL 操作。当更改的表有数百万条记录需将新添加的列更新为常量默认值时,这如何实现?这种新优化有哪些需要在使用前注意的副作用吗?本文将对此进行介绍。 概念 看看下面这个有约 3 百万行记录的表:
SQL& create table t1
, trunc ((rownum-1)/3) n2
, trunc(dbms_random.value(rownum, rownum*10)) n3
, dbms_random.string('U', 10) c1
connect by level &= 3e6;
SQL& desc t1
-----------------------
VARCHAR2(4000 CHAR)
我将向此表添加一个带默认值的非空列。
SQL& alter table t1 add C_DDL number default 42 not null;
其中两个关键字 default 和 not null 已经用粗体显示,因为它们代表驱动此新特性的关键。 为了解上面的 alter table 命令执行时间的差异,我将在两个不同的 Oracle 数据库版本(10.2.0.4.0 和 11.2.0.3.0)中分别执行此命令:
10.2.0.4.0 & alter table t1 add C_DDL number default 42
Table altered.
Elapsed: 00:00:48.53
11.2.0.3.0& alter table t1 add C_DDL number default 42
Table altered.
Elapsed: 00:00:00.04
注意它们在执行时间上的差异。在 11gR2 数据库中立即添加了 C_DDL 列,而在 10gR2 中用时近 49 秒。这是什么样的新机制,允许这么快速地向现有表添加具有默认值的非空列? 3 百万行记录是如何在 4 毫秒内更新的? 我们来直观地验证是否真的进行了更新(从现在起,未指定 Oracle 版本时默认为 11.0.2.3)。
SQL& select count(1) from t1;
----------
SQL& select count(1) from t1 where c_ddl = 42;
----------
虽然 Oracle 立即修改了 t1 表,但查询显示整个 C_DDL 列上下均已更新且默认值设置为 42。怎么会出现这种情况?执行计划是否对此有任何帮助?
SQL& select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id | Operation
| Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| 1 | SORT AGGREGATE
|*2 | TABLE ACCESS FULL | T1
8788K| 3016
(5) | 00:00:10
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(NVL(&C_DDL&,42)=42)
这里再次提醒注意,上述执行计划的谓词 (predicate) 部分能揭示有助于您了解幕后操作的重要信息。尽管我在查询中未使用 NVL 函数,但它还是出现在谓词部分,这表明 Oracle 在内部仍将 C_DDL 列视为可能包含空值(这意味着它未更新),因此 Oracle 用默认值 42 替换它。 我们以早期版本作为比较基准,找寻二者之间的差异:
10.2.0.4.0 & select count(1) from t1 where c_ddl = 42;
----------
10.2.0.4.0& select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id | Operation
| Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------
0 | SELECT STATEMENT |
1 | SORT AGGREGATE
|* 2 | TABLE ACCESS FULL| T1
| 3000K| 8789K | 4001
(8) | 00:00:09
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(&C_DDL&=42)
谓词部分不含 NVL 函数连同 10gR2 中添加该列的用时 (00:00:48.53) 解释了 11gR1 中引入的工作概念,即通过向现有表添加非空带默认值列来优化。 简单地说,从 Oracle 11gR1 开始,当您添加一个带默认值的非空列时,Oracle 不会用此默认值更新所有现有行。相反,Oracle 将存储这个新列的元数据(非空约束和默认值 42),并允许几乎立即添加该列,无论被更改的表大小如何。当然,其代价是从表块检索添加的列时要添加一个 NVL 函数。 解释完 DDL 优化的这一精妙概念之后,下一节将稍稍探讨下 Oracle 如何管理此特性以确保 DDL 的快速执行,以及保证正确、高效完成数据检索。特别是,我们将看到从表块检索所添加列与通过索引叶块访问该列之间的区别。 更改的表上的工作机制 我们在上面看到了添加具默认值的非空列时的性能提升。但我们还看到之所以有此性能提升,是因为 Oracle 引入了一个 NVL 函数,并将其应用于添加的列,从而通过数据字典中存储的对应元数据模拟等于其默认值的空 C_DDL。这种对 NVL 函数的隐式使用会带来什么副作用吗? 首先我们在上面看到的是这对 CBO 进行的估算没有任何影响,因为这是精确估算生成的行数,如下所示:
SQL& select /*+ gather_plan_statistics */ count(1) from t1 where C_DDL = 42;
----------
SQL& select * from table(dbms_xplan.display_cursor(null,null,&ALLSTATS LAST&));
---------------------------------------------------------------------------
| Id | Operation
| Name | Starts | E-Rows | A-Rows | A-Time
---------------------------------------------------------------------------
| SELECT STATEMENT |
1| 00:00:00.37
| SORT AGGREGATE
1| 00:00:00.37
|* 2 | TABLE ACCESS FULL| T1
3000K| 00:00:00.44
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(NVL(&C_DDL&,42)=42)
但对表块进行完全扫描时还是多花了一点时间(44 毫秒),可能是因为与在早期版本中执行同一操作的时间(5 毫秒)相比,新的筛选器使用了 NVL 函数:
10.2.0.4.0& select /*+ gather_plan_statistics */ count(1) from t1 where C_DDL = 42
----------
10.2.0.4.0& select * from table(dbms_xplan.display_cursor(null,null,&ALLSTATS LAST&));
---------------------------------------------------------------------------
| Id | Operation
| Name | Starts | E-Rows | A-Rows | A-Time
---------------------------------------------------------------------------
| SORT AGGREGATE
1 | 00:00:01.06
|* 2 | TABLE ACCESS FULL| T1
3000K| 00:00:00.05
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(&C_DDL&=42)
索引 C_DDL 列上的工作机制 对于计入谓词部分的列,当对其应用函数时,该函数将阻止使用此列上可能存在的任何索引。在这种特定情况下,应用于 C_DDL 列的 NVL 函数是否会抢占本应由 CBO 使用的索引(如果此列编有索引)?稍后将对此进行介绍。 请考虑以下索引: &
SQL& create index i1_c_ddl on t1(c_ddl);
Index created.
Elapsed: 00:00:02.14
再重新查询: &
SQL& select /*+ gather_plan_statistics */ count(1) from t1 where C_DDL = 42;
----------
SQL& select * from table(dbms_xplan.display_cursor(null,null,&ALLSTATS LAST&));
---------------------------------------------------------------------------------
| Id | Operation
| Starts | E-Rows | A-Rows | A-Time
----------------------------------------------------------------------------------
| SELECT STATEMENT
1 | 00:00:00.47
| SORT AGGREGATE
1 | 00:00:00.47
|* 2 | INDEX FAST FULL SCAN| I1_C_DDL |
3000K| 00:00:00.75
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(&C_DDL&=42)
在此强调一条好消息:从索引叶块检索 C_DDL 列的值时,并不对该列应用隐藏的 NVL 函数,这解释了 CBO 一直使用此索引的原因。 但您可能会争辩说这是正常行为:索引不能包含空列值。因此,我们创建一个含非空列的多列组合索引来保护 C_DDL 列的非空值。如下所示:
SQL& drop index i1_c_
Index dropped.
SQL& alter table t1 modify n1
Table altered.
SQL& create index i2_n1_c_ddl on t1(n1,c_ddl);
Index created.
SQL& select /*+ gather_plan_statistics */ count(1) from t1 where n1= 100 and C_DDL = 42;
----------
---------------------------------------------------------------------------------
| Id | Operation
| Starts | E-Rows | A-Rows | A-Time
---------------------------------------------------------------------------------
| SELECT STATEMENT |
1 | 00:00:00.01
| SORT AGGREGATE
1 | 00:00:00.01
|* 2 | INDEX RANGE SCAN | I2_N1_C_DDL |
1 | 00:00:00.01
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(&N1&=100 AND &C_DDL&=42)
即使在添加的 C_DDL 列因出现在组合索引内而防止出现空值时,也无迹象表明隐藏的 NVL 函数应用于 C_DDL 列。这清楚地表明,与 C_DDL 列无更新的表块相比,在同一列中创建的索引的叶块将立即由 C_DDL 列的默认值填充。 完成本节之前,再介绍一个有趣的问题。我们到目前为止所看到的是,每次 CBO 决定访问一个表块时,它会对 C_DDL 列应用 NVL 函数,以确保检索非空 C_DDL 值(只要此值未更新)。但是我们看到,对表进行全面扫描 (TABLE ACCESS FULL) 时,总是会应用此筛选器。当通过索引访问 t1 表 (TABLE ACCESS BY INDEX ROWID) 时,CBO 会应用此 NVL 函数吗?我们设计一个简单情形,观察这种特殊情况下 CBO 的反应:
SQL& drop index i2_n1_c_
SQL& create index i2_n1_c_ddl on t1(n1);
SQL& select /*+ gather_plan_statistics */ count(1) from t1 where n1= 100 and C_DDL = 42;
-------------------------------------------------------------------------------
| Id | Operation
| Starts | E-Rows | A-Rows
-------------------------------------------------------------------------------
| SELECT STATEMENT
| SORT AGGREGATE
|* 2 | TABLE ACCESS BY INDEX ROWID
|* 3 | INDEX RANGE SCAN
| I2_N1_C_DDL |
-------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(NVL(&C_DDL&,42)=42)
3 - access(&N1&=100)
观察即便通过索引 rowid 访问表 t1 时,NVL 函数如何仍应用于 C_DDL 列。 现在我们可以有信心地说,CBO 每次访问表块时,无论是通过单块还是多块读取,都会将 NVL 函数应用于任何必须从已访问表块筛选的&DDL 优化&列。然而,如果&DDL 优化&列是从索引叶块获取的,CBO 不会对其应用 NVL 函数。 Oracle 12c 和针对 NULL 列的数据优化 随着 12c Oracle 版发布,现在可以问 Oracle 12c 中是否仍然提供 DDL 优化了。一图胜千言,我们在该版本中重复相同的实验:
12c & alter table t1 add C_DDL number default 42
Elapsed: 00:00:00.02
几乎立即完成。如以下查询的谓词部分使用 NVL 函数所显示和证明的,DDL 优化在此再次发挥了作用:
12c& select count(1) from t1 where c_ddl=42;
----------
12c& select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id | Operation
| Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------
| SELECT STATEMENT |
| SORT AGGREGATE
|* 2 | TABLE ACCESS FULL|
T1 | 3538K|
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(NVL(&C_DDL&,42)=42)
- dynamic statistics used: dynamic sampling (level=2)
尽管如此,但与 11gR1 版相比,12c 版中的 DDL 优化仍有所改进。在 12c 数据库中,DDL 优化已经扩展到包括拥有 default 值的 null 列。考虑分别在 11gR2 和 12c 中完成以下 alter table,清晰地体会二者间的区别。
11.2.0.3.0& alter table t1 add C_DDL_2 number default 84;
Table altered.
Elapsed: 00:00:58.25
12c& alter table t1 add C_DDL_2 number default 84;
Elapsed: 00:00:00.02
虽然在 11gR2 中添加可为空 C_DDL_2 列用时 58 秒也不错,但在 12c 中是立即完成的。 这清楚地演示了 Oracle Database 12c 中的 DDL 优化已经扩展到包括具有默认值的空列。实际上,查询 t1 表以获取新增列 (C_DDL_2) 的不同值时,您将意识到整个表行的元数据(默认值 84)均已更新,如以下查询所示:
12c& select c_ddl_2, count(1) from t1 group by c_ddl_2;
----------
SQL& select count(1) from t1 where c_ddl_2=84;
----------
SQL& select * from table(dbms_xplan.display_cursor);
---------------------------------------------------------------------------
| Id | Operation
| Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| 1 | SORT AGGREGATE
|* 2| TABLE ACCESS FULL | T1
3803 (1) |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(DECODE(TO_CHAR(SYS_OP_VECBIT(&SYS_NC00006$&,0)),NULL,NVL(&
C_DDL_2&,84),'0',NVL(&C_DDL_2&,84),'1',&C_DDL_2&)=84)
- dynamic statistics used: dynamic sampling (level=2)
但为了确保对具默认值的空列进行 DDL 优化,事情比前一版本中针对非空列的 DDL 优化更复杂。我们由简单的隐式使用 NVL 函数开始,到涉及无 Oracle 配套文档的 SYS_OP_VECBIT 函数和新内部列 SYS_NC00006$ 的复杂奇特的谓词部分,为的是沿用默认值,因为此值实际上未更新。 与您的直觉可能不同,SYS_NC00006$ 列并非虚拟列。它表示一个由系统生成的隐藏列,如下所示:
12c& SELECT
column_name
,virtual_column
,hidden_column
,user_generated
user_tab_cols
WHERE table_name = 'T1'
column_name = &SYS_NC00006$&;
COLUMN_NAME
VIR HID USE
-------------------- --- --- ---
SYS_NC00006$
尽管此列是隐藏的,但无妨我们选择它。
12c& select
,a.SYS_NC00006$
where c_ddl_2 =84
and rownum &=5;
SYS_NC00006$
------------
在 C_DDL_2 列被赋予不等于默认值 84 的值之前,SYS_NC00006$ 列将保持为空。考虑以下插入语句:
12c& insert into t1 values (0,0,0,'xxxxx',110,130);
1 row created.
12c& insert into t1 values (1,1,1,'xxxxx',140,150);
1 row created.
12c& insert into t1 values (1,1,1,'xxxxx',200,null);
12c& select
,a.SYS_NC00006$
where a.c_ddl_2 in (130,150);
SYS_NC00006$
------------
SQL& select
,a.SYS_NC00006$
where a.c_ddl_2
SYS_NC00006$
------------
注意我们将非默认值插入 C_DDL_2 列(包括显式 NULL 值)时,SYS_NC00006$ 隐藏列值如何不再为 NULL。 将拼图的各块拼在一起,我们就能很容易地明白在以下复制的这种奇特但很简单的谓词部分正是这样做的:
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(DECODE(TO_CHAR(SYS_OP_VECBIT(&SYS_NC00006$&,0)),NULL,NVL(&
C_DDL_2&,84),'0',NVL(&C_DDL_2&,84),'1',&C_DDL_2&)=84)
Oracle 只是通过其系统生成的列并通过 SYS_OP_VECBIT 函数检查是考虑 C_DDL_2 列的默认值,还是最终用户或通过显式插入语句引入的实际值。我们模拟 Oracle 对以上 SYS_NC00006$ 列值(即&01&和 NULL)的行为。
12c& SELECT
,TO_CHAR(sys_op_vecbit(a.sys_nc00006$,0)) cbo_ddl
WHERE a.c_ddl_2 IN (130,150)
,TO_CHAR(sys_op_vecbit(a.sys_nc00006$,0)) cbo_ddl
WHERE a.c_ddl_2 IS NULL
,TO_CHAR(sys_op_vecbit(a.sys_nc00006$,0)) cbo_ddl
WHERE c_ddl_2 =84
AND rownum &=1
order by c_ddl_2 nulls last
----------
C_DDL_2 列有 4 种不同值:默认值 (84) 和 3 个显式插入值 130、150 和 null。对 C_DDL_2 列使用谓词从表块检索行时,Oracle CBO 将对以上 CBO_DDL 值解码(基于 SYS_NC00006$),以检查其值与输入的绑定(或字面)变量是否相同。因此,它可以正确模拟 C_DDL_2 列的所有值,包括拥有默认值 (84) 的和实际未更新反映此默认值的。 总结 Oracle 11gR1 附带一个奇妙的特性,让我们将具有默认值的非空列联机添加到实际大型生产表时根本无需担心应用的连续性。这个被称作 DDL 优化的特性不仅允许立即执行此 alter table 操作,而且无需锁定表。Oracle 12c 更将此特性扩展为包括具默认值的空列。而且锦上添花的是,检索更改的列时对性能并无显著负面影响,虽然在 12c 中出现一个奇特但实际无害的谓词部分,确保从表块获取更改的列时可获得正确的值。 关于作者 Mohamed Houri 从艾克斯-马赛第二大学获航空工程学位,之后还获得流体力学(科学计算)博士学位。他作为独立 Oracle 顾问为不同欧洲客户从事 Oracle 数据库工作已逾 14 年,擅长调优和排除 Oracle 性能疑难问题。Mohamed 还与日本船舶设计师协会合作使用名为 Wavelet Transform 的强大信号分析方法分析海啸和碎浪。
关于甲骨文
Integrated Cloud Applications & Platform Services数据库的基本操作DDL - 简书
数据库的基本操作DDL
首先是创建一个数据库
create database 数据库的名称;创建的时候也可以指定编码
database 数据库的名称
character set gbk(utf8);查看当前数据库服务器中的所有数据库
也可以对已经创建的数据库进行相应的修改
alter database
数据库的名称 character set utf8;------------------------编码的修改删除相应的数据库
drop database 数据库的名称;查看当前使用的数据库
select database();切换数据库use 数据库的名称;从外部文件MySQL导入数据到数据库中MySQL -h localhost -u 用户名 -p xx.sql
执行 输入密码即可导入成功
1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理性、为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一。公正的讲,数据库中表字段等等以什么样的方式命名、取具体什么名字,并不会直接影响到项目...
前段时间公司内部博客上凯哥分享了一篇关于mysql字符集编码的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并参考了凯哥的文章,总结了这篇博文.本文主要是对mysql常见的字符集问题进行整理,如有错误,请...
1.MySQL数据库 2.SQL语句 第一节课 ###1(MySQL数据库)数据库概念.avi
5分 ###2(MySQL数据库)常见的数据库.avi
4分 ###3(MySQL数据库)数据库和管理系统.avi
5分 ###4(My...
1.MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management Sys...
什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理,检索和复制所保存数据。 其他类型的数据存储,可以使用,如获取文件系统上的文件或内存中的大的哈希表,但数据并写入不会那么快,但这些类型的系统易于使用。 所以今天...
连续两天在同一家电影院看电影了,远离了亲朋,淡忘了老友;时间真的是一场场冲锋在前的兵士,杀的我这二十年的王国血流成河。城市里冷漠的人群相比,我更期盼路上那些风戈铁马,醉迷江湖的故事;
1. 大家有没有这样的体验:上学时,学霸轻松地驾驭学习,而学渣为了应付考试而焦头烂额;工作中,多数人为了应付老板的任务而疲于奔命,少数人却应付自如;在于他人交往时,大多数人都在自说自话,少数人却可以成为“认真的聆听着”。 人与人之间的差异为什么这么大? “元认知能力”会给出...
杰西自从小时候看了蒂姆.波顿的电影《剪刀手爱德华》之后就喜欢得不得了,日日模仿爱德华。努力学习礼仪和诗歌,学习艺术和微笑。 他相信,和爱德华一样有着剪刀手的自己,一定不是孤独的,总有一天也会遇到属于自己的金。在某一个圣诞节,杰西也将站在高高的架子上,为金做出了天使一样的冰雕...
天气晴朗 风和日丽 欢声笑语 大海无边 海声不绝 吃喝玩乐 无心融入 夜深人静 静静听海 平复内心 苦思冥想 何去何从
学习新技能
本篇文章主要是记录学习过程中遇到的一些问题,而不是教学 一、What maven是一个项目管理工具,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目。Maven 是一个强大的项目管理和构建自动化工具,它通过抽象项目对象模型和构建生命周期模型来对项目...

我要回帖

更多关于 tempdb数据库不允许备份 的文章

 

随机推荐