Blogs

Построение индексов – часть 6: построение секционированного индекса (Продолжение – Невыровненные индексы)

  • Comments 1
  • Likes

Параллельное построение невыровненных секционированных индексов (продолжение)

 

Базовая таблица  секционирована, с использованием другой схемы секционирования, чем  индекс:

 

Секционированная базовая таблица и секционированный индекс являются невыровненными если используют различные схемы секционирования или (как в примере ниже) секционированы по разным колонкам.

 

Пример:

 

Create Partition Function pf (int)

as range right for values (1,  100, 1000)                 

 

Create Partition Scheme ps as Partition pf

TO ([PRIMARY], [FG1], [FG2], [FG3])

 

Create table t (c1 int, c2 int)

on ps(c2)

 

Create clustered Index idx_t on t(c1)

on ps(c1)

 

Последовательный план построения невыровненного индекса выглядит следующим образом:

 

Построитель

              |

            Сортировка

              |

             NL

            /  \

     ПТС Сканирование

 

 

ПТС: Постоянный  табличный скан (задача ПТС – предоставить ID секций построителю)

NL: Nested Loop (вложенный цикл)

 

ПТС предоставляет ID секций внутренней стороне Nested Loop-а, который строит индекс для каждой секции. В остальном, план выглядит точно также как в случае с несекционированной базовой таблицей (см. предыдущий пост). Соответственно, требования к памяти и дисковому пространству – те же.

 

В случае параллельного построения:

 

  X(обмен)

               |

            Сортировка

               |

              X (обмен – ре-секционирование)

               |

             NL

              / \

           X   Сканирование

           / 

     ПТС

 

Итератор обмена выше ПТС (Х) получает данные о ID секций и подает их  внутренней стороне Nested Loop. Между этой точкой и ре-секционированием  каждый исполнитель получает 0-N секций в зависимости от распределения данных.

 

Ре-секционирование делит план построения индекса на две параллельно исполняемые части: различные исполнители выполняют работу до и после ре-секционирования. Каждый исполнитель получает №Секций /DOP (здесь имеется ввиду секций в строимом индексе, не в базовой таблице). Информация о секциях строимого индекса «спускается» итератору обмена – ре-секционирования, которые перераспределяет данные между промежуточными структурами сортировки. В остальном, план выглядит точно также как в случае с несекционированной базовой таблицей (см. предыдущий пост). Соответственно, опять таки, требования к памяти и дисковому пространству – те же.

 

Читайте в следующих  постах о фоновом построении индексов(Online Index Build) J

Comments
  • Здравствуйте, Людмила! У вас очень интересный блог! Однако один момент в этой заметке остался для меня неясным.

    >>Create table t (c1 int, c2 int) on ps(c2)

    >>Create clustered Index idx_t on t(c1) on ps(c1)

    В вашем примере строится кластерный невыровненный индекс?

    Я думал, что кластерные индексы всегда выровненные, раз они хранятся вместе с данными. Например если я выполню вставку

    insert t values(2, 101),

    то получится, что одна и та же запись будет находится в секции 3, если судить по данным, и в секции 2, если судить по индексу.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment