Have you looked at what types of wait's you are getting while it is running? Or ruled out IO bottlenecks.
Usual Suspect list:
1. Bad Code
2. Worse Code
3. Bad SAN
4. Other Activity (usually bad code)
5. Bad Table design
6. Bad PK Clustering choice + no fill factor
7. Over indexing