Добрый День,

Коллеги,

Сможет кто пояснить для чего на одной таблице dbo.Activity существуют идентичные индексы 'I7Nk67FkcZJTOtRCb5pRNRHffI' и 'Iqf5Ij9PskG09b4gVMq7XcSq04g'? Вряд ли это ускоряет работу, но данный функционал сразу присутствует в базовой версии продукта! Таких индексов в базе около 50, причем один создан системой, другой в базе данных. Следовательно, выходит, что работает только один индекс при поиске, но при вставке уже будет две дополнительных обработки этих индексов. И это уже существенно влияет на скорость приложения во время добавления записей, и это присуще объектам, где много записей(Продукт(товар), звонки, контакты, активности).

Изображение удалено.

Изображение удалено.

Нравится

1 комментарий

Добрый день.



Данный индекс не мешает работе базового функционала приложений.

Вы можете удалить данный индекс:

drop index I7Nk67FkcZJTOtRCb5pRNRHffI on Activity



Однако обращаю внимание, что удалять базовые значения из бд не рекомендуется. 

Показать все комментарии
Здравствуйте, настраиваю глобальный поиск, хочу удалить индексы:
http://айпи:81/sites/sales/search
Пробовал вот так:
curl -XDELETE http://айпи:81/sites/sales/search-*/
Но потом при curl -v -X POST -d '{"templateName": "default.json"}' -H "Content-Type: application/json" http://айпи:81/sites/sales/search
Как правильно удалить ранее созданные индексы?
Выдает ошибку:
{"code":500,"status":"error","message":"System.Exception: Could not check index 'uoospgg4cm6abfpjuotlbfcrco0pq5esrxuexjqw6vndxtx4gvnpjtljeneotytt' exists. ---> System.Exception: Invalid NEST response built from a unsuccessful low level call on HEAD: /uoospgg4cm6abfpjuotlbfcrco0pq5esrxuexjqw6vndxtx4gvnpjtljeneotytt\n# Audit trail of this API call:\n - [1] BadRequest: Node: http://elasticsearch-public-ip:9200/ Took: 00:00:10.0127688\n# OriginalException: System.Net.Http.HttpRequestException: Resource temporarily unavailable ---> System.Net.Sockets.SocketException: Resource temporarily unavailable\n   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)\n   --- End of inner exception stack trace ---\n   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask)\n   at System.Threading.Tasks.ValueTask`1.get_Result()\n   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)\n   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)\n   at Elasticsearch.Net.HttpConnection.Request[TReturn](RequestData requestData) in C:\\Users\\russc\\source\\git\\elasticsearch-net-5.x\\src\\Elasticsearch.Net\\Connection\\HttpConnection-CoreFx.cs:line 78\n# Request:\r\n\n# Response:\r\n\n\n   --- End of inner exception stack trace ---\n   at GlobalSearch.WebApp.Services.SearchManagement.SearchService.CheckIndexExist(String indexName) in /src/Src/GlobalSearch.WebApp/Services/SearchManagement/SearchService.cs:line 95\n   at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.DeleteSearchRequestHandler.DeleteSearchBySite(Site site) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/DeleteSearchRequestHandler.cs:line 44\n   at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.SearchManagement.DeleteSearchRequestHandler.InternalHandle(DeleteSearchRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/SearchManagement/DeleteSearchRequestHandler.cs:line 70\n   at GlobalSearch.WebApp.ServiceModel.Requests.Handlers.BaseRequestHandler`1.Handle(TRequest request) in /src/Src/GlobalSearch.WebApp/ServiceModel/Requests.Handlers/BaseRequestHandler.cs:line 38"}

Нравится

1 комментарий

Евгений, добрый день! 



Вам следует обратить внимание на причину, по которой в запросе не удаётся определить существование индекса, а именно на запись:

 

Invalid NEST response built from a unsuccessful low level call on HEAD

Попробуйте поискать информацию по данному фрагменту.

Показать все комментарии

Добрый день!

Есть желание увеличить быстродействие системы. Выполняю запрос по поиску полей таблиц к которым существует много запросов, но на них нет индексов. И одна из таблиц выпадает AccountCommunication [Средства связи Юр. лиц]. Сам объект унаследовал структуру от объекта [Базовое средство связи]. Так вот получается, что в базовом объекте нет индексов на основные поля для поиска, такие как Id,[Position]. Есть какая-то причина отсутствия индексов на этих полях или их можно создать?

Нравится

6 комментариев

И как все-таки будет правильно, добавить индекс на базовый объект или в тот который унаследовал? Или при добавление в унаследованный объект в базовый он добавится автоматически?

