Sean Fowler
It can be either on a separate server or the same one. Typically it would be on a separate server to avoid slowing down the main server so much while reports are being run.
4-5 hours per report is a loooooong time, but then you knew that. You say you have millions of rows in each of the tables, but how many rows does each report contain Has the data in the reports been aggregated (i.e. do you have group bys, sums, counts etc)
If you post the Sql you use for one of the reports I'll take a look to see if we can speed it up, and hopefully others will too.
There are two main ways to write complex queries. One is to try to do as much as possible in a single select statement. I used to do it this way, but I found a far better way. In your first statement have only the tables you need in order to select the right rows, and put what data you need from those tables into a temp table, along with any columns you'll need for joing to the other tables. The temp table should also contain columns for the additional data you need from those other tables. These additional columns will be filled by subsequent update statements, typically one for each table you need to get data from.
This sounds as though it should be slower, but in fact it's generally much faster. Sql Server can handle multiple simple queries far better than a single big one. It's also far easier to write and maintain the Sql when it's written this way.
You may already be writing it this way, but if not it's a potential area for performance gains.
Sean