I have two very similar database questions related to changes tracking

 - There are a lot of automation tests for an application, all of them use one database backup. Currently before each test execution the backup is restored.  It's needed as these tests might change data, so if several tests were executed in a row without restoring database, they might fail. Restoring a database is rather slow operation and I want to avoid it. Is there a way to restore a database to the previous state, before executing the test? I want the following scenario:
  - The database is restored
  - Test 1 is executed (it might change data)
  - The database is restored to previous state
  - Test 2 is executed and so on

I think about wrapping up all tests operation into a transaction and using rollback when a test finishes. But probably there is a better way to do so? Can someone at least point me to the right direction?

- I have rather large database which I use for performance testing. Typically, I add experimental indexes, change stored procedures, functions and so on. What I want is to track my changes: which indexes were added, which stored procedures were changed and so on. 
How can I do it? I want to be able to restore the original database state to compare performance with and without changes.

Any help is greatly appreciated.