Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Здравствуйте. Начинаю изучать секционирование таблиц - не могу написать простой запрос.
Есть большая таблица points и в ней есть поле DateIn.
Создал функцию

CREATE PARTITION FUNCTION OrderDateRangePFN(datetime)
AS
RANGE LEFT FOR VALUES (
'20080101 00:00:01.997',
'20080201 00:00:01.997',
'20080301 00:00:01.997',
'20080401 00:00:01.997',
'20080501 00:00:01.997',
'20080601 00:00:01.997',
'20080701 00:00:01.997',
'20080801 00:00:01.997',
'20080901 00:00:01.997',
'20081001 00:00:01.997',
'20081101 00:00:01.997',
'20081201 00:00:01.997'
)

Создал схему

CREATE PARTITION SCHEME OrderDatePScheme
AS
PARTITION OrderDateRangePFN
ALL TO ([PRIMARY])

И привязал ее к таблице points по полю DateIn.
Не могу записать запрос к ней.
Раньше пользовался без секционирования так:

set dateformat YMD
declare @d datetime
set @d = '2008-10-05'

declare @d2 datetime
set @d2 = '2008-10-27'
Select * from points where DateIn between @d and @d2 order by DateIn


Как теперь написать его с учетом секционирования?

set dateformat YMD

select count(*) from ObjectsMotion where NavTime between
$PARTITION.OrderDateRangePFN(@d) and $PARTITION.OrderDateRangePFN(@d2) - не правильно
11 ноя 15, 12:08    [18399188]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Igorgg,

точно так же писать, как и без секционирования. В плане запроса будет видно, что используется секционирования и какое количество секций.
11 ноя 15, 12:11    [18399210]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
А если целенаправленно указать номер секции, т.е. указать как бы 2 диапазона секций начала и конца

set dateformat YMD
declare @d datetime
set @d = '2008-10-05'
declare @d2 datetime
set @d2 = '2008-10-27'

declare @b1 bigint
set @b1 = (SELECT $PARTITION.OrderDateRangePFN(@d))
declare @b2 bigint
set @b2 = (SELECT $PARTITION.OrderDateRangePFN(@d2))

select count(*) from ObjectsMotion where NavTime between b1 and b2???
Иначе по замерам запрос выполняется в 3 раза дольше, чем в несекционной таблице.
11 ноя 15, 12:17    [18399240]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
aleks2
Guest
Igorgg
А если целенаправленно указать номер секции, т.е. указать как бы 2 диапазона секций начала и конца

set dateformat YMD
declare @d datetime
set @d = '2008-10-05'
declare @d2 datetime
set @d2 = '2008-10-27'

declare @b1 bigint
set @b1 = (SELECT $PARTITION.OrderDateRangePFN(@d))
declare @b2 bigint
set @b2 = (SELECT $PARTITION.OrderDateRangePFN(@d2))

select count(*) from ObjectsMotion where NavTime between b1 and b2???
Иначе по замерам запрос выполняется в 3 раза дольше, чем в несекционной таблице.


Осподе, какие сложности. Для использования секций в кляузе where должно быть условие по полю секционирования, например, DateIn = '20150101'.
Если условие позволяет локализовать секцию(секции) - будут использованы только они. Иначе - никакой пользы от секционирования не узрите.
11 ноя 15, 12:29    [18399304]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Igorgg,

Вы не можете выбирать номера секций, это внутренние механизмы сервера. Однако, не забывайте, что для того, чтобы оптимизатор учел секции правильно, должны быть явные преобразования типов или совпадающие типы данных используемых для функции секционирования и для запроса.
11 ноя 15, 12:34    [18399348]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Типы совпадают. Почему же тогда ищет в 3 раза медленнее? Индекс некластерный и перестроился с учетом секций. Может надо еще какой-либо индекс создать?
11 ноя 15, 12:39    [18399369]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Добрый Э - Эх
Guest
Igorgg,

планы запросов уже смотреть пробовал?
11 ноя 15, 12:41    [18399383]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
конечно
11 ноя 15, 12:42    [18399390]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Добрый Э - Эх
Guest
Igorgg,

и что они показывают? есть "партишн прунинг" (отсечение лишних секций) или тупо фигачит фуллсканом по всей таблице?
11 ноя 15, 12:47    [18399419]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Так какой запрос Вы выполняете и где создали секционированный индекс?
Путаетесь в показаниях...

Select * from points where DateIn between @d and @d2 order by DateIn
или
select count(*) from ObjectsMotion where NavTime between @d and @d2
11 ноя 15, 13:00    [18399487]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Ошибся, sql текст в буфере обмена висел. 2 - неправильный
11 ноя 15, 13:34    [18399768]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Добрый Э - Эх
Guest
Igorgg,

ну? планы-то покажешь? или мы дальше будем ванговать на кофейной гуще, размазанной картами таро по хрустальному шару?

заодно про структуру таблицы и схемы индексирования не забудь...
11 ноя 15, 16:52    [18401386]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
Igorgg
конечно
Ну, вы поделитесь подробностями.
Модель данных до и после, с индексами, тексты и планы запросов (актуальные, со статистикой выполнения) до и после изменений.

Стало в 3 раза медленнее, значит, чего то испортили, как иначе?

Если бы секционирование было бы просто такой опцией, которая автоматически ускоряет все запросы, то её разработчики сиквела включили бы по умолчанию, а вы про неё даже не узнали бы.
11 ноя 15, 17:54    [18401875]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к секционированной таблице  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Все, спасибо - разобрался.
Оказывается, что начальная фаза перестройки индекса не захватила 1 индекс, а по нем как раз и производились вычисления.
После принудительного указания в индексе схемы секционирования результаты улучшились.
12 ноя 15, 09:25    [18404171]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить