Я бы избавился от 3 тысяч уникальных URL-маршрутов и заменил бы их общим маршрутом, который является последним универсальным маршрутом.Что-то вроде:
routes.MapRoute("productRoute", "{category}/{manufacturer}/{productTitle}", new { controller = "Products", action = "Index", category = UrlParameter.Optional, manufacturer = UrlParameter.Optional, productTitle = UrlParameter.Optional });
Вы также можете добавить пользовательский IRouteConstraint для проверки того, что категория существует (но просто убедитесь, что она не попадает в вашу базу данных каждый раз, когда производительность ухудшится).