...
In this scenario, 300 Open ROADM device nodes are already defined. A number of these data nodes will be deleted using CpsDataService::deleteDataNodes. The types of nodes will be varied, for example, deleting container nodes, list elements, or whole lists.
Test results
N | 50 | 100 | 150 | 200 | 250 | 300 | Example xpath |
Delete top-level container node | - | - | - | - | - | 0.630 | /openroadm-devices |
Batch delete N/300 container nodes | 0.150 | 0.261 | 0.377 | 0.453 | 0.553 | 0.686 | /openroadm-devices/openroadm-device[@device-id='C201-7-1A-10']/org-openroadm-device |
Batch delete N/300 lists elements | 0.132 | 0.248 | 0.338 | 0.449 | 0.545 | 0.670 | /openroadm-devices/openroadm-device[@device-id='C201-7-1A-49'] |
Batch delete N/300 whole lists | 0.509 | 1.054 | 1.401 | 1.848 | 2.134 | 2.555 | /openroadm-devices/openroadm-device[@device-id='C201-7-1A-293']/org-openroadm-device/degree |
Try batch delete N/300 non-existing | 0.250 | 0.535 | 0.667 | 0.951 | 1.145 | 1.318 | /path/to/non-existing/node[@id='27'] |
Observations
- Delete performance is linear on the amount of data being deleted (as expected).
- Raw performance of deleting containers of list elements is around 40,000 fragments per second. (So we can delete data nodes around 10x faster than creating them.)
- Deleting lists is much slower than deleting the parent container of the list (which can be easily improved).
- Of note, attempting to delete non-existing data nodes takes longer than actually deleting the equivalent amount of nodes with descendants - it is a slow operation.Deleting lists is much slower than deleting the parent container of the list.
Suggested improvement: For whole list deletion, add a condition to the WHERE clause in the SQL for deleting lists, to narrow the search space to children of the parent. For example:
SELECT * FROM fragment WHERE (existing conditions)
AND parent_id = (SELECT id FROM fragment WHERE xpath = '/parent-xpath')
...
Suggested improvement: Add a condition to the WHERE clause in the SQL for reading lists, to narrow the search space to children of the parent. For example:
SELECT * FROM fragment WHERE (existing conditions)
AND parent_id = (SELECT id FROM fragment WHERE xpath = '/parent-xpath')
...