Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Есть большая таблица с документами, используется полнотекстовый поиск. Попытался перелить данные в секционированную таблицу (пока в тесте 2 секции и две файловые группы), но столкнулся с проблемой активации полнотекстового поиска - ему непременно нужен уникальный ключ из одного поля. А такое возможно только в пределах файловой группы (primary key использовать нельзя - он получается невольно составным).
Попробовал создать на каждую файловую группу по уникальному индексу, но активировать по двум индексам полнотекстовый поиск нельзя. Что же - полнотекстовый поиск вообще нельзя нормально завести по секционированной таблице?

Где-то в инете встречал такую фразу (но без конкретных примеров):
However, in SQL 2005 you can full-text index views which may reside in different catalogs than the underlying base tables. This provides performance benefits and allows partitioning of tables.


Попытался для каждого полнотекстового индекса указать свою файловую группу:
CREATE UNIQUE INDEX IX_TFileAttr_FileIdFG1 ON TFileAttr (F_FILEID) ON FILEGROUP1
GO
CREATE UNIQUE INDEX IX_TFileAttr_FileIdFG2 ON TFileAttr (F_FILEID) ON FILEGROUP2
GO
CREATE FULLTEXT INDEX ON TFileAttr (F_TEXT TYPE COLUMN F_EXTEN) 
   KEY INDEX IX_TFileAttr_FileIdFG1 ON (TestSection_FullText, FILEGROUP FILEGROUP1)
CREATE FULLTEXT INDEX ON TFileAttr (F_TEXT TYPE COLUMN F_EXTEN) 
   KEY INDEX IX_TFileAttr_FileIdFG2 ON (TestSection_FullText2, FILEGROUP FILEGROUP2)

но вторая команда CREATE FULLTEXT INDEX выдает ошибку:
Server: Msg 7652, Level 16, State 1, Line 138
Полнотекстовый индекс для таблицы или индексированного представления "TFileAttr" уже создан.

Кто сталкивался?
28 окт 10, 13:54    [9692699]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Уточнение: секционирование идет по вспомогательному полю F_STORAGEID, ключевое поле F_FILEID.
28 окт 10, 13:56    [9692724]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
--------------------------------
Guest
А что ты вообще сделал?

Создал два одинаковых индекса?
28 окт 10, 14:15    [9692955]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Guest
А что ты вообще сделал?
Создал два одинаковых индекса?


Таблица разбита на две секции, каждой назначена своя файловая группа - FILEGROUP1 и FILEGROUP2. Один индекс по первой группе, другой по второй. Если попытаться создать уникальный индекс по всей таблице, то в ключ должно дополнительно войти поле секционирования F_STORAGEID. Но составной ключ нельзя использовать для полнотекстового поиска.
28 окт 10, 14:29    [9693086]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
iljy
Member

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

в огороде бузина, а в киеве дядька. Какое это имеет отношение к секционированию? Кто мешает создать дополнительный индекс на поле IDENTITY или UNIQUEIDENTIFIER и использовать его?
28 окт 10, 14:41    [9693249]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
iljy
Member

Откуда:
Сообщений: 8711
Finder
Таблица разбита на две секции, каждой назначена своя файловая группа - FILEGROUP1 и FILEGROUP2. Один индекс по первой группе, другой по второй. Если попытаться создать уникальный индекс по всей таблице, то в ключ должно дополнительно войти поле секционирования F_STORAGEID. Но составной ключ нельзя использовать для полнотекстового поиска.

Хелп чтоли почитайте, а? По какой первой-второй группе?? Один индекс ЦЕЛИКОМ лежит на одной файлгруппе, другой ТАКОЙ ЖЕ - на второй. И любой из них содержит все записи, имеющиеся в таблице.
28 окт 10, 14:44    [9693285]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Поле с идентификатором записи уже есть - это F_FILEID. Собственно по нему раньше полнотекстовый поиск и работал. Но как только мы вводим секционирование (по полю F_STORAGEID) - MSSQL требует, чтобы любой уникальный индекс обязательно был составным и включал в себя поле по которому ведется секционирование - (F_STORAGEID).
В итоге PK пришлось обьявить так:
ALTER TABLE TFileAttr WITH CHECK ADD CONSTRAINT [PK_TFileAttr_FileId] PRIMARY KEY NONCLUSTERED (F_STORAGEID, F_FILEID)  ON [FileAttrPS1] (F_STORAGEID)
и использовать его в полнотекстовом поиске стало невозможно.
29 окт 10, 06:38    [9697140]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
iljy
в огороде бузина, а в киеве дядька. Какое это имеет отношение к секционированию? Кто мешает создать дополнительный индекс на поле IDENTITY или UNIQUEIDENTIFIER и использовать его?

