Точный предел действительно сложно определить заранее.
Одна вещь, которую большинство людей недооценивают, это высокие требования, которым должен соответствовать индекс, прежде чем он станет кандидатом для использования в запросе.
Эффективный (некластеризованный) индекс
предлагает большую избирательность , например, возвращает только очень маленький процент (<1%, <2%) от общего числа строк. Если избирательность не задана - оптимизатор запросов SQL Server, скорее всего, будет игнорировать этот индекс
в идеале должен покрывать запрос, т.е. возвращать все столбцы, требуемые запросом. Если вы можете создать индекс, который имеет 1 или 2 столбца индекса и включает еще несколько (2-4) столбцов в качестве включенных столбцов, и, таким образом, вы можете покрыть запрос - тогда, скорее всего, оптимизатор запросов будет использовать этот индекс. Это также означает: если ваш код всегда использует SELECT * .....для извлечения всех столбцов , вероятность использования индексов снижается - довольно резко, на самом деле
Я уверен, что есть и множество других критериев, но я считаю, что эти два являются наиболее важными. Конечно, вы всегда должны поддерживать свои индексы должным образом (реорганизовывать, перестраивать) и следить за тем, чтобы статистика, связанная с вашими индексами, была актуальной.
PS: некластеризованные индексы на столбцах внешнего ключа являются особым случаем; по умолчанию я всегда рекомендовал бы добавлять их, поскольку они помогают ускорить как проверку ссылочной целостности, так и проверку JOINэтих ограничений FK. Но даже здесь абсолютно справедливо «расширять» эти индексы столбцов FK, добавляя некоторые дополнительные столбцы «include», чтобы сделать их еще более полезными.