It depends on your needs but I take it that something like, say:
debug.setHead(800000) may help.
It "rewinds" your blockchain's last block to block 800 000 (just an example).
It don't know if it works to query past smart contracts but I suppose it shall work: I've often used it (at the geth JS console) to query past balances for particular addresses.
The issue is that then you need to re-synch up to the latest block: that's why I'm saying it depends on your use case. The technique doesn't scale, but if your requirements are simple it may be sufficient.
For example if I want to query an address's balance (address which may be a smart contract, so it's more advanced than simply checking the amount of ETHs in a "normal" address), approximately weekly, I start from the current block (the latest one) then I debug.setHead(...) one week before current date, then one week before that, rinse and repeat. That is very fast. But at the end you need to re-synch from wherever you ended up.