Идея с двумя индексами конечно бредовая, скорее от безысходности :)

Приведу полный текст тестового скрипта - каждый может повторить его у себя (2005-2008, Enterprise or Developer edition). Добавил явный автоинкремент (F_OWNID) - по сути он ничего не меняет...
CREATE DATABASE TestSection
GO
use TestSection
GO
ALTER DATABASE TestSection ADD FILEGROUP FILEGROUP1
GO
ALTER DATABASE TestSection ADD FILEGROUP FILEGROUP2
GO
ALTER DATABASE TestSection ADD FILE (NAME='FILEFG1', FILENAME='D:\MSSQL2005Bases\FILE1FG.ndf') TO FILEGROUP FILEGROUP1
GO
ALTER DATABASE TestSection ADD FILE (NAME='FILEFG2', FILENAME='D:\MSSQL2005Bases\FILE2FG.ndf') TO FILEGROUP FILEGROUP2
GO
CREATE PARTITION FUNCTION [FileAttrPF1] (bigint)
AS RANGE RIGHT FOR VALUES (1);
GO
CREATE PARTITION SCHEME [FileAttrPS1]
AS PARTITION [FileAttrPF1] 
TO ([FILEGROUP1], [FILEGROUP2]);
GO
CREATE TABLE TFileAttr ( 
F_FILEID bigint NOT NULL, 
F_EXTEN nvarchar (256) NULL, 
F_TEXT image NULL, 
F_OWNID bigint IDENTITY (1,1) NOT NULL
) ON [FileAttrPS1] (F_STORAGEID)
GO
ALTER TABLE TFileAttr WITH CHECK ADD CONSTRAINT [PK_TFileAttr_FileId] PRIMARY KEY NONCLUSTERED 
    (F_STORAGEID, F_FILEID)  ON [FileAttrPS1] (F_STORAGEID)
GO
Далее, нам нужен индекс для полнотекстового поиска: уникальный (!) и из одного поля.
Вот так нельзя:
CREATE UNIQUE INDEX IX_TFileAttr_OwnId ON TFileAttr (F_OWNID)
GO
Server: Msg 1908, Level 16, State 1, Line 19
Столбец "F_STORAGEID" является столбцом секционирования индекса "IX_TFileAttr_OwnId". Столбцы секционирования уникального индекса должны быть подмножеством ключа индекса.
А если при создании индекса убрать UNIQUE, то CREATE FULLTEXT INDEX выдает следующую ошибку:
Server: Msg 7653, Level 16, State 2, Line 38
Индекс "IX_TFileAttr_OwnId" недопустим для применения полнотекстового ключа. Ключ полнотекстового поиска 
должен быть уникальным индексом по одиночному столбцу, который не должен: допускать значение null, 
находиться в автономном режиме, быть определенным на недетерминированном или неточном нематериализованном 
вычисляемом столбце, иметь фильтр и превышать в длину 900 байт. Выберите для полнотекстового ключа другой индекс.
Вот таким образом активируем полнотекстовый поиск:
BEGIN
  DECLARE @sCatalog nvarchar(256)
  SET @sCatalog='TestSection_FullText'
    EXEC sp_fulltext_database 'enable'
  IF NOT EXISTS (SELECT ftcatid FROM sysfulltextcatalogs WHERE name = @sCatalog)
    EXEC sp_fulltext_catalog @sCatalog, 'create'
  CREATE FULLTEXT INDEX ON TFileAttr (F_TEXT TYPE COLUMN F_EXTEN) 
    KEY INDEX IX_TFileAttr_OwnId ON (TestSection_FullText)
END
GO

Идеи?
29 окт 10, 07:15    [9697161]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Полнотекстовый индекс не партицируется.

Он один на всю базу.

Вот это просто ДВА разных полноценных индекса (!).
CREATE UNIQUE INDEX IX_TFileAttr_FileIdFG1 ON TFileAttr (F_FILEID) ON FILEGROUP1
GO
CREATE UNIQUE INDEX IX_TFileAttr_FileIdFG2 ON TFileAttr (F_FILEID) ON FILEGROUP2
GO

