У меня есть многопользовательская база данных в SQL Server 2012, где строки каждого клиента идентифицируются столбцом tenant_id
(также известным как Общая база данных, общая схема). У некоторых арендаторов, особенно у новых, очень мало рядов, у других их много.
Оптимизатор запросов SQL Server обычно строит план запроса на основе параметров, предоставленных во время его первого выполнения, а затем повторно использует этот план для всех будущих запросов, даже если предоставлены другие параметры. Это называется анализом параметров.
Проблема, с которой мы сталкиваемся с нашей базой данных, заключается в том, что SQL Server иногда строит эти планы на основе параметров, которые указывают на меньшего клиента, что отлично работает для этого клиента, но затем, когда он повторно применяет кешированный план к большему клиенту, он терпит неудачу катастрофически (обычно по времени на самом деле). Обычно мы узнаем об этой ситуации только тогда, когда один из наших более крупных клиентов связывается с нами по поводу возникновения ошибок тайм-аута, тогда мы должны войти в систему и вручную очистить все планы запросов, чтобы исправить это.
Существует подсказка запроса, которую вы можете использовать, чтобы запретить SQL Server кэшировать планы запросов (_ 2_), но это приводит к дополнительным накладным расходам, поскольку план запроса создается заново каждый раз при вызове запроса. Дополнительная проблема заключается в том, что мы используем Entity Framework, который не дает возможности указывать подсказку OPTIMIZE FOR UNKNOWN
для запросов.
Итак, вопрос в том, как лучше всего использовать анализ параметров для мультитенантных баз данных? Есть ли способ отключить анализ параметров для всей базы данных без необходимости указывать его в каждом запросе? Если да, то это лучший подход? Должен ли я каким-то образом разбивать данные на разделы? Есть ли другой подход, о котором я не думаю?
OPTIMIZE FOR UNKNOWN
не имеет описанного вами поведения. Вы путаете это сOPTION (RECOMPILE)
. Если вы используете Enterprise Edition, вы можете просмотреть руководства по планам, чтобы дать подсказку. Или есть флаг трассировки (4136), чтобы полностью отключить отслеживание параметров, но это относится к < b> экземпляр, а не база данных. - person Martin Smith   schedule 16.02.2014