вторник, 13 октября 2009 г.

Настройка системы для увеличения быстродействия при работе с деревом папок

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

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

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

SET XACT_ABORT ON;

IF OBJECT_ID('dbo.FolderInfo') IS NULL
BEGIN
CREATE TABLE dbo.FolderInfo
(
FolderID uniqueidentifier PRIMARY KEY
,Flags int NULL
)
END

DECLARE @Folders TABLE (Id uniqueidentifier PRIMARY KEY)

-- Select folders from UserProfile card
INSERT @Folders(Id)
SELECT DISTINCT DefaultFolderID
FROM dbo.[dvtable_{C64843C3-484F-45E0-9B8A-900EA91BE54D}] WITH(NOLOCK)
WHERE DefaultFolderID IS NOT NULL;

BEGIN TRAN;

-- Backup old folder flags
WITH UserFoldersTree(FolderID, NestLevel)
AS
(
SELECT
Id
,1
FROM @Folders

UNION ALL

SELECT
RowID
,tPrev.NestLevel + 1
FROM dbo.[dvtable_{FE27631D-EEEA-4E2E-A04C-D4351282FB55}] tFld WITH(NOLOCK)
JOIN UserFoldersTree tPrev ON tPrev.FolderID = tFld.ParentTreeRowID
)
INSERT dbo.FolderInfo
(
FolderID
,Flags
)
SELECT
RowID
,Flags
FROM dbo.[dvtable_{FE27631D-EEEA-4E2E-A04C-D4351282FB55}] tFld WITH(NOLOCK)
LEFT JOIN UserFoldersTree tUserFld ON tUserFld.FolderID = tFld.RowID
WHERE tUserFld.FolderID IS NULL

-- Switch off Unread count
UPDATE tFld
SET Flags = ISNULL(tFld.Flags, 0) | 4 -- NO_UNREAD_COUNT flag
FROM dbo.[dvtable_{FE27631D-EEEA-4E2E-A04C-D4351282FB55}] tFld WITH(TABLOCK)
JOIN dbo.FolderInfo tInfo WITH(NOLOCK) ON tInfo.FolderID = tFld.RowID

IF @@ERROR <> 0
ROLLBACK TRAN;

COMMIT TRAN;

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

  1. А у меня что-то не получается запустить, ругается на строку WITH UserFoldersTree(FolderID, NestLevel), пишет Incorrect syntax near the keyword 'WITH'

    UserFoldersTree - это что за сущность? Поясните, пожалуйста.

    ОтветитьУдалить
  2. Повторный запуск данной процедуры не проходит из-за ошибки неуникальности добавляемых данных. После создания таблицы dbo.FolderInfo нужно добавить DELETE FROM dbo.FolderInfo;

    ОтветитьУдалить
  3. А обратно как вернуть подсветку? Какое значение Flags нужно выставить?

    ОтветитьУдалить