First of all, you need to establish whether the spikes are occurring on the CPU or the GPU (or both). I'd recommend implementing basic (high-level) CPU/GPU profiling frameworks in your application, so you can measure and display the amounts of time that various operations are taking.
For the CPU, you can use QueryPerformanceCounter to measure timing of high-level operations in your frame, such as updating objects, physics (if any), frustum/occlusion culling, and rendering. For the GPU, you can use queries to get similar timing values out of the GPU. I wrote an article about that; it's written against the D3D11 API, but the same thing works in D3D10 with minor code modifications. Consult the ID3D10Query documentation for further details. Once you do this, you should be able to see the performance spikes in the data, and where in the frame the spikes are taking place. This will help focus further profiling efforts.
There are a few tools that can help drill down for more detailed information. AMD CodeAnalyst is a good free CPU profiling tool, and PIX is a free tool that works with D3D and your app to do GPU performance analysis and debugging.