Well I kind of figured it out. Evidently DX9 is better at streaming large buffers to the GPU than DX10, or at least on my hardware. What I'm doing now is breaking terrain up into smaller sized buffers (before I had terrain chunks but they were all in one large buffer) where each small buffer is actually a buffer pair: one D3D10_USAGE_STAGING buffer (CPU side only) and one D3D10_USAGE_DEFAULT buffer (GPU side only). After I build things in the staging buffer I do a CopyResource to copy to the default buffer. I think this may actually be how ID3DX10Mesh works. It explains what CommitToDevice does and why there is no CommitToDevice in the regular vertex and index buffer interface. The MS documentation on CommitToDevice pretty much says this in not so many words. If ID3DX10Mesh works this way it makes me wonder if I should ever be using D3D10_USAGE_DYNAMIC buffers.