Анастасия, с точки зрения БД родительский и дочерний объекты — это 2 разных таблицы. Следовательно, средствами Management Studio можно добавлять в дочернюю таблицу индексы, если в ходе анализа выяснилось, что это может увеличить производительность.
Сомневаюсь, что на Id стоит добавлять индекс, ведь это и так первичный ключ. А на второе — можно попробовать.

"Зверев Александр" написал:

Анастасия, с точки зрения БД родительский и дочерний объекты — это 2 разных таблицы. Следовательно, средствами Management Studio можно добавлять в дочернюю таблицу индексы, если в ходе анализа выяснилось, что это может увеличить производительность.

Сомневаюсь, что на Id стоит добавлять индекс, ведь это и так первичный ключ. А на второе — можно попробовать.


Вот и мне не понятно... Индекс уникальный некластеризованый в БД на Id стоит, а приложение показывает, чтот у этого объкта на этом поле нет индекса.

Смотрите на уровне БД, там вернее. Колонка Id в любой таблице bpm'online — первичный ключ. Возможно, поэтому её явно и не показывает как индекс.

"Астапеева Анастасия" написал:Есть желание увеличить быстродействие системы.

Желание или необходимость? :smile:

"Астапеева Анастасия" написал:Так вот получается, что в базовом объекте нет индексов на основные поля для поиска, такие как Id,[Position].

не думаю что поле Position - подходящая кандидатура для построения индекса (если я правильно понимаю, это порядковый номер в рамках 1 контрагента?)... кардинальность большая. Индексы хорошо строить по колонкам с практически уникальными значениями (опять же, если СУБД потом будет их использовать).

По-идее индекса по Id и AccountID должно быть вполне достаточно.

Индексов побольше налепить конечно никто не мешает, но будет ли достигнута цель - увеличить быстродействие... а то можно и наоборот сделать, индексы это не бесплатное приложение к таблице.

В общем, есть впечатление что не тут копаете, Анастасия... Могу посоветовать книгу, правда на английском... но может и русские версии уже есть: SQL Server 2008 Query Performance Tuning Distilled (2009)
версия СУБД может и немного старовата, но для CRM систем более чем сгодится.

"komgbu" написал:

Желание или необходимость? :smile:

В общем, есть впечатление что не тут копаете, Анастасия... Могу посоветовать книгу, правда на английском... но может и русские версии уже есть: SQL Server 2008 Query Performance Tuning Distilled (2009)

версия СУБД может и немного старовата, но для CRM систем более чем сгодится.

Именно желание. Спасибо большое за книгу и совет.

Показать все комментарии

В случае если Вы столкнулись с проблемой анализа объема таблицы в базе SQL, а так же Вам нужно узнать, сколько в ней записей и какой объём занимают индексы, - Вам необходимо выполнить скрипт из вложения и проанализировать результат в полученной таблице.

Нравится

0 комментариев
Показать все комментарии

Добрый день! После обновления BPMOnline до версии 7.4.0.2924 при публикации объекта "Активности" появляется ошибка:

Ошибка сохранения: Ошибка операции. Для индекса "ID0d3c4WXcWBjpNl3fs9eZtd0" длина элемента индекса, равная 998 байт, превышает максимальную длину, равную 900 байт.
Внимание! Максимальная длина ключа - 900 байт. Индекс "ID0d3c4WXcWBjpNl3fs9eZtd0" имеет максимальную длину 1000 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Выполнение данной инструкции было прервано.

Есть ли возможность увеличить max допустимую длину ключа?

Нравится

21 комментарий

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу.

Здравствуйте, Игорь.
Попробуйте удалить данный индекс, он будет пересоздан при публикации объекта.

 
DROP INDEX ID0d3c4WXcWBjpNl3fs9eZtd0 ON Activity 

Если данная рекомендация не решит проблему, просьба более подробно описать изменения сделанные в объекте "Активность", в версии 7.4.0.2924 воспроизвести данную ошибку не удалось.

Дело в том, что это индекса и так не существует.

Ещё при выполнении обновления в лог WorkspaceConsole выпала такая ошибка:

Ошибка Activity: При выполнении действия обновления структуры схемы произошла ошибка "Ошибка операции. Для индекса "IkhyThNAkKdvUI2OBpbFwvp6Q" длина элемента индекса, равная 998 байт, превышает максимальную длину, равную 900 байт.
Внимание! Максимальная длина ключа - 900 байт. Индекс "IkhyThNAkKdvUI2OBpbFwvp6Q" имеет максимальную длину 1000 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Выполнение данной инструкции было прервано.", текст Sql сценария: "CREATE INDEX [IkhyThNAkKdvUI2OBpbFwvp6Q] ON [dbo].[Activity]([Title] ASC)"
--- Exception info ---
	Error: При выполнении действия обновления структуры схемы произошла ошибка "Ошибка операции. Для индекса "IkhyThNAkKdvUI2OBpbFwvp6Q" длина элемента индекса, равная 998 байт, превышает максимальную длину, равную 900 байт.
