SQL Server

SQL Server

Да се ​​създаде проста разделена таблица:

създаде дял функция PF (междинно съединение) като диапазон за стойности (0, 10, 100)

създаде дял схема PS като дял PF всички до ([първичен])

създаде таблица т (а междинно съединение, б ср) на PS (а)

Този скрипт създава маса с четири секции. SQL Server идентификатори, определени стойности на всеки от четирите части, както е показано в таблицата по-долу:

| -Nested Loops (Inner присъединяване, ВЪНШНИ ИЗТОЧНИЦИ: ([PtnIds1004]) PARTITION ID: ([PtnIds1004]))
...... | -Constant сканиране (стойности: (((1)), ((2)), ((3)) ((4))))
. ...... | -Table сканиране (ПРЕДМЕТ: ([п]))

секции Статични филтрация

Помислете за следната заявка:

изберете * от т, където <100

| -Nested Loops (Inner присъединяване, ВЪНШНИ ИЗТОЧНИЦИ: ([PtnIds1005]) PARTITION ID: ([PtnIds1005]))
. ...... | -Constant сканиране (стойности: (((1)), ((2)), ((3))))
. ...... | -Table сканиране (ПРЕДМЕТ: ([п]), където: ([т] [а].<(100)) PARTITION ID:([PtnIds1005]))

Ако в резултат на статичен филтриране ще бъдат изключени всички с изключение на един дял, ние нямаме нужда от оператори «Постоянно сканиране» и «вложени цикъла Присъединете»:

изберете * от т, където <0

| -Table сканиране (ПРЕДМЕТ: ([п]), където: ([т] [а].<(0)) PARTITION ID:((1)))

Динамични филтриращи секции

В някои случаи, SQL Server не може да определи, че към момента на съставяне на състава гледани секции няма да се променят, но е ясно, за да го, че някои секции могат да бъдат елиминирани.

изберете * от т, където <@i

| -Nested Loops (Inner присъединяване, ВЪНШНИ ИЗТОЧНИЦИ: ([PtnIds1004]) PARTITION ID: ([PtnIds1004]))
. ...... | -Filter (КЪДЕ: ([PtnIds1004]<=RangePartitionNew([@i],(0),(0),(10),(100))))
....... | | -Constant сканиране (стойности: (((1)), ((2)), ((3)), ((4))))
. ...... | -Table сканиране (ПРЕДМЕТ: ([п]), където: ([т] [а].<[@i]) PARTITION ID:([PtnIds1004]))

Това е параметризирана заявка. Тъй като ние не знаехме преди изпълнението на стойността на параметъра (това, което се използва постоянно като параметър в една и съща Бъч не променя статуквото), след съставяне че е невъзможно да се определи стойността на идентификатор за секцията «Постоянно сканиране» оператора. Може да се наложи да видите само раздел 1, или той ще бъде раздели 1 и 2, и така нататък. Ето защо, тази декларация съдържа всичките четири части на ID, и ние използваме за филтриране раздели идентификационни номера по време на изпълнение. Ние наричаме това "динамична филтриращи секции» (Dynamic Partition Премахване).

раздел Филтър сравнява всеки идентификатор в резултат на специална функция «RangePartitionNew». Тази функция се оценява резултатите от прилагането на функцията за разделяне на стойността на параметъра. Аргументите за тази функция (от ляво на дясно) са:

  • стойност (в този случай @i опция), ние искаме да се показва в раздела за самоличност;
  • Булева се обозначава дали функцията за разделяне на граничните стойности на ляво показва (0) или надясно (1);
  • гранични стойности участъци (в този случай 0, 10 и 100).

В някои случаи, оптимизатор е вече по време на компилация може да определи, че ние ще сканира само един раздел, дори и да не може да се определи какво е то. Например, ако сказуемото на заявка за търсене на равностойността на разделящ ключ, тогава ние знаем, че само един раздел, могат да отговарят на това условие. Ето защо, независимо от факта, че трябваше да сме динамични филтриращи секции, ние нямаме нужда от оператори «Постоянно сканиране» и «вложени цикъла Присъединете». например:

изберете * от т, където а = @i

| -Table сканиране (ПРЕДМЕТ :. ([T]), където: ([т] [а] = [@ Ь]) ПРЕГРАДИ ID: (RangePartitionNew ([@ I], (0) (0) (10 ), (100))))

Комбинацията от статични и динамични филтриращи секции

SQL Server може да комбинира статични и динамични филтриращи секции в план за заявка:

изберете * от т, където> 0 и <@i

| -Nested Loops (Inner присъединяване, ВЪНШНИ ИЗТОЧНИЦИ: ([PtnIds1004]) PARTITION ID: ([PtnIds1004]))
...... | -Filter (КОГАТО: ([PtnIds1004]<=RangePartitionNew([@i],(0),(0),(10),(100))))
...... | | -Constant сканиране (стойности: (((2)), ((3)) ((4))))
...... | -Table сканиране (ПРЕДМЕТ: ([п]), където: ([т] [а].<[@i] AND [t].[a]>(0)) ПРЕГРАДИ ID: ([PtnIds1004]))

Отбележете, че в последния спазването присъства статичен раздел филтруване ID = 1 при използване на «Constant Scan", и също така представя динамичен филтър за другите раздели, определени от предикати.

Можете изрично извикате функция RangePartitionNew, с помощта на дяла $:

изберете * $ partition.pf (а) от т

| -Compute скаларни (определя: ([Expr1004] = RangePartitionNew ([т] [а], (0) (0), (10), (100)))).
...... | -Nested Loops (Inner присъединяване, ВЪНШНИ ИЗТОЧНИЦИ: ([PtnIds1005]) PARTITION ID: ([PtnIds1005]))
......... .. | -Constant сканиране (стойности: (((1)), ((2)), ((3)) ((4))))
......... .. | -Table сканиране (ПРЕДМЕТ: ([п]))

Отличителна черта на този план заявка е появата на оператора Compute скаларни.