Коли краще створити СТАТИСТИКУ замість створення індексу?


38

Я знайшов багато інформації про те STATISTICS , що таке : як вони підтримуються, як їх можна створити вручну або автоматично з запитів чи індексів тощо. Але я не зміг знайти жодних вказівок чи "найкращих практик" щодо того, колидля їх створення: які ситуації отримують більше вигоди від створеного вручну об’єкта STATISTICS, ніж від індексу. Я бачив створену вручну відфільтровану статистику, яка допомагає запитам на розділених таблицях (адже статистика, створена для індексів, охоплює всю таблицю і не є розділом - brillaint!), Але, безумовно, повинні бути інші сценарії, які мали б користь від об'єкта статистики, тоді як не потребує деталізації індексу, не варто витрачати на підтримку індексу або збільшувати шанси на блокування / глухий замок.

@JonathanFite у коментарі згадав про різницю між індексами та статистикою:

Індекси допоможуть SQL швидше знаходити дані, створюючи підходи, які сортуються інакше, ніж сама таблиця. Статистика допомагає SQL визначити, скільки пам'яті / зусиль буде потрібно для задоволення запиту.

Це чудова інформація, головним чином тому, що вона допомагає мені уточнити моє питання:

Як знання цього (або будь-яка інша технічна інформація на те , що S і як и , пов'язане з поведінкою і характером STATISTICS) допоможе визначити , коли вибрати CREATE STATISTICSбільш CREATE INDEX, особливо при створенні індексу буде створити відповідний STATISTICSоб'єкт? Який сценарій краще використовувати, якщо мати лише інформацію про СТАТИСТИКУ та не мати Індекс?

Було б дуже корисно, якщо можливо, мати робочий приклад сценарію, коли STATISTICSоб'єкт краще підходить, ніж an INDEX.


Оскільки я є візуальним учнем / мислителем, я вважав, що це може допомогти побачити відмінності між собою STATISTICSта INDEXes, поруч, як можливий засіб допомогти визначити, коли STATISTICSкращий вибір.

Thingy           PROs                             CONs
-------          ----------                       -------------------
INDEX            * Can help sorts.                * Takes up space.
                 * Contains data (can             * Needs to be maintained (extra I/O).
                   "cover" a query).              * More chances for blocking / dead-locks.

STATISTICS       * Takes up very little space.    * Cannot help sorts.
                 * Lighter maintenance / won't    * Cannot "cover" queries.
                   slow down DML operations.
                 * Does not increase chances
                   of blocking / dead-locks.

Нижче наведено декілька ресурсів, які я знайшов, шукаючи цей, який навіть задає це саме запитання, але на нього не було відповіді:

Індекс SQL Server проти статистики

Запитання щодо статистики SQL Server, ми були занадто сором'язливими для запитання

Статистика. Чи можливі багатоколінні гістограми?

** Щоб було зрозуміло, у мене немає відповіді на це, і я насправді шукаю отримати зворотній зв'язок від кількох людей, щоб надати інформацію, яка, як видається, дивно відсутня тут, в інтерв'ю.


1
Індекси допоможуть SQL швидше знаходити дані, створюючи підходи, які сортуються інакше, ніж сама таблиця. Статистика допомагає SQL визначити, скільки пам'яті / зусиль буде потрібно для задоволення запиту.
Джонатан Фейт

@JonathanFite Дякую за коментар Я включив це у своє питання :).
Соломон Руцький

Після коментаря @ JonathanFite, схоже, статистика найкраща для підвищення продуктивності в спеціальних системах / таблицях / моделях запитів, тоді як індекси краще для передбачуваних моделей запитів. Я маю на увазі це як більше питання, ніж твердження.
Дейв

Відповіді:


19

Ви запитуєте, що обертається навколо - коли добре створити статистику проти створення індексу (який створює статистику).

З мого SQL SERVER Internals приміток (SQLSkills class- IE1 і IE2) і SQL Server Нутрощі бронювання , нижче моє обмежене розуміння:

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

SQL Server використовує модель на основі витрат, щоб якомога швидше вибрати "досить хороший" план виконання. Оцінка Cardanility (оцінка кількості рядків, що підлягають обробці на кожному етапі виконання запиту) - найважливіший фактор оптимізації запитів, який впливає на стратегію приєднання, вимогу надання пам’яті, вибір робочих ниток, а також вибір індексів під час доступу до даних .

SQL Server не використовує некластеризовані індекси, коли вважає, що великого немає. операцій із пошуку ключа KEY або RID знадобиться, тому він веде статистику щодо індексів (і стовпців), що допоможе в таких оцінках.

