Ok, it looks like you are moving 61 to 62, 60 to 61, 59 to 60, etc, which would require a Block_Move for each shift. If I was doing it, I would just copy the entire production history to a "scratch block", and then copy it back to the original with a byte offset equal to one Product History array.
For instance, let's assume that "History Production".Shift[1] is ten bytes long, and resides in DB100. And, let's say that you are storing 100 shifts. If you create another data block (i.e. DB101) for temporary storage, you could so something like this:
Copy DB100.DBX 0.0 Byte 1000 to DB101.DBX0.0 Byte 1000
Copy DB101.DBX 0.0 Byte 1000 to DB100.DBX10.0 Byte 1000
More or less, you would be shifting all the data at once, and since the Block Move SFC doesn't care if the block isn't big enough, the old data will automatically be shifted out.