Используйте временную таблицу или табличную переменную для хранимой процедуры, которая возвращает более 100 строк - PullRequest
1 голос
/ 18 февраля 2011

Хорошо, в основном я создаю хранимую процедуру, которая будет возвращать данные для нашего поиска мощности Coldfusion.

Я создал представление для хранения данных из нескольких таблиц с одинаковыми именами столбцов, конечно.

Затем в своей хранимой процедуре я создал простую временную таблицу, подобную этой ...

    CREATE TABLE #TempSearchResults
(
    search_id int identity,
    id integer,
    type varchar(20),
    title varchar(50),
    url varchar(250),
    rank integer
)

Затем я добавил к нему индекс, возможно, из-за своего ограниченного опыта как способа повышения производительности.

CREATE UNIQUE INDEX idx on #TempSearchResults (search_id)

Затем я сделал свой выбор в массивном запросе

insert into #TempSearchResults
select id, type, title, url, rank + 1200 as rank
from my view
where company_id = @company_id
and title like @keyword
union all
select id, type, title, url, rank + 1100 as rank
from my view
where company_id = @company_id
and title like @keyword
and description like @keyword

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

И в конце это делает ...

select id, type, title, url, rank
from #TempSearchResults
group by id, type, title, url, rank
order by rank desc, title asc;

Теперь, когда я проверяю эту хранимую процедуру в Coldfusion, кажется, что это занимает очень много времени.

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

Или, возможно, мне следует перейти к табличным переменным ...

Но я только что читал ... Temp Tables VS Table Variables

Забавно, эта хранимая процедура, кажется, медленнее, чем я, выполняющий запрос напрямую через coldfusion, что я предпочитаю не делать.

Я надеюсь на оптимальную производительность ....

Спасибо ...

Ниже приведена базовая логика или код для представления, которое я использую.

select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table a
union
select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table b
union
select some field as id, some field as title, some field as description, 'url link' as url, 1 as rank
from table c

И т.д., как это. Я не могу раскрыть точные детали, так как это было бы нарушением безопасности. Я надеюсь, что это проясняет ситуацию.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2011

Я не вижу необходимости использовать временную таблицу или табличную переменную вообще.Вы можете просто написать

select id, type, title, url, rank
from (
    select id, type, title, url, rank + 1200 as rank 
    from my view 
    where company_id = @company_id and title like @keyword 

    union all 

    select id, type, title, url, rank + 1100 as rank 
    from my view 
    where company_id = @company_id and title like @keyword and description like @keyword
) as t
group by id, type, title, url, rank
order by rank desc, title asc;

Редактировать:

Замена UNION ALL на UNION, это можно упростить до

select id, type, title, url, rank + 1200 as rank 
from my view 
where company_id = @company_id and title like @keyword 

union 

select id, type, title, url, rank + 1100 as rank 
from my view 
where company_id = @company_id and title like @keyword and description like @keyword

order by rank desc, title asc;
0 голосов
/ 18 июля 2012

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

...