Внимание! Максимальная длина ключа - 900 байт. Индекс "IkhyThNAkKdvUI2OBpbFwvp6Q" имеет максимальную длину 1000 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Выполнение данной инструкции было прервано.", текст Sql сценария: "CREATE INDEX [IkhyThNAkKdvUI2OBpbFwvp6Q] ON [dbo].[Activity]([Title] ASC)"
	InnerException: Ошибка операции. Для индекса "IkhyThNAkKdvUI2OBpbFwvp6Q" длина элемента индекса, равная 998 байт, превышает максимальную длину, равную 900 байт.
Внимание! Максимальная длина ключа - 900 байт. Индекс "IkhyThNAkKdvUI2OBpbFwvp6Q" имеет максимальную длину 1000 байт. Для некоторых комбинаций больших значений операции вставки или обновления не смогут быть выполнены.
Выполнение данной инструкции было прервано.
------

Индекс ссылается на то же поле "Title".

Ещё вопрос: Каким образом отключить индексирование поля Title?

Настройки поля Title не менялись. В объекте "Activity" созданы три поля с префиксом "Usr". Но ошибка указывает именно на индекс поля Title , которого в БД не существует.

Выполнил следующий Sql-скрипт на своей базе и на чистой БД версии 7.4.0.2924

select max_length from sys.columns
where 
object_id = OBJECT_ID(N'Activity')
AND
name = 'Title'

результат один и тот же

max_length
1000

Может в этом дело?

Игорь, Вы пишите что запрос выполняли на чистой базе, можете воспроизвести ошибку на чистой БД?
Просьба предоставить или кейс воспроизведения ошибки, или схему объекта Активность на которой воспроизводится ошибка.

Пока могу предоставить для анализа md-файл объекта "Activity" из базы, на которую устанавливались обновления и есть эта ошибка. activity.rar

При обновлении чистой BPMOnline 7.4.0.2458_Omnichannel до версии 7.4.0.2924 ошибка не воспроизводится.
В проблемной БД есть активности, где значения поля "Заголовок"(Title) длиной 500 символам. При работе с этими активностями также возникает эта ошибка.

Игорь, проимпортировав Ваш объект на демо стенд 7.4.0.2924-Omnichannel-Softkey-RUS проблему воспроизвести не удалось, объект опубликовался успешно. Просьба уточнить Вы не изменяли тип данных столбцов объекта на тип данных большей длины. Это могло привести к данной ошибке согласно информации http://technet.microsoft.com/ru-ru/library/ms163207(v=sql.105).aspx

Нет. Длина столбца "Title" так и осталась 500 символов. Что самое интересное -это то, что:
1. Указанного индекса нет в БД.
2. Эта ошибка вылезла при обновлении BPMOnline до версии 7.4.0.2924. Вот лог:log_20141203_13094874.txt

Вот такая ошибка при публикации объекта "Активности":

Здравствуйте, Игорь.
Попробуйте удалить данный индекс, он будет пересоздан при публикации объекта.

Спасибо. помогло.

Добрый день,
Возникла аналогичная ошибка, индекса в базе нет, удалить через DROP INDEX не получается.
Объект сохраняется в метаданных, но при публикации выдает ошибку
1

Здравствуйте, Олег!

Попробуйте вывести список всех индексов в базе, чтобы удостовериться, что такого индекса действительно нету:

SELECT 
     TableName = t.name,
     IndexName = ind.name,
     IndexId = ind.index_id,
     ColumnId = ic.index_column_id,
     ColumnName = col.name,
     ind.*,
     ic.*,
     col.* 
FROM 
     sys.indexes ind 
INNER JOIN 
     sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id 
INNER JOIN 
     sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id 
INNER JOIN 
     sys.tables t ON ind.object_id = t.object_id 
WHERE 
     ind.is_primary_key = 0 
     AND ind.is_unique = 0 
     AND ind.is_unique_constraint = 0 
     AND t.is_ms_shipped = 0 
ORDER BY 
     t.name, ind.name, ind.index_id, ic.index_column_id 

Если нету, попробуйте сгенерировать метаданные для объекта и сгенерировать исходный код, после чего проверить повторно.

Добрый день, Андрей,
Проверил индекса действительно нет, сгенерировал метаданные для объекта и исходный код, но эффект тот же, индекс так и не появился, объект невозможно опубликовать, но он сохраняется, все бы ничего, но при попытке обращаться к новым полям в БП выдает ошибку "Элемент коллекции не существует"

Попробуйте создать индекс для данной таблицы с таким именем, на которое "ругается" при компиляции.

