ZFS send | recv combined with snapshots
The code below is what I use to churn a dataset when experimenting with special vdevs and metadata size
Code:
zfs snap BigPool/SMB/Common@migrate
zfs send -R BigPool/SMB/Common@migrate | zfs recv -F BigPool/SMB/Common_New
zfs snap BigPool/SMB/Common@migrate2
zfs send -i @migrate BigPool/SMB/Common@migrate2 | zfs recv -F BigPool/SMB/Common_New
zfs destroy -rf BigPool/SMB/Common
zfs rename -f BigPool/SMB/Common_New BigPool/SMB/Common
It does a snapshot, sends that snapshot to a new dataset. Then repeats this in case of changes as the first may have taken a while.
Then the old dataset is destroyed and the new dataset is renamed to the old dataset. You don't need all of that but you should be able to work out what you need from the above