莫相离 发表于 2015-1-16 22:52:31

MYSQL网站制作之嗨 甲骨文【4】

WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。
静态SQL的利用

Oracle实践上比SQLServer好一些,但相对没有传说中那末强。这是这些天一识Oracle庐山真脸孔的感觉。看来很多多少事变多云云,听的要比见到的完善。接着第一句说,Oracle的静态SQL就很棒,我专门进修了一下。纪录以下。

先说说静态SQL是甚么,看这句熟习的:
select*froma_tablewherea_variable=a_declarevalue;
再写句静态的:
select*froma_tablewherea_variable=:a_dynamicvalue;
两句的区分很分明,后者多一个占位符,这个以冒号入手下手的变量能够天真地实行分歧前提的where语句。
这是静态SQL语句的上风,接上去的功效就是它的独门工夫了--实行DDL,DCL语句。

静态SQL的实行
1EXECUTEIMMEDIATE语句

EXECUTEIMMEDIATEdynamic_string

…|record}]

bind_argument[,bind_argumnet]…]

[{RETURNING|RETURN}INTObing_argument[,bind_argument]…];

上面是它的利用

处置DDL操纵(CREATE,ALTER,DROP)

CREATEORREPLACEPROCEDUREdrop_table(table_nameVARCHAR2)

IS

Sql_statemetVARCHAR2(100);

BEGIN

Sql_statement:=’DROPTABLE’||table_name;

EXECUTEIMMEDIATEsql_statement;

END;

/

创建历程drop_table后,挪用以下:

SQL>execdrop_table(‘worker’)



处置DCL操纵(GRANTREVOKE)

SQL>connsystem/manager

CREATEORREPLACEPROCEDUREgrant_sys_priv(privVARCHAR2,usernameVARCHAR2)

IS

Sql_statVARCHAR2(100);

BEGIN

Sql_stat:=’GRANT“||priv||’TO’||username;

EXECUTEIMMEDIATEsql_stat;

END;

/

挪用

SQL>execgrant_sys_priv(‘CREATESESSION’,’SCOTT’)



处置DML操纵(INSERTUPDATEDELETE)

假如DML语句带有占位符,那末在EI语句中则要带USING子句
假如DML语句带有RETURNING子句,那末EI语句中要带有RETURNINGINTO子句

例子,处置单行查询:
DECLARE
sql_statVARCHAR2(100);
emp_recordtbl%ROWTYPE;
BEGIN
sql-stat:=SELECT*FROMtblWHEREtblno=:no;
EXECUTEIMMEDIATEsql_statINTOemp_recordUSING&1;
dbms_output.put_line(emp_record.ename||emp_record.sal);
END;
/

2利用OPEN-FOR,FETCH和CLOSE语句处置多行查询

静态处置SELECT语句步骤:界说游标->翻开游标->轮回提取数据->封闭游标
界说:
TYPEcursortypeISREFCURSOR;
cursor_variablecursortype;
翻开:
OPENcursor_variableFORdynamic_string
...];
提取:
FETCHcursor_variableINTO{var1[,var2]...|recor_var};
封闭:
CLOSEcursor_variable;

显现特定部门雇员姓名和人为
DECLARE
TYPEempcurtypeISREFCURSOR;
emp_csempcurtype;
emp_recordemptable%ROWTYPE;
sql_statVARCHAR2(100);
BEGIN
sql_stat:=select*fromemptablewheredeptno=:dno;
OPENemp_csFORsql_statUSING&dno;
LOOP
FETCHemp_csINTOemp_record;
EXITWHENemp_cs%NOTFOUND;
dbms_output.put_line(emp_record.ename||emp_record.sal);
ENDLOOP;
CLOSEemp_cs;
END;
/

3利用批量静态SQL(9i)
BULK子句能够加速批量数据的处置速率。有三种语句撑持BULK子句的办法。
1利用EXECUTEIMMEDIATE,语法为:
EXECUTEIMMEDIATEdynamic_string
]
bind_argument[,bind_argumnet]…]
[{RETURNING|RETURN}
BULKCOLLECTINTOreturn_variable[,return_variable…]];

用于DML处置多行子句,例子:为某部门一切员工增添%比的人为
DECLARE……
BEGIN
sql_stat:=UPDATEemptblSETsal=sal*(1+:percent/100)||
WHEREdeptno=:dno||
RETURNINGename,salINTO:name,:salary;

EXECUTEIMMEDIATEsql_statUSING&percent,&dno
RETURNINGBULKCOLLECTINTOename_table,sal_table;

FORiIN1.ename_table.COUNTLOOP
dbms_output.put_line(ename_table(i)||sal_table(i));
ENDLOOP;

END;
/

2FETCH语句,语法为
FETCHdynamic_cursor
BULKCOLLECTINTOdefine_variable[,dyfine_variable...];

3FORALL语句。合用于DML,不合用于静态的SELECT语句。FORALL语句要与EI分离利用。语法为

FORALLindexINlowerbound..upperbound

EXECUTEIMMEDIATEdynamic_string

USINGbind_argument|bind_argumnet(index)

[,bind_argument|bind_argumnet(index)]…

[{RETURNING|RETURN}BULKCOLLECT

INTObind_argument[,bind_argument…]];
由于MySQL数据库已经如此普及,对企业来说它无疑是一个更好的选择。

柔情似水 发表于 2015-1-20 05:43:19

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

莫相离 发表于 2015-1-26 23:35:24

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

只想知道 发表于 2015-2-4 21:42:57

你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。

灵魂腐蚀 发表于 2015-2-10 17:35:15

然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情

飘灵儿 发表于 2015-3-1 13:30:28

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

飘飘悠悠 发表于 2015-3-10 17:42:24

分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。

愤怒的大鸟 发表于 2015-3-17 08:32:09

对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。

深爱那片海 发表于 2015-3-24 04:04:00

需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
页: [1]
查看完整版本: MYSQL网站制作之嗨 甲骨文【4】