Была похожая ситуация, только с Constraint. Это помогло.

Создал индекс, теперь при публикации возникает следующая ошибка: "Ошибка
Ошибка сохранения: Ошибка операции: индекс или статистика с именем "IGNfQFgKE05l2MANQO3hW70nQsso" уже существует в таблица "dbo.Activity"."

Здравствуйте, Олег.

Напишите, пожалуйста, на support, - со ссылкой на копию базы, - попробуем разобраться.

Показать все комментарии

Ничто не оптимизирует скорость работы базы так, как правильно подобранные индексы (С)

Многим, кто сталкивался с промышленной эксплуатацией баз данных определенных (скажем так, очень больших) размеров, приходилось проводить кропотливый анализ запросов на предмет возможной оптимизации скорости их выполнения.

Как оказалось, сама СУБД MSSQL версии 2005 и выше содержит механизм, грамотное использование которого может очень сильно облегчить работу по поиску некоторых узких мест.

Это sys.dm_db_missing_index_group_stats и связанные с ней функции (подробнее >>)
Данные для них формируются на основании статистики запросов к базе данных, и потому являются довольно хорошей информацией, от которой можно оттолкнуться при оптимизации.

Я не буду приводить тут подробный анализ ее использования, а только приведу запрос, который очень помог мне лично:

SELECT
        [Impact] = (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans),
        [TABLE] = [statement],
        [CreateIndexStatement] = 'CREATE NONCLUSTERED INDEX ix_'
                        + sys.objects.name COLLATE DATABASE_DEFAULT
                        + '_'
                        + REPLACE(REPLACE(REPLACE(ISNULL(mid.equality_columns,'')+ISNULL(mid.inequality_columns,''), '[', ''), ']',''), ', ','_')
                        + ' ON '
                        + [statement]
                        + ' ( ' + IsNull(mid.equality_columns, '')
                        + CASE
                                WHEN mid.inequality_columns IS NULL THEN ''
                                ELSE
                                        (CASE
                                                WHEN mid.equality_columns IS NULL THEN ''
                                                ELSE ','
                                         END)
                                        + mid.inequality_columns
                                END
                        + ' ) '
                        + CASE
                                WHEN mid.included_columns IS NULL THEN ''
                                        ELSE 'INCLUDE (' + mid.included_columns + ')'
                                END
                        + ';',
        mid.equality_columns,
        mid.inequality_columns,
        mid.included_columns
FROM sys.dm_db_missing_index_group_stats AS migs
        INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs.group_handle = mig.index_group_handle
        INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle
        INNER JOIN sys.objects WITH (nolock) ON mid.OBJECT_ID = sys.objects.OBJECT_ID
WHERE   (migs.group_handle IN
                (SELECT TOP (500) group_handle
                FROM sys.dm_db_missing_index_group_stats WITH (nolock)
                ORDER BY (avg_total_user_cost * avg_user_impact) * (user_seeks + user_scans) DESC))
                AND OBJECTPROPERTY(sys.objects.OBJECT_ID, 'isusertable') = 1
ORDER BY [Impact] DESC , [CreateIndexStatement] DESC

Естественно, для выполнения этого запроса нужно обладать правом VIEW SERVER STATE или любым другим правом, включающим в себя VIEW SERVER STATE.
Так же перед использованием желательно обновить статистику БД.

P.S. Еще можно почитать (и даже посмотреть видео) вот тут.

P.S.2 Определяем, как часто "пользуются" индексами:

SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
 I.[NAME] AS [INDEX NAME],
 USER_SEEKS,
 USER_SCANS,
 USER_LOOKUPS,
 USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
 INNER JOIN SYS.INDEXES AS I
 ON I.[OBJECT_ID] = S.[OBJECT_ID]
 AND I.INDEX_ID = S.INDEX_ID

Нравится

Поделиться

0 комментариев
Показать все комментарии

Добрый день!

Как известно, Оракл рекомендует хранить данные и индексы в отдельных таблспейсах. Вопрос: возможно ли задать где-то в Терасофт, чтобы индексы по умолчанию создавались в специально отведённом для этого таблспейсе? Это не прихоть, для правильно спланированной БД это повышает производительность.

Спасибо.

Нравится

4 комментария

Этого сделать нельзя.
Впринципе можно сделать скрипт который бы проверял и переносил индексы.

С переносом индексов в другое табличное пространство всё понятно, хотел просто чтобы они по умолчанию создавались правильно.

Я так понимаю это плата за многоСУБДшность террасофта

Вроде того, но это не страшно, т.к. индексы создаешь не каждый день, да и вообще раскидование тадлиц и индексов в разные табличные пространства - это уже тюнинг производительности БД

Показать все комментарии