Привіт разом! Я знаю, що це питання обговорювалося вже декілька разів, але ми стикаємось із шаленою дивною проблемою на нашому новому SQL Server 2014 SP3 зараз, і ми просто не можемо відстати.
Ми перейшли з Oracle на MS SQL Server минулого року. Наш міський голова DB досить великий, доречно. 800 ГБ, великі столи, система PDM. +1000 активних користувачів. 16 ядер, пам'ять 192 ГБ, накопичувач SSD SAN. ESX 6.5
Налаштування в SQL Server: -> Створення автоматичної статистики увімкнено -> оптимізація для спеціальних запитів = вірно -> Увімкнено ізоляцію знімка -> Максимальна паралель = 4 -> Поріг 50 -> Оновлення статистики асинхронізовано в TempDB, як правило, увімкнено в наших основних БД.
Як би там не було, у нас є деякі запити, які обробляються надзвичайно погано. Все призводить до того, що оптимізатор сервера SQl створює план виконання, вважає його нормальним, але при виконанні він робить внутрішнє з'єднання (або кратні) з Мільйонами замість очікуваних 1-2 рядків. І з курсів мільйони логічних читань. І я не можу відстати від того, що відбувається в цьому. Ці заяви пройшли тоді хвилин.
Таким чином, ми маємо вже 3 бази даних. Все та ж версія та обладнання, Prod Test та Dev Environment. Мої тести можна зробити досить легко. Всі dbs налаштовані однаково і показують однакову поведінку, але за різними запитами. Скажімо, колись тест-середовище робить те саме твердження багаторазовим за 47 секунд, то прод-біт за секунду. Інші займають секунди в Prod, встановлюються в Test. Що, до біса? Я завжди повторюю твердження у кілька разів, щоб забезпечити кешування.
1s проти 47s. Обидва ці БД мають однаковий екземпляр SQL.
Будь-які ідеї, що могло бути тут не так? Як виправити окремі плани виконання? Як може статися, що сервер sql дізнається з цього надзвичайно поганого твердження і виправить це наступного разу, коли він запуститься?
Дякуємо за вашу допомогу та ідеї.