Sql 如何在SAP HANA中建立只读一次实施?
背景:我是一个长期的MSSQL开发人员。。。我想知道的是如何从SAP HANA实现只读一次选择 高级伪代码:Sql 如何在SAP HANA中建立只读一次实施?,sql,hana,hana-sql-script,Sql,Hana,Hana Sql Script,背景:我是一个长期的MSSQL开发人员。。。我想知道的是如何从SAP HANA实现只读一次选择 高级伪代码: 通过db proc收集请求(查询) 带请求调用API 存储请求(响应)的结果 我有一个表(a),它是流程的输入源。一旦流程完成,它将把结果写入另一个表(B) 如果我只是在表a中添加一列,以避免并发处理器从表a中选择相同的记录,也许这一切都解决了 我想知道如何在不向源表A添加列的情况下执行此操作 我尝试的是表a和表B之间的左外部联接,以从a中获取B中没有对应行(尚未)的行。这不起作用,或者
/*
* getBatch.sql
*
* SYNOPSIS: Retrieve the next set of criteria to be used in a search
* request. Use left outer join between input source table
* and results table to determine the next set of inputs, and
* provide support so that concurrent processes may call this
* proc and get their inputs exclusively.
*/
alter procedure "ACOX"."getBatch" (
in in_limit int
,in in_run_group_id varchar(36)
,out ot_result table (
id bigint
,runGroupId varchar(36)
,sourceTableRefId integer
,name nvarchar(22)
,location nvarchar(13)
,regionCode nvarchar(3)
,countryCode nvarchar(3)
)
) language sqlscript sql security definer as
begin
-- insert new records:
insert into "ACOX"."search_result_v4" (
"RUN_GROUP_ID"
,"BEGIN_DATE_TS"
,"SOURCE_TABLE"
,"SOURCE_TABLE_REFID"
)
select
in_run_group_id as "RUN_GROUP_ID"
,CURRENT_TIMESTAMP as "BEGIN_DATE_TS"
,'acox.searchCriteria' as "SOURCE_TABLE"
,fp.descriptor_id as "SOURCE_TABLE_REFID"
from
acox.searchCriteria fp
left join "ACOX"."us_state_codes" st
on trim(fp.region) = trim(st.usps)
left outer join "ACOX"."search_result_v4" r
on fp.descriptor_id = r.source_table_refid
where
st.usps is not null
and r.BEGIN_DATE_TS is null
limit :in_limit;
-- select records inserted for return:
ot_result =
select
r.ID id
,r.RUN_GROUP_ID runGroupId
,fp.descriptor_id sourceTableRefId
,fp.merch_name name
,fp.Location location
,st.usps regionCode
,'USA' countryCode
from
acox.searchCriteria fp
left join "ACOX"."us_state_codes" st
on trim(fp.region) = trim(st.usps)
inner join "ACOX"."search_result_v4" r
on fp.descriptor_id = r.source_table_refid
and r.COMPLETE_DATE_TS is null
and r.RUN_GROUP_ID = in_run_group_id
where
st.usps is not null
limit :in_limit;
end;
当运行7个并发处理器时,我得到了35%的重叠。也就是说,在5000个输入行中,得到的行数是6755。运行时间约为7分钟
目前,我的解决方案包括向源表添加列。我想避免这种情况,但它似乎使实现更简单。我将很快更新代码,但它在插入之前包含一条update语句
有用的参考资料:
选择。。。对于更新…
应处理的记录(基于未处理的记录、最多N条记录、奇偶ID、邮政编码等)。这样,当前会话具有更新事务上下文,并对所选记录进行独占锁定。其他事务仍可以读取这些记录,但没有其他事务可以锁定这些记录-既不适用于更新
,删除
,也不适用于选择。。。更新…
processed
-列,并在处理记录时将其设置为TRUE
。或者可以有一个单独的表,其中包含已处理记录的主键(可能还有一个加载作业id,用于跟踪多个加载作业)。
无论以何种方式实现,这是一个时间点,需要捕获该已处理的状态
提交
或回滚
(以防出错)。这将提交
写入目标表的记录、已处理的状态信息,和它将从源表释放独占锁
COMMIT
或ROLLBACK
。这意味着,在提交记录处理时,不会丢失任何“记录标记”
现在,为什么这种方法比使记录“不可读”更可取?
因为系统中的其他进程
可能源记录仍由事务系统读取,但从未更新。此事务系统不必等待数据加载完成
或者,有人想对源数据进行一些分析,还需要读取这些记录
或者,您可能希望并行加载数据:可以轻松跳过锁定的记录,只处理当前“可用于更新”的记录。关于这一点,请参见示例
好吧,我猜你希望有更容易消费的东西;唉,据我所知,这就是我处理此类需求的方法。