Might be complicated but, when the cannonball hits the sprite you reduce it's height to the position of the cannonball, (all dirt above the hit vanishes) minus a few extra pixels. Then you spawn a stretched sprite above it from the original height down to a few pixels above the cannonball hit. (draw in the overhang) or if the calculated bottom position is above where the surface was, then skip it as that means the crater is on the surface.
It would still look like your original animation, except the rocks couldn't be mixed in, as they would appear to shift down.
(hmm, maybe reverse it, the sky is the sprite columns, moving down hiding the destroyed dirt, rocks wouldn't shift that way.)
I didn't say it was a complete idea, I was trying to spark ideas to reduce the sprites. You would still have to figure how to handle the overhang sprites when they get hit.