database - HANA 中的 ADBC 临时表

标签 database performance hana

我在 ABAP 中使用 ADBC 创建了一个临时表,并用所需的数据填充它们,而不是使用内部表,因为我们正在为报告处理的大数据会导致性能问题。处理后,我总是删除我创建的临时表。我的问题是,如果我们经常使用这种方法,服务器会不会有问题?

比如当 100 名员工使用同时处理 350,000 多条记录的程序时,这对服务器是否不利? 请赐教。

提前致谢!

编辑:
记录将显示在ALV

代码如下: tmp_table 是临时表名的变量 autoid 是序列名的变量

   sql->execute_ddl( |CREATE SEQUENCE { autoid } | &&
                      |START WITH    00001    | &&
                      |INCREMENT BY   1       | ).

    crte_txt = | CREATE TABLE { tmp_table } |  &&
               |( bid bigint NOT NULL ,   | && 
               |  contract char(50) ,     | && 
               |  swenr char(50),         | && 
               |  smenr CHAR(8),          | &&
               |  saltnr char(20),        | &&
               |  bp char(10),            | && 
               |  spsbp char(10),         | && 
               |  organization char(255), | && 
               |  n_first char(100),      | &&
               |  n_last char(100),       | && 
               |  n_mid char(100),        | && 
               |  addrnumber char(10),    | && 
               |  address char(1250),     | && 
               |  addr_type char(30),     | && 
               |  adr_kind char(10),      | && 
               |  email char(100),        | && 
               |  email2 char(100),       | && 
               |  wsl number(23,2),       | && 
               |  belnr char(10),         | && 
               |  belnr2 varchar(10),     | && 
               |  xblnr char(16),         | &&
               |  gjahr char(4),          | &&
               |  buzei char(3),          | &&
               |  pdescript char(120) null, | &&
               |  vbewa char(4),          | &&
               |  qbshb number(23,2),     | &&
               |  wrbtr1 number(23,2),    | &&
               |  wrbtr2 number(23,2),    | &&
               |  bktxt char(25),         | &&
               |  sgtxt char(50),         | &&
               |  checkno char(20),       | &&
               |  checkamnt number(23,2), | &&
               |  checkdate date,         | &&
               |  receiptdate date,       | &&
               |  role char(6),           | &&
               |  abp char(10),           | && 
               |  intreno char(30),       | &&
               |  agn_first char(100),    | && 
               |  agn_last char(100),     | && 
               |  agn_mid char(100),      | && 
               |  agn_org char(255),      | && 
               |  jv char(10),            | &&
               |  validfrom date,         | &&
               |  validto date,           | &&
               |  objnr char(22),         | &&
               |  condtype char(4),       | &&
               |  unitprice number(23,6), | &&
               |  termnopy char(4),       | &&
               |  ccnetamount number(15,2), | &&
               |  cctaxamount number(15,2), | &&
               |  condguid raw(16),      | &&
               |  PRIMARY KEY (bid) )     | .

 text = | INSERT INTO { dbbuyr } ( bid, contract, bp, addrnumber, adr_kind, swenr, smenr) | &&
             | SELECT ({ autoid }.nextval) as key, a.recnnr AS contract, b.partner AS bp, c.addrnumber, | &&
             | c.adr_kind, e.swenr, e.smenr | &&
             | FROM vicncn AS a | &&
             | INNER JOIN vibpobjrel AS b ON a.intreno = b.intreno | &&
             | INNER JOIN but021_fs AS c ON b.partner = c.partner  | &&
             | INNER JOIN jest AS d ON a.objnr = d.objnr| &&
             | INNER JOIN v_recncne as e on a.recnnr = e.recnnr |  &&
             | WHERE a.recndactiv <> 00000000 | &&
             | AND ( a.recntype = 'ZC01' OR a.recntype = 'ZC02' ) | &&
             | AND b.validfrom <= | && sy-datum && | AND b.validto >=  | && sy-datum &&
             | AND b.role IN ({ cond_role }) | && "( b.role = 'ZBP101' OR b.role = 'ZBP301' ) | &&
             | AND c.valid_to >= | && tmstmp && | AND c.valid_from <= | && tmstmp &&
             | AND d.stat IN ({ cond_stat }) | &&"= 'I0119' | &&
*             | AND e.swenr = '{ swenr }' | &&
             | { sw_cond } { re_cond } { sm_cond } | &&
             | AND e.validto >= { sy-datum } AND e.validfrom <= { sy-datum }| &&
             | AND a.mandt = b.mandt AND b.mandt = c.client AND c.client = d.mandt | &&
             | AND d.mandt = e.mandt AND e.mandt =  { sy-mandt } | .


      sql->execute_update( CONV #( text ) ).

之后有很多更新语句来获取其他数据

sql->execute_ddl( |DROP SEQUENCE { autoid } | ). 
  sql->execute_ddl( |DROP TABLE { tmp_table } | ).

最佳答案

您的代码不会创建一个临时表作为数据库对象。 相反,它会创建一个常规表和一个序列。

虽然这样的代码可以工作,但几乎没有必要,而且有几个缺点。

  1. 表名必须是唯一的,以避免与并行运行的代码实例发生冲突。

  2. 由于这是一个常规数据库表(而不是临时表,因此该表将包含在数据库目录和事务处理中。这意味着,它将创建重做日志,这是完全没有必要的,因为永远不必恢复此表。

  3. 当您的系统在 HANA 上运行时,您可以使用数据库托管过程来执行海量数据处理。实际上,您可以在过程中使用包含表变量 的 HANA SQLScript。 使用表变量HANA不需要创建内存表 结构不需要处理变化的表名,不 使用同一张表等跟踪多个 session 。 此处使用表变量是更好的方法。

  4. 创建序列对象完全是无稽之谈,只是简单地枚举中间结果集中的记录。 为此,您只需使用 ROW_NUMBER() 窗口函数即可。

  5. 由于您当前的代码在处理后也会销毁创建的对象,因此所有已解析的 SQL 语句都将失效。下次执行代码时,将需要对语句进行新的解析/编译。

  6. 对于 CREATE TABLE 语句,代码没有指定这应该是 COLUMN 表还是 ROW 表。由于这在 HANA 中有相当大的影响(您几乎总是想要一个 COLUMN 表),因此强烈建议指定它。对于 HANA 1 和 HANA 2,没有表类型规范的 CREATE TABLE 将创建一个 ROW 表。不要听之任之。

您提到,实际处理代码将针对中间表运行UPDATEs。在绝大多数情况下,UPDATE 可以替换为 SELECT 并分配给新的表变量。 这通常会产生更简洁、更快的代码,并避免“逐行/缓慢”处理。

所以,是的,当前代码会对最终用户性能和服务器资源利用率产生负面影响。

关于database - HANA 中的 ADBC 临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59086361/

相关文章:

database - Oracle 10.2.0.1.0 - 无效句柄

C++线程性能

java - 使用Java将数据从一个数据库导入到另一个数据库的最快方法

mysql - 子查询和连接之间的性能?

abap - 从 CDS 实体中选择还是从 CDS 数据库 View 中选择

sql - 导入文件到表错误: Failure 2673

android - 在mysql数据库中插入数据后应用程序崩溃

database - 仅将 .NET 应用程序编译为 32 位,以便我可以使用我的 Access 数据库

abap - 如果找不到行,则使用第二个条件

java - jpa 生成值在哪里持久化/如何增加它