如何解决在 pl/SQL 循环中创建数百万个表时如何防止“内存不足”异常?
我有一个相当复杂的任务要在 Postgresql 中解决。本质是我需要对 10 个数组执行 pl/pgsql 循环,并在 ~100 万个数组上执行嵌套循环。根据每个数据条目的条件,我必须创建大约 5-8 个表。这将导致一笔交易中的总表数量约为 50-8000 万张表。我需要创建表以对其进行索引以进行其他 private RecyclerView recyclerView;
private PostAdapter postAdapter;
private List<Post>postLists;
private List<String> followinglist;
ProgressBar progressBar;
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_home,container,false);
progressBar=view.findViewById(R.id.progress_circular);
recyclerView=view.findViewById(R.id.recyler_view);
recyclerView.setHasFixedSize(true);
linearlayoutmanager layoutManager=new linearlayoutmanager(getContext());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
postLists=new ArrayList<>();
postAdapter=new PostAdapter(getContext(),postLists);
recyclerView.setAdapter(postAdapter);
checkFollowing();
return view;
}
private void checkFollowing(){
//
followinglist=new ArrayList<>();
DatabaseReference reference= FirebaseDatabase.getInstance().getReference("Follow").
child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("following");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
followinglist.clear();
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
followinglist.add(snapshot.getKey());
}
readPosts();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void readPosts(){
DatabaseReference reference= FirebaseDatabase.getInstance().getReference("posts");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
postLists.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
Post post=snapshot.getValue(Post.class);
{
postLists.add(post);
}
计算,如果没有它,这些计算将无法执行。然而,所有这一切的结果实际上是只有一个 id 表,这就是为什么我在循环中 SELECT
的所有表也在每次迭代结束时 CREATE
ped。
问题是我收到了 DROP
错误。我不知道如何重写我的代码以将其拆分为单独的事务或类似的东西。我有 Postgres 10.14 版,目前无法升级。
有人知道如何解决这个问题吗?
解决方法
我不知道如何重写我的代码以将其拆分为单独的事务
您可以使用存储过程而不是函数。过程可以使用事务,只需在代码中使用 begin 和 commit。因此,在您的循环中,您可以执行以下操作:
BEGIN
CREATE TEMPORARY TABLE (...) ON COMMIT DROP
...do your thing with the temp table...
INSERT the result into a more permanent table
COMMIT
确保使用临时表,这样会更快。
但是,如果您想在临时表上使用索引,那么也许您还想事先对它们进行分析,在这种情况下,您可以使用 ANALYZE 而不是 VACUUM ANALYZE,因为这将提交您的事务,并且如果该表是用ON COMMIT DROP 然后它在被分析之前被删除...
现在,老实说,创建数百万个表是很可疑的,所以如果你问一个问题来解释你想要做什么,也许会有一个更简单的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。