Враховуючи ці константи, чи буде SQL Server завжди створювати той самий план для заданого запиту? Якщо ні, чи є інші міркування? Чи слід також враховувати елемент недетермінізму?
Наскільки я знаю, складання запитів є детермінованим. Однією з оригінальних цілей проектування QO було те, що слід було б відтворити плани виконання в іншій системі, використовуючи копію бази даних, що стосується лише статистики . У цьому є кілька тонкощів, навколо параметрів конфігурації, таких як кількість доступної пам'яті та кількість логічних процесорів, але вони охоплені вашим списком речей для синхронізації.
Caveat: Це правда за умови, що слово "той самий" у вашому списку означає , що воно означає у всіх відношеннях абсолютно те саме . Наприклад, "однакові" статистичні дані можуть існувати у двох системах, але вони є абсолютно однаковими, якщо етапи гістограми та інформація про щільність однакові .
Зважаючи на це, процес оптимізації також є надзвичайно складним , тобто може бути важко забезпечити, щоб усі входи до цього детермінованого процесу були однаковими , і що всі внутрішні стани були досить подібними, щоб забезпечити той самий шлях коду через оптимізатор для конкретного складання. Якщо запит містить доступ за межами бази даних (до іншої бази даних чи примірника), ці середовища також повинні бути ідентичними.
Одне, що я хотів би додати до вашого списку, - це перевірити, чи існують будь-які посібники щодо плану у другій базі даних.
Використання недетермінованих функцій, як GETDATE()
у запитах, може означати, що ви також отримаєте інший план. Незважаючи на те, що основний оптимізатор не використовує значення безпосередньо, оцінка кардинальності може (див. Постійне складання та оцінка виразів під час оцінки кардинальності ). Я не впевнений, якщо цей клас різниці потрапляє в рамки питання, тому що обидві системи створювали б один і той же план, якщо вони виконуються одночасно (або, загалом, з однаковими вхідними змінними, параметрами та значеннями функцій).