Я как раз недавно работала над похожей задачей :)
29 окт 10, 07:21    [9697166]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
С таким уникальным индексом вы НЕ построите полнотекстовый
ALTER TABLE TFileAttr WITH CHECK ADD CONSTRAINT [PK_TFileAttr_FileId] PRIMARY KEY NONCLUSTERED 
    (F_STORAGEID, F_FILEID)  ON [FileAttrPS1] (F_STORAGEID)
29 окт 10, 07:22    [9697169]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Забыл поле секционирования для примера (F_STORAGEID)
CREATE TABLE TFileAttr ( 
F_FILEID bigint NOT NULL, 
F_EXTEN nvarchar (256) NULL, 
F_TEXT image NULL, 
F_STORAGEID bigint NOT NULL DEFAULT 0,
F_OWNID bigint IDENTITY (1,1) NOT NULL
) ON [FileAttrPS1] (F_STORAGEID)

Вопрос остается открытым: как создать полнотекстовый поиск по секционированной таблице, когда MSSSQL требует уникальный индекс, причем по одному полю?
29 окт 10, 07:23    [9697171]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
To Кудряшка: PK_TFileAttr_FileId можно вообще не создавать. Просто заремировать эту строку в тесте - увы, это никак не влияет...
29 окт 10, 07:25    [9697174]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Finder
Вопрос остается открытым: как создать полнотекстовый поиск по секционированной таблице, когда MSSSQL требует уникальный индекс, причем по одному полю?


Уникальный индекс по партицированной таблице НЕ ОБЯЗАТЕЛЬНО должен быть партицирован.

В Вашем случае выхода два:
1. Партицировать по уникальному ключу :)
2. Просто создать уникальный индекс не партицированный и повесить на него полнотекстовый индекс.
29 окт 10, 07:28    [9697179]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
F_STORAGEID я так понимаю неуникальное?
29 окт 10, 07:33    [9697182]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Кудряшка
F_STORAGEID я так понимаю неуникальное?

Это просто метка, позволяющая поместить запись в определенную секцию (и соответственно - в заданную файловую группу). В самом просто случае - перенести документ из "активной" секции в "архив"
29 окт 10, 07:38    [9697186]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
ALTER TABLE TFileAttr WITH CHECK ADD CONSTRAINT [PK_TFileAttr_FileId] PRIMARY KEY NONCLUSTERED 
    (F_FILEID)  ON [PRIMARY]
GO

И вешайте себе спокойно Ваш FTI.

  CREATE FULLTEXT INDEX ON TFileAttr (F_TEXT TYPE COLUMN F_EXTEN) 
    KEY INDEX PK_TFileAttr_FileId ON [SOME_FILEGROUP]
29 окт 10, 07:39    [9697187]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Кудряшка
В Вашем случае выхода два:
1. Партицировать по уникальному ключу :)
2. Просто создать уникальный индекс не партицированный и повесить на него полнотекстовый индекс.

F_FILEID и F_OWNID - оба являются уникальными полями. Можно пример? Я вроде бы выше уже перебрал все возможные варианты...
29 окт 10, 07:42    [9697190]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Finder
Кудряшка
F_STORAGEID я так понимаю неуникальное?

Это просто метка, позволяющая поместить запись в определенную секцию (и соответственно - в заданную файловую группу). В самом просто случае - перенести документ из "активной" секции в "архив"


Я так и думала. К сожалению, партицирование требует присутствиюя partition_key ЯВНО во всех партицированных уникальных индексах, в неуникальные partition_key добавляется автоматом на листовой уровень... Т.о. partition_key поле присутствует во всех партицированных индексах, т.к. это есть необходимо.

А как иначе SQL будет их партицировать-то и разносить по файлам? Нужно это поле. Тут все ясно.

Для FTI, к сожалению нужен уникальный индекс из 1 поля. Т.о. если это поле не является partition_key - то ой. Этот индекс остается непартицированым. При этом вся таблица и прочие индексы можно партицировать.

