TS-SQL与数据库交互:附件:TS-SQL操作原理及其效率的分析.pdf
什么是TS-SQL
SQL是数据库管理系统的操作语言。
TS-SQL是天软对数据库管理系统的操作语言。
TS-SQL语法
select语句:
Select
[SelectOpt(Options)] [distinct] [drange( <begntoendn | M Of N>)] <select_list>
From <sqltable|hugesqltable>
<sql_str> of <Sql_Alias>
Where 条件子语句
End;
Update语句:
Update
<sqltable|hugesqltable>
<sql_str> of <Sql_Alias>
Set FieldExp
Where 条件语句
End;
Delete语句:
Delete
From <sqltable|hugesqltable>
<sql_str> of <Sql_Alias>
Where 条件子语句;
Insert语句:
Insert
<sqltable|hugesqltable>
<sql_str> of <Sql_Alias>
Data;
其中:
sqltable|hugesqltable 可选本地游标集(sqltable),或远端游标集(hugesqltable)
sql_str可以是表名,也可以是数据库的select语句
Sql_Alias是指数据库配置的别名
SQL与TS-SQL效率对比
sqlTable语法中sql_str的给出往往会很大地影响到运行的效率,下面,我们看一个select取数对比的例子:
mtic;
ret1:=select * from sqltable 'TSP_AccountTradeDetails' of TSP_GetAlias() where ['Action']=10 end;
t1:=mtoc;
mtic;
ret2:=select * from sqltable "select * from TSP_AccountTradeDetails where Action=10" of TSP_GetAlias() end;
t2:=mtoc;
return array(('time':t1,'data':ret1),('time':t2,'data':ret2));
//结果返回:
time | data
|
---|
1.44 | <ARRAY[16582]>
|
0.49 | <ARRAY[16582]>
|
从对比可以看出,sql_str如果给的是表格,所花费的时间要比给select语句花费的时间多近两倍。这个是什么原因呢?需要先了解天软的TS-SQL操作的原理。
TS-SQL原理
1、TS-SQL与SQL的处理都是基于游标集的
2、SQL运行在数据库管理系统(DBMS)之上,基于SQL服务器运行,返回的结果是一个游标集
3、TS_SQL对DBMS的处理的游标集是基于SQL的游标集之上,在SQL客户机端运行(天软平台或WEB等TSL解释器)
例如:TS-SQL 在select对内存中的数组来操作时,也是将数组的每一行做成一个游标。
天软与数据库交互,是基于SQL返回的结果集,这个结果集也是一个游标集,然后TS-SQL再进行处理。
4、提高效率需要尽量在SQL层缩小原始处理游标集
游标集的产生与操作流程
说明:
1、Insert只做插入,对原有的游标集没有关系,所以不存在效率在这个上面的问题。
2、select可缩小范围产生游标集,select会比直接给表名效率要高。
3、用户在TS-SQL中通过SQL在数据库服务器端产生游标集,而后在数据库客户机端对返回的游标集进行查询、更新、删除操作。
4、远程游标集与本地游标集的优劣:
远程游标集(hugesqltable):游标集存储在数据库服务器端,在本地处理时,每次发生关系都需要重新进行一次通讯,效率相对较低。
本地游标集(sqltable):游标集存储在数据库客户机端,需要占用本地机器的运行内存,且由于TS-SQL的操作是基于客户机的,数据库的索引等都是无效的,所以当返回的游标集很大时,本地游标集的效率会很低。
一般常用本地游标集(sqltable)。
5、效率问题:通讯次数与游标集大小之间的平衡。
与EXECSQL的效率对比
update的三种实现的效率对比。
测试代码如下:
//TS-SQL做where操作
mtic;
ret:=update sqltable 'FutureArchive'
of 'DBName' set ['IsValid']=0
where ['TSID']=5881 end ;
if ret=0 then return sqlerrormsg()
else return ret;
t1:=mtoc;
//SQL中做where操作
mtic;
ret:=update sqltable 'select * from FutureArchive where tsid=5881'
of 'DBName'
set ['IsValid']=0 end ;
if ret=0 then return sqlerrormsg()
else return ret;
t2:=mtoc;
//execsql执行整个操作
mtic;
sql:="update FutureArchive set IsValid=0 where tsid=5881";
ret:=execsql('DBName',sql,data);
if ret=0 then return sqlerrormsg()
else return ret;
t3:=mtoc;
return array('TS-SQL中where':t1,'SQL中where':t2,'ExecSQL':t3);
返回结果如下图所示:(单位:秒)
|
|
---|
TS-SQL中where | 0.104
|
SQL中where | 0.0081
|
ExecSQL | 0.0054
|
与数据库交互方式的建议
1、做select/update/delete操作时,可尽量用EXECSQL方式交互。
2、SQL操作比TS-SQL操作效率高,在使用TS-SQL操作数据库时,尽量将where子语句放到SQL中完成,达到减少TS-SQL操作的目的