FAQ > 金融建模 > 第三方交互 > 数据库

TS-SQL操作及其效率的分析    

简述
1、TS-SQL 与SQL之间的关系
2、TS-SQL与数据库交互需要注意的问题
  • 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));

    //结果返回:
    timedata
    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中where0.104
    SQL中where0.0081
    ExecSQL0.0054

    与数据库交互方式的建议
    1、做select/update/delete操作时,可尽量用EXECSQL方式交互。
    2、SQL操作比TS-SQL操作效率高,在使用TS-SQL操作数据库时,尽量将where子语句放到SQL中完成,达到减少TS-SQL操作的目的