When deleting large clients, long
runtimes are often a problem. Parallelism can help, but the real
bottleneck are large tables. So maybe this guide can help. The SQL
statements are for Oracle databases with SAPSR3 layout, for other
databases or layouts you have to modify them.
runtimes are often a problem. Parallelism can help, but the real
bottleneck are large tables. So maybe this guide can help. The SQL
statements are for Oracle databases with SAPSR3 layout, for other
databases or layouts you have to modify them.
Manual deletion of tables
First
of all, you need to identify large, client specific tables. E. g. in
IS-U systems candidates are DFKKOP or SWWCNTP0. These tables are client
specific, so you can easily find out if the table can be truncated
without harming the other clients:
of all, you need to identify large, client specific tables. E. g. in
IS-U systems candidates are DFKKOP or SWWCNTP0. These tables are client
specific, so you can easily find out if the table can be truncated
without harming the other clients:
- SELECT mandt, count( * ) FROM sapsr3.dfkkop GROUPBY mandt;
result, you see the number of rows for each client. When only the
client you want to delete has rows, you can truncate the tables
beforehand. This will significantly speed up the client deletion.
Copy & deletion of "unbalanced" tables
Whenyou identify tables, where only a few rows are contained in the clients
which will remain in the system and a huge amount of rows in the client
you want to delete, you can first copy all remaining rows in a new
table (assuming you want to delete client 100): After that, you just have to truncate the original table and insert all rows from the temp table: Rebuilding the primary index is a good thing to speed up the client deletion afterwards.
Automation of finding tables / preparing statements
Ifthere are many huge tables and the time windows is very small, you may
use a scripting language to prepare the SQL statements. I prefer Perl,
as I know this language and as Oracle comes with Perl and the DBI
module. Connecting to your database is pretty simple: You can start the script with $ORACLE_HOME/perl/bin/perl script.pl as oracle owner. Next
step will be to determine all client specific tables - in most cases,
the first column is named client, mandt or mandant. Here is a code
snippet which will give you number of rows in the remaining clients and
overall rows, you just have to adjust to your needs:
You just have to add some output to build the SQL scripts.