Мій пошук по цій темі привів мене сюди, тому я просто хотів би поділитися своїм останнім досвідом роботи з цією темою.
Я працював на SQL 2014, тож я зрозумів, що буду в безпеці від того, щоб трохи потурбуватися про 4199 ... але це просто не було правдою ...
Як діагностувати, якщо вам потрібно 4199
Якщо ваш запит працює погано , особливо коли ви вважаєте, що це не повинно, то спробуйте додати наступне до кінця, щоб побачити, чи він усуває всі ваші проблеми, як вам може знадобитися 4199 ("Увімкнути всі виправлення оптимізатора запитів". )
SELECT SomeColumn
FROM SomeTable
OPTION(QUERYTRACEON 4199)
У моїй ситуації у мене був пункт 10 перших, що підірвав запит, який пройшов без проблем, і саме це змусило мене думати, що відбувається щось рибне, і що 4199 може допомогти.
Близько 4199 року
Будь-які виправлення помилок / продуктивності оптимізатора запитів SQL Server, створені після виходу нової основної версії, фактично приховуються та блокуються. Це в тому випадку, якщо вони можуть завдати шкоди якійсь іншій теоретично ідеально оптимізованій програмі. Отже, встановіть оновлення як можна, фактичні зміни оптимізатора запитів за умовчанням не увімкнено. Отже, після того, як буде зроблено одне виправлення або покращення, 4199 стає необхідністю, якщо ви хочете скористатися цим. Коли з’явиться багато виправлень, ви, зрештою, увімкнете це, коли одна з них вплине на вас. Ці виправлення, як правило, прив’язуються до власних прапорів слідів, але 4199 використовується як головний "Увімкнути кожне виправлення".
Якщо ви знаєте, які виправлення вам потрібні, ви можете ввімкнути їх поодиноко, а не використовувати 4199. Якщо ви хочете включити всі виправлення, використовуйте 4199.
Добре, тобі хочеться 4199 в усьому світі ...
Просто створіть роботу агента SQL, яка працює щоранку наступним рядком, щоб увімкнути прапор сліду в усьому світі. Це гарантує, якщо хтось вимкнув їх чи інше, що він повернеться. Цей крок завдання має досить простий sql:
DBCC TRACEON (4199, -1);
Де -1 визначає глобальну частину в DBCC TRACEON. Для отримання додаткової інформації див:
https://msdn.microsoft.com/en-us/library/ms187329.aspx?f=255&MSPPError=-2147217396
Плани запитів "Перекомпіляція"
У моїй останній спробі мені довелося включити 4199 у всьому світі, а потім також видалити існуючі плани кешованих запитів :
sp_recompile 'dbo.SomeTable'
https://msdn.microsoft.com/en-us/library/ms181647.aspx?f=255&MSPPError=-2147217396
Якщо збережена процедура перекомпіляції знаходить будь-які плани запитів, що стосуються об'єкта бази даних (наприклад, таблиця), і видаляє ці плани запитів, вимагаючи наступної спроби запустити аналогічний запит для їх компіляції.
Так, у моєму випадку 4199 не дозволяло створювати погані плани запитів, але я також повинен був видалити ті, які все ще кешувались через sp_recompile. Виберіть будь-яку таблицю з відомого зачепленого запиту, і вам слід добре спробувати цей запит ще раз, припустивши, що ви зараз увімкнули 4199 у всьому світі та очистили план запитів кешованих порушень.
У висновку 4199 року
Коли ви використовуєте індекси, для оптимізації плану запитів стає важливим фактичне використання цих індексів інтелектуально, і якщо припустити, що з часом буде випущено певне виправлення в процесі оптимізації запитів, ви, як правило, у безпечній воді, щоб просто працювати з 4199 глобально включеними, до тих пір, поки ви зрозумієте, що якесь нове виправлення може насправді не грати так добре з високооптимізованою базою даних, яка була такою, що оптимізована в попередньому середовищі до цього виправлення. Але що робить 4199? Він просто дозволяє всі виправлення.