Я пытаюсь создать таблицу, в которой указано, сколько раз страницы в нашей вики ссылаются на определенные макросы.
Я создал временную таблицу с именем @currentpages, которая содержит 55 тыс. Строк и выглядит следующим образом:
DECLARE @currentpages table(
ContentID NUMERIC(19,0) NOT NULL PRIMARY KEY,
PageTitle VARCHAR(255) NULL,
SpaceKey VARCHAR(255) NULL,
OriginalAuthor VARCHAR(255) NULL,
LastChangedBy VARCHAR(255) NULL,
LastChangedDt VARCHAR(10) NULL,
ContentBody TEXT NULL);
и еще одна таблица, которая выглядит так:
DECLARE @usage table(
SpaceKey VARCHAR(255) NOT NULL PRIMARY KEY,
Macro1 NUMERIC(19,0) NULL,
Macro2 NUMERIC(19,0) NULL,
Macro3 NUMERIC(19,0) NULL);
(я упростил вышеизложенное; на самом деле он содержит около 40 столбцов, таких как Macro1, Macro2 и т. Д.) Я пытаюсь получить количество ссылок (в @currentpages) на эти различные макросы. *
Я инициализирую таблицу @usage, создавая строку для каждого возможного значения SpaceKey, обнуляя все счетчики макросов "x":
INSERT INTO @usage (SpaceKey, Macro1, Macro2, Macro3)
SELECT S.spacekey, 0, 0, 0
FROM spaces S
ORDER BY S.spacekey
Затем я запускаю первый из нескольких операторов UPDATE, чтобы идентифицировать каждую ссылку на макрос:
UPDATE @usage
SET U.AdvancedSearch = C.Counter
FROM @usage U
INNER JOIN (SELECT SpaceKey, COUNT(*) AS Counter
FROM @currentpages
WHERE ContentBody LIKE '%{search-%' GROUP BY SpaceKey) C
ON U.SpaceKey = C.SpaceKey
Кажется, это работает нормально, но работает очень долго. Есть ли более эффективный способ сделать то, что я пытаюсь сделать?
Эта база данных находится на SQL Server 2005.
Большое спасибо,
Бетси