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

Откуда: Ростов-на-Дону
Сообщений: 344
Здравствуйте!

Есть таблица секционированная по дате, и в этой же таблице есть поле идентификатор, который формируется из последовательности, на котором нужен уникальный индекс.
Как лучше сделать?

1) оставить индекс как есть несекционированным? (таблица большая)
2) секционировать по блокам как то на глазок

Возможно есть еще какие-то варианты о которых я не знаю, поделитесь пожалуйста.

В теории я могу добавить в него дату, но тогда у меня потеряется смысл - проверка уникальности по полю.
25 мар 16, 10:05    [18976488]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
TaPaK
Member

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

может и секция не нужна... можно через триггер обеспечивать уникальность
25 мар 16, 10:15    [18976565]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Nimua
Здравствуйте!

Есть таблица секционированная по дате, и в этой же таблице есть поле идентификатор, который формируется из последовательности, на котором нужен уникальный индекс.
Как лучше сделать?

1) оставить индекс как есть несекционированным? (таблица большая)
2) секционировать по блокам как то на глазок

Возможно есть еще какие-то варианты о которых я не знаю, поделитесь пожалуйста.

В теории я могу добавить в него дату, но тогда у меня потеряется смысл - проверка уникальности по полю.


Такие вопросы задавать бессмысленно без ответа на другой вопрос: какие запросы вы будут на этой таблице?
25 мар 16, 10:33    [18976670]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
Все запросы включают дату - то есть столбец секционирования..
О, это получается я могу оставить PK несекционированным так как он все равно не используется для поиска. Но он мне будет тормозить вставку в теории? - update и delete на таблице не делается
25 мар 16, 10:36    [18976684]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
TaPaK,

Не очень хочется триггером так как очень активно идут Insert'ы в таблицу
25 мар 16, 10:40    [18976713]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
Nimua
в этой же таблице есть поле идентификатор, который формируется из последовательности, на котором нужен уникальный индекс.
Не выйдет.
Столбец(цы) секционирования должны быть включены в уникальный индекс.
Nimua
Как лучше сделать?
Возможно вот этот способ вам подойдет - 18928685.
Или можете создать индекс на другой схеме секционирования. Но возможность переключать секции все рано потеряете.
25 мар 16, 11:03    [18976801]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
msLex
Member

Откуда:
Сообщений: 8151
Nimua
Здравствуйте!

Есть таблица секционированная по дате, и в этой же таблице есть поле идентификатор, который формируется из последовательности, на котором нужен уникальный индекс.
Как лучше сделать?

1) оставить индекс как есть несекционированным? (таблица большая)
2) секционировать по блокам как то на глазок

Возможно есть еще какие-то варианты о которых я не знаю, поделитесь пожалуйста.

В теории я могу добавить в него дату, но тогда у меня потеряется смысл - проверка уникальности по полю.

А какова цель секционирования таблицы?
25 мар 16, 12:25    [18977288]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
msLex,

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

Цели секционирования:

1. Ускорить чтения/запись
2. Удобно удалять старые данные

на самом деле если Sequence может быть неуникальна только если будет

Alter sequence Restart with
Либо update'ы ключа, то по идее можно совсем отказаться от уникального ключа по этому полю и действительно добавить в него дату.
25 мар 16, 14:53    [18978184]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
Nimua
Member

Откуда: Ростов-на-Дону
Сообщений: 344
invm,

Спасибо, насколько я поняла все свелось к триггеру либо вью. Я подумаю, пока думаю в сторону вообще отказаться от уникального индекса.
25 мар 16, 14:54    [18978194]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
msLex
Member

Откуда:
Сообщений: 8151
Nimua
2. Удобно удалять старые данные

При наличии невыровненых индексов быстрое удаление через switch/truncate невозможно, так что у вас только один выход, поддерживать уникальность через механизмы отличные от индекса

identity, sequence + запрет "кому попало" вставлять данные в таблицу напрямую, вполне должны решить эту проблему


только надо понимать, что при поиске по id количество seek-ов будет равно количеству секций.
25 мар 16, 15:15    [18978317]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
Владислав Колосов
Member

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

при секционировании уникальность гарантируется лишь в пределах секции, не забывайте.
25 мар 16, 15:56    [18978608]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
f070214f
Member

Откуда:
Сообщений: 13
Добрый день!

Поправьте меня, если я что-то пропустил, но почему не рассматривается возможность создания индекса по identity + datetime?
+
use tempdb;

if exists( select * from sys.tables where name = 'test' ) drop table dbo.test;
if exists( select * from sys.partition_schemes where name = 'ps_date' ) drop partition scheme ps_date;
if exists( select * from sys.partition_functions where name = 'pf_date' ) drop partition function pf_date;

create partition function pf_date( date ) as range right for values( '20160101', '20160201', '20160301', '20160401' );
create partition scheme ps_date as partition pf_date all to( 'primary' );

