Зависание SQL Server после вставки в выбор - PullRequest
2 голосов
/ 03 марта 2010

Спасибо, что взглянули на это.

Проблема связана со следующим SQL-запросом. По сути, он рекурсивно находит все страницы под определенной страницей (главной страницей), а затем применяет категории главной страницы (поиск в xref_pages_categories) ко всем этим страницам.

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

Если я запускаю запрос без строки вставки, результаты возвращаются идеально, как:

3245    490
3249    490
3252    490

Но после размещения вставки перед ней и вставки, запрос для pageid = 3245 просто зависает. Есть идеи?

declare @page int;

set @page=3202;
begin transaction transki;

With FindAllPagesUnderneath(PageID, ParentID) as
(
    select id as PageID, ParentPageId as ParentID
    from pages where id=@page
    union all
    select id as PageID, ParentPageID as ParentID
    from pages p
    inner join FindAllPagesUnderneath mp on
    p.parentpageid=mp.PageID
)

insert into xref_pages_categories (PageID, CategoryID)


    --get records that definitely arent already in xref_pages_categories
select * from
(
    select distinct thegood.*
    from 
        (
        --get all pages under @page attached to new categoryid
        select distinct fap2.PageID, fapo.CategoryID
            from FindAllPagesUnderneath fap2
            cross join  (
                select fap.PageID,xpc.categoryid 
                from xref_pages_categories xpc
                inner join FindAllPagesUnderneath fap
                on fap.PageID=xpc.pageid
                where fap.pageid!=1 and
                fap.pageid!=1332
                and fap.parentid=1332
            ) fapo 
        where fap2.pageid !=@page
        ) thegood
        left outer join xref_pages_categories xpc
        on xpc.pageid = thegood.pageid
        where xpc.pageid is null
) final

1 Ответ

0 голосов
/ 03 марта 2010

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

создать эту таблицу до CTE:

CREATE TABLE #TempResults 
(
PageID         ...
,CategoryID    ...
)

ВСТАВИТЬ в него, а не xref_pages_categories (используя CTE SELECT)

затем поместите это в конец блока кода:

insert into xref_pages_categories (PageID, CategoryID)
    SELECT PageID, CategoryID FROM #TempResults 

Эта ВСТАВКА должна выполняться быстрее и, надеюсь, не блокироваться / блокироваться, как они делают сейчас как часть CTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...