Про статистику є дві важливі речі:

  1. Гістограма зберігає інформацію про розподіл даних для самого лівого стовпчика статистики (індексу). Він також зберігає інформацію про багатостовпну щільність ключових значень. Таким чином, гістограма зберігає розподіл даних лише для крайнього лівого стовпця статистики.

  2. SQL Server збереже не більше 200 кроків у гістограмі незалежно від розміру таблиці. Інтервали, охоплені кожним кроком гістограми, збільшуються в міру зростання таблиці, що призводить до "менш точної" статистики для великих таблиць.

    Пам'ятайте, що вибірковість індексу - це показник, обернено пропорційний щільності, тобто чим більше унікальних значень стовпчик, тим вища його селективність.

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

Посилання:

Примітка. Хтось, як Пол Уайт або Аарон Бертран, може задзвонити, щоб надати більше кольорів вашому хорошому запитанню .


"SQL Server не буде використовувати некластеризовані індекси, коли він оцінює, що потрібна велика кількість операцій пошуку клавіш KEY або RID". Чи може QO використовувати об'єкт статистики на основі індексу незалежно від індексу? Значить, якщо індекс не є оптимальним, але провідний стовпець знаходиться в запиті, то статистика все ще є актуальною. Так вони б використовувались? Або ця інформація означає, що можуть бути випадки, коли індекс, швидше за все, не буде використаний, але оскільки статистика все ще має значення, то немає справжньої причини для створення індексу, просто зробіть статистику?
Соломон Руцький

8

Я б сказав, що вам потрібен індекс, коли вам потрібно мати можливість обмежити кількість даних / швидко дістатись до правильних даних на основі полів.

Вам потрібна статистика, коли вам потрібен оптимізатор, щоб зрозуміти природу даних, щоб мати можливість виконувати операції найкращим чином.

Як я зрозумів, відфільтрована статистика допомагає, коли у вас є недоліки у ваших даних, які сильно впливають на план, наприклад, при переповненні стека небагато користувачів мають величезну кількість повідомлень, тому використання просто середніх повідомлень на користувача не є найкращою оцінкою. Таким чином, ви можете створити відфільтровану статистику на userId на основі імені користувача, і тоді SQL Server повинен знати, що коли це ім’я користувача знаходиться в запиті, це ідентифікатор користувача, який він отримає, і він повинен мати можливість з'ясувати, що індексоване поле в таблиці повідомлень матиме величезну кількість рядків з цим ідентифікатором, оскільки там існує гістограма. З середніми показниками цього зробити неможливо.


1
Привіт, і дякую за відповідь. Отже, коли мені знадобиться / хочу, щоб оптимізатор краще зрозумів природу даних, і все ж не обмежував ці дані або хотів швидше дістатися до них, чи потрібно це "охопити" запит? Те саме для вашого відфільтрованого індексу. Я розумію, що ви говорите з точки зору виведення крайніх випадків із середніх показників, але чому відфільтрована статистика буде кращою за відфільтрований індекс у тих же полях? Це відмінність, яку я намагаюся досягти.
Соломон Руцький

Як і в прикладі, ви не можете створити відфільтрований індекс від імені користувача до таблиці повідомлень, оскільки його там немає. Ви можете створити його на основі ідентифікатора користувача, але це не в пункті де.
James Z

Але не UserIDбуло б у стані ПРИЄДНАЙТЕСЯ, навіть якби не в WHERE? І чи не буде це досить добре, щоб забрати відфільтрований Індекс?
Соломон Руцький

@srutzky Можливо, більш вірогідна версія в останніх версіях, але в цілому я б на це не покладався ... у більшості випадків предикати повинні точно відповідати. Я забуваю, якби вони виправили це, але в один момент відфільтрований індекс WHERE BitColumn = 0не буде обраний для простого запиту WHERE BitColumn <> 1. (І щоб було зрозуміло, бітовий стовпчик не був нульовим.) Я думаю, що були подібні випадки, такі як IntColumn > 10не збігаються IntColumn >= 11.
Аарон Бертран

Відфільтровані індекси не можна використовувати, якщо є ймовірність, що наступного разу, коли хтось використовуватиме плани, відфільтрований індекс більше не підходить. Я не можу думати про приєднання, яке могло б використовувати відфільтрований індекс. Навіть змінні не можна використовувати, оскільки наступного разу значення може бути чимось невідповідним.
Джеймс Z

4

З 70-461 навчальна книга Іціка Бен-Гана

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


Дякуємо, що опублікували це. Це дає відповідь на частину мого запитання, але все ще залишає відкритим питання про те, що: якщо мені потрібна статистика з декількома стовпцями, чому я б створив лише СТАТИСТИКУ замість індексу, який включав би СТАТИСТИКУ плюс додаткову інформацію, яка може додатково допомогти запиту ( ей)?
Соломон Руцький

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