When you read a property from your Profile provider, you'd think that it will only call the provider's GetPropertyValues method, right? Well as it turns out, it's calling the SetPropertyValues as well, on every call. I can't for the life of me figure out why it would do that.
Then, when I was looking a little deeper, I found that the framework will call FindProfilesByUserName whenever you try to hit Profile.LastActivityDate or Profile.LastUpdateDate. The SQL provider does this and it looks for just one record in one page (the method is intended to do paged data calls). So what happens if your provider looks for partial matches, which is kind of the point if you're worried about getting pages of data?
The more I get into this stuff, the more hackish it seems. I think Membership and Profile are great ideas, but the implementation leaves a lot to be desired.