create table dbo.test
  ( a int not null identity( 1, 1 )
  , b date not null )
  on ps_date( b );

alter table dbo.test add constraint pk_test primary key( a ) on ps_date( b );
--Msg 1908, Level 16, State 1, Line 20
--Column 'b' is partitioning column of the index 'pk_test'. Partition columns for a unique index must be a subset of the index key.

alter table dbo.test add constraint pk_test primary key( a, b ) on ps_date( b );
--Command(s) completed successfully.
Да, это на сколько-то утяжелит индекс (в процентном соотношении не на много, я полагаю), зато все цели, озвученные автором будут достигнуты (быстрая вставка + все данные на одной схеме => можно использовать switch/truncate).
28 мар 16, 07:32    [18984862]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
f070214f
Member

Откуда:
Сообщений: 13
Либо наоборот, datetime + identity, мне такой вариант даже больше нравится...
28 мар 16, 07:54    [18984882]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
f070214f
Либо наоборот, datetime + identity, мне такой вариант даже больше нравится...

и как это обеспечит уникальность для

автор
поле идентификатор, который формируется из последовательности

судя по всему же нужна сквозная уникальность без учёта даты
28 мар 16, 09:10    [18984974]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
f070214f
Member

Откуда:
Сообщений: 13
Да, соглашусь, мой вариант не гарантирует уникальности исключительно по ключу. На самом деле, правильные варианты уже озвучивались, как автором, так и участниками обсуждения:
Nimua
на самом деле если Sequence может быть неуникальна только если будет
Alter sequence Restart with
Либо update'ы ключа, то по идее можно совсем отказаться от уникального ключа по этому полю и действительно добавить в него дату.

msLex
identity, sequence + запрет "кому попало" вставлять данные в таблицу напрямую, вполне должны решить эту проблему.

По большому счету, при желании и наличии прав доступа можно сломать что угодно, здесь, пожалуй, в большей степени организационный вопрос. На мой взгляд, перечисленные варианты лучше триггера...
28 мар 16, 09:41    [18985086]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
f070214f
Да, соглашусь, мой вариант не гарантирует уникальности исключительно по ключу. На самом деле, правильные варианты уже озвучивались, как автором, так и участниками обсуждения:
Nimua
на самом деле если Sequence может быть неуникальна только если будет
Alter sequence Restart with
Либо update'ы ключа, то по идее можно совсем отказаться от уникального ключа по этому полю и действительно добавить в него дату.

msLex
identity, sequence + запрет "кому попало" вставлять данные в таблицу напрямую, вполне должны решить эту проблему.

По большому счету, при желании и наличии прав доступа можно сломать что угодно, здесь, пожалуй, в большей степени организационный вопрос. На мой взгляд, перечисленные варианты лучше триггера...


как-то ни о чём: вопрос стоял один, предложенное не решает его. Если ставить вопрос просто о наличии уникального ключа на все секции, то да SEQUENCE, но для начала версия не ниже 2012
28 мар 16, 09:47    [18985108]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
msLex
Member

Откуда:
Сообщений: 8151
TaPaK
Если ставить вопрос просто о наличии уникального ключа на все секции, то да SEQUENCE, но для начала версия не ниже 2012


А чем identity принципиально отличается от SEQUENCE в рамках данной задачи?
28 мар 16, 13:31    [18986104]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
msLex
TaPaK
Если ставить вопрос просто о наличии уникального ключа на все секции, то да SEQUENCE, но для начала версия не ниже 2012


А чем identity принципиально отличается от SEQUENCE в рамках данной задачи?


автор
поле идентификатор, который формируется из последовательности

мммм ну тем что его идентификатор может быть абсолютно не последовательным
28 мар 16, 13:35    [18986117]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
msLex
Member

Откуда:
Сообщений: 8151
TaPaK
msLex
пропущено...


А чем identity принципиально отличается от SEQUENCE в рамках данной задачи?


автор
поле идентификатор, который формируется из последовательности

мммм ну тем что его идентификатор может быть абсолютно не последовательным


я потерял нить ваших рассуждений, вы про identity или SEQUENCE?
28 мар 16, 14:54    [18986668]     Ответить | Цитировать Сообщить модератору
 Re: Секционирование и уникальный индекс не по ключу секционирования  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
msLex
TaPaK
пропущено...


пропущено...

мммм ну тем что его идентификатор может быть абсолютно не последовательным


я потерял нить ваших рассуждений, вы про identity или SEQUENCE?

я про изначальный вопрос...

возможно я не правильно понимаю фразу

автор
поле идентификатор, который формируется из последовательности, на котором нужен уникальный индекс.

последовательность чего? 1234 или abs01022015 abs02022015
28 мар 16, 15:04    [18986735]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить