Trace Flag 4199 - включити глобально?


19

Це може підпадати під категорію думок, але мені цікаво, якщо люди використовують прапор сліду 4199 як параметр запуску для SQL Server. Для тих, хто ним користувався, за яких обставин ви зазнали регресії запитів?

Це, звичайно, здається, що це потенційна вигода від ефективності в усіх сферах, я розглядаю можливість включити її в усьому світі в нашому невиробничому середовищі і дати йому можливість сидіти пару місяців, щоб вирішити будь-які проблеми.

Чи виправлені в 4199 виправлення в оптимізаторі за замовчуванням у 2014 (або 2016)? Хоча я розумію випадок невнесення неочікуваних змін у план, виглядає дивно зберігати всі ці виправлення прихованими між версіями.

Ми використовуємо 2008, 2008R2 та переважно 2012 рік.


У вас зараз виникають проблеми з оцінкою кардинальності чи щось таке?
Зейн

Ви читали зміни, включені прапором, щоб побачити, чи не принесуть вони вам користі?
сварка

Я читав їх, кілька, здається, релевантних, приєднується до кількох колонок, особливо.
FilamentUnities

Відповіді:


20

Особисто, коли я будую новий сервер для нового проекту, я завжди включаю TF4199 у всьому світі. Те саме стосується, коли я модернізую існуючі екземпляри до новіших версій.

TF дає нові виправлення, які впливатимуть на поведінку програми, але для нових проектів ризик регресу не є проблемою. Для примірників, оновлених попередніми версіями, відмінності між старою та новою версією викликають занепокоєння самостійно, і в будь-якому випадку очікується, що впоратися з регресією плану, тому я вважаю за краще битися з нею із включеним TF4199.

Що стосується існуючих баз даних, існує лише один спосіб знати: протестувати її. Ви можете захопити робоче навантаження на існуючу програму та відтворити її після включення прапора. Утиліти RML можуть допомогти вам автоматизувати процес, як описано в цій відповіді .

Очевидно, прапор впливає на весь екземпляр, тому вам доведеться протестувати всі бази даних, що сидять там.


12
Також важливо зазначити, що всі 4199 виправлень на сьогоднішній день будуть включені в SQL Server 2016 (без прапора сліду). 4199 як і раніше працюватиме, але лише виправлятиме нові виправлення з цього моменту.
Аарон Бертран

6

Мій пошук по цій темі привів мене сюди, тому я просто хотів би поділитися своїм останнім досвідом роботи з цією темою.

Я працював на 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? Він просто дозволяє всі виправлення.


1

Я хотів поділитися своїм досвідом із слідом прапора 4199.

Щойно я закінчив діагностувати питання про продуктивність у системі клієнтів під управлінням SQL Server 2012 SP3. Замовник перемістив базу даних звітів від свого виробничого OLTP-сервера на новий сервер. Метою замовника було усунути конкуренцію за ресурси із запитами OLTP. На жаль, замовник сказав, що новий сервер звітності дуже повільний.

Зразок запиту, який виконується в системі OLTP, виконується за 1,6 секунди. План запитів шукав індекс для таблиці з порядком 200 мільйонів, яка була частиною перегляду.

На новому сервері той же запит виконується за 10 хвилин 44 секунди. Він здійснив сканування індексу на тій же таблиці 200 мільйонів рядків.

Дані сервера звітів були копією даних OLTP, тому, схоже, це не було різницею даних.

Мене спокусило, поки я не згадав, що наше програмне забезпечення (яке працює за їх системою OLTP) дозволило створити кілька прапорів слідів при запуску. Один із них, я згадував, 4199, - це виправлення оптимізатора запитів.

Я перевірив включення прапора сліду 4199 на новому сервері звітності клієнта, а запит звітування завершився за 0,6 секунди. (Ого!) Я відключив прапор сліду, і запит повернувся до виконання через 10 хв 44 сек. Увімкнено прапор: назад до 0,6 секунди. Мабуть, включення прапора сліду дозволило оптимізатору використовувати пошук пошуку в індексі в таблиці 200 мільйонів рядків.

У цьому випадку оптимізація запитів, включена прапором 4199 сліду, внесла величезну різницю. Ваш досвід може відрізнятися. Однак, виходячи з цього досвіду, мені, безумовно, здається, що варто дозволити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.