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

Откуда:
Сообщений: 948
Версия 2012 enterprise. В чем суть, хотим на одной таблице использовать секционирование (разместив historical данные в другие FG) и понемногу тестим.
Функция секционирования по месяцам вида
as range right for values ('2016-02-01','2016-03-01' и т.д. вплоть до '2016-12-01') (но функция потом изменится и будет по годам, это просто первичный тест)
Все эти 12 секций разбиваются на 2 группы, 11 (page compression) в FG1 и 12ая (row compression) в FG2 (в каждой по 1 файлу).
На таблице выровненый класт индекс по date и id. Статистика свежая. Строк 200 000 в FG1 и 1 в FG2.
Делаю запрос вида select * from table where date = '20161212'? выводит одну запись, но если посмотреть statistics io то число просмторов 12, число лог. чтений 13, в плане фактическое кол-во секций 12.
Делаем FG1 offline, повторяем запрос, выводит ошибку и ничего не показывает.
Вопрос, почему?
Насколько я знаю пока мы не обращаемя к данным в тех 11 секциях он должен туда лезть, но все ровно упорно это делает.
Делал примерно как описано тут
18 май 17, 09:10    [20491723]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleksrov,

OPTION (RECOMPILE)
18 май 17, 09:11    [20491726]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
aleksrov,

Реальный план выполнения приложите
18 май 17, 09:14    [20491732]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
aleksrov
Member

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

И как это должно было помочь?
Сделал, естественно ничего не поменялось.
18 май 17, 09:14    [20491733]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleksrov
TaPaK,

И как это должно было помочь?
Сделал, естественно ничего не поменялось.

давайте план, раз не смогли в запрос дописать
18 май 17, 09:17    [20491742]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Через $partition кстати все работает.

К сообщению приложен файл (SQL_Plan.sqlplan - 11Kb) cкачать
18 май 17, 09:23    [20491765]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleksrov,

какой тип даты в таблице?
попробуйте либо CAST либо переменную с тем же типом
18 май 17, 10:40    [20492088]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
aleksrov,

Покажите схему функции секционирования и таблицы.
18 май 17, 10:40    [20492089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
С Cast тоже самое.

create partition function pfOrders14(datetime2(0)) 
as range right for values 
('2014-02-01', '2014-03-01','2014-04-01','2014-05-01','2014-06-01','2014-07-01','2014-08-01','2014-09-01','2014-10-01','2014-11-01','2014-12-01'); 

create partition scheme psOrders14 
as partition pfOrders14 
to (FG14,FG14,FG14,FG14,FG14,FG14,FG14,FG14,FG14,FG14,FG14,OperFG); 

create table dbo.OrdersPT 
( 
OrderId int not null, 
OrderDate datetime2(0) not null, 
OrderNum varchar(32) not null, 
OrderTotal money not null, 
CustomerId int not null, 
); 
create unique clustered index IDX_OrdersPT_OrderDate_OrderId 
on dbo.OrdersPT(OrderDate, OrderId) 
with 
( 
data_compression = page on partitions(1 to 11), 
data_compression = row on partitions(12) 
) 
on psOrders14(OrderDate); 
create nonclustered index IDX_OrdersPT_CustomerId 
on dbo.OrdersPT(CustomerId) 
with 
( 
data_compression = page on partitions(1 to 11), 
data_compression = row on partitions(12) 
) 
on psOrders14(OrderDate);
18 май 17, 11:03    [20492198]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
aleksrov
С Cast тоже самое.
Вообще-то, для datetime2 именно cast и должен был помочь...
18 май 17, 11:22    [20492278]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
aleksrov
С Cast тоже самое.
Вообще-то, для datetime2 именно cast и должен был помочь...

подозреваю что каст кривовато написал
CAST('2015-02-02' as datetime2(0))

и в тему Partitions cannot be eliminated when there is a potential for data loss in the comparison.
http://sqlblog.com/blogs/paul_white/archive/2012/09/12/why-doesn-t-partition-elimination-work.aspx
18 май 17, 11:24    [20492287]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
aleksrov
Member

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

Да, все верно. Спасибо за ссылку, не знал.
18 май 17, 11:29    [20492307]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Ничего не напрягает?
WHERE [date] = '20161212'
 range right for values ('2016-02-01' ... )
18 май 17, 11:44    [20492369]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Руслан Дамирович,

А должно?
18 май 17, 11:56    [20492427]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
aleksrov
Руслан Дамирович,
А должно?

Да у вас пукан должен от такого подгорать. Неканоничная ISO записьдата ведет к проблема большим в будущем.
18 май 17, 12:11    [20492472]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
Руслан Дамирович,

это сам сервер так скриптует.
18 май 17, 12:57    [20492608]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7407
автор
select * from table where date = '20161212'


Заставляйте себя писать явные преобразования типов в запросе при упоминания констант, в том числе и чисел. Не доверяйте серверу :)
18 май 17, 13:00    [20492626]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
o-o
Guest
Руслан Дамирович
aleksrov
Руслан Дамирович,
А должно?

Да у вас пукан должен от такого подгорать. Неканоничная ISO записьдата ведет к проблема большим в будущем.

пример не приведете,
когда бы это литерал вида yyyy-mm-dd интерпретировался бы неправильно
для типа данных datetime2/datetime?
18 май 17, 14:02    [20492957]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
o-o
пример не приведете,
когда бы это литерал вида yyyy-mm-dd интерпретировался бы неправильно
для типа данных datetime2/datetime?

SET DATEFORMAT dmy
SELECT
  CONVERT( VARCHAR, CONVERT( DATETIME, '2016-02-01' ) ),
  CONVERT( VARCHAR, CONVERT( DATETIME, '20160201' ) )
;
SET DATEFORMAT mdy
SELECT
  CONVERT( VARCHAR, CONVERT( DATETIME, '2016-02-01' ) ),
  CONVERT( VARCHAR, CONVERT( DATETIME, '20160201' ) )
;
18 май 17, 14:16    [20493011]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
o-o
Guest
Руслан Дамирович,

Так не вижу datetime2, как у ТС.
Ну и да, опечаточка у меня, datetime2 /date
18 май 17, 14:55    [20493129]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием = value читает все секции.  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
o-o
Руслан Дамирович,
Так не вижу datetime2, как у ТС.
Ну и да, опечаточка у меня, datetime2 /date

Не знал. Теперь буду знать. Спасибо!
Ну, раз там всегда DATETIME2, тогда нет повода подгорать...
18 май 17, 15:43    [20493289]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить