Хорошо, в основном я создаю хранимую процедуру, которая будет возвращать данные для нашего поиска мощности 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;
Теперь, когда я тестирую эту хранимую процедуру в холодном слиянии, кажется, что это занимает очень много времени.
Итак, я думаю, либо я использую временные таблицы неправильно, либо не полностью для оптимальной производительности.
Или, может быть, мне стоит перейти к табличным переменным ...
Но я как раз читал ... Временные таблицы VS переменные таблицы
Забавно то, что эта хранимая процедура кажется медленнее, чем я, выполняя запрос напрямую через 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 ответа
Я вообще не вижу необходимости использовать временную таблицу или табличную переменную. Ты можешь просто написать
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;
Используйте подсказку with (Nolock)
для таблиц, где бы вы ни выбирали данные; это может улучшить производительность, если ваше приложение допускает грязное чтение.
Похожие вопросы
Новые вопросы
sql-server-2008
Используйте этот тег для вопросов, относящихся к версии Microsoft SQL Server 2008.