I agree with using the full production set obfuscated. It's not hard to write a script to do this, there are also testing tools that will build pretty decent fake data. This way developers will naturally gravitate to an optimized solution. Why wait on a develop/build/test/fix cycle when you can catch most of it at the time right in the development step? Of course you should have performance tests, etc. but it's all about keeping the cycle as short as possible.
Also, in my experience, it would be nice if everything was always known up front, but that's typically not possible, especially when you develop solutions for sale, no matter what kind of fence you put around a solution, the sales team will drive over it with a bulldozer.