Если Вы захотите сделать switch и FTI и его уникальный индекс придется грохнуть.
29 окт 10, 07:48    [9697195]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
To Кудряшка: Спасибо! Заработало. Самое забавное что пытался сделать почти так же, но не указывал файловую группу, при этом MSSQL автоматом пытался поместить индекс в FILEGROUP1 и выдавал ругань:
ALTER TABLE TFileAttr WITH CHECK ADD CONSTRAINT [PK_TFileAttr_FileId] PRIMARY KEY NONCLUSTERED (F_FILEID)  
GO
Server: Msg 1908, Level 16, State 1, Line 3
Столбец "F_STORAGEID" является столбцом секционирования индекса "PK_TFileAttr_FileId". Столбцы секционирования уникального индекса должны быть подмножеством ключа индекса.
То что надо было всего лишь указать ON [PRIMARY] - я не догадался...
29 окт 10, 07:49    [9697196]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Finder
Кудряшка
В Вашем случае выхода два:
1. Партицировать по уникальному ключу :)
2. Просто создать уникальный индекс не партицированный и повесить на него полнотекстовый индекс.

F_FILEID и F_OWNID - оба являются уникальными полями. Можно пример? Я вроде бы выше уже перебрал все возможные варианты...


1. Надо либо по одному из них партицировать. Т.е не по F_STORAGEID, а по F_FILEID или F_OWNID - как я понимаю это не совсем подходит под Вашу задачу. Т.о. отпадает.
2. Либо смотри пример, кторый я выше привела. С непартицированным уникальным индексом ON [PRIMARY] (или можно другую фг указать)
29 окт 10, 07:51    [9697199]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Да, именно ON [PRIMARY] позволяет в данном случае создать нормальный индекс из одного поля. Еще раз спасибо за совет. :)
29 окт 10, 07:56    [9697208]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Finder
To Кудряшка: Спасибо! Заработало. Самое забавное что пытался сделать почти так же, но не указывал файловую группу, при этом MSSQL автоматом пытался поместить индекс в FILEGROUP1 и выдавал ругань


Скорее всего он пытался индекс создать ON [FileAttrPS1].

Вот такая кманда
CREATE UNIQUE INDEX IX_TFileAttr_FileIdFG1 ON TFileAttr (F_FILEID) ON FILEGROUP1
GO

тоже бы сработала. Просто надо не забывать, что это просто непартицированный индекс сидящий в этой ФГ.
Ну и потом повесить FTI на этот индекс тоже бы удалось.
Ваша ошибка в самом первом сообщении только лишь в попытке создать 2 полнотекстовый индека :)
29 окт 10, 08:16    [9697245]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
Finder
Member

Откуда:
Сообщений: 320
Да, это я понял, ступил :)
Есть еще вопросы:

1) Как себя поведет кластерный индекс если таблицу я перевел на секционирование? До перевода на секционирования он прекрасно работал (по совершенно другому полю - F_OBJID) - не замедлятся ли запросы? По идее, должна замедлится операция вставки/апдейта записей т.к. распределение записей должно идти в соответствии с кластерным индексом, но при этом еще и учитывать дробление на секции...
CREATE CLUSTERED INDEX IX_TFileAttr_ObjId ON TFileAttr (F_OBJID) ON [PRIMARY]

2) Может быть, стоит его сделать секционированным (фактически добавить F_STORAGEID)? С другой стороны в запросах F_STORAGEID нигде не используется...
29 окт 10, 09:53    [9697698]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
partizanin
Member

Откуда:
Сообщений: 12
Доброго времени суток. Столкнулся с похожей проблемой: наличие секционированных данных и желание построить FTI. После прочтения данной статьи и немного пошаманив, имеем две таблицы: одна суточного хранения, вторая долговременного. обе секционированы и обновление данных осуществлялось путем обмена секций, дабы не было мучительно больно. добился, что по полю секционирования можно построить уникальный индекс, на основе которого можно развернуть FTI. НО. при после всех преобразований switch перестал работать ссылаясь на наличие FTI у одной/двух таблиц. Как это победить? делать индексированный вид и на нем разворачивать FTI? Поделитесь опытом, заранее спс
26 июн 13, 19:55    [14488725]     Ответить | Цитировать Сообщить модератору
 Re: Полнот.поиск по секционированной таблице? Как???  [new]
AnyKey45
Member

Откуда: Ekaterinburg-Moscow-EU
Сообщений: 219
[quot Кудряшка]
Finder
пропущено...

Если Вы захотите сделать switch и FTI и его уникальный индекс придется грохнуть.
27 июн 13, 08:45    [14489766]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить