2013-11-21 3 views
1

Я работаю с инструментом, который показывает некоторые подсчеты из таблицы в пользовательском интерфейсе. Чтобы получить эти числа, один запрос выполняется каждые 5 секунд. Я не могу внести какие-либо структурные изменения в инструмент, но я могу изменить запрос, чтобы получить подсчеты.Есть ли эквивалент кэш результатов Microsoft SQL?

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

Инструмент может работать как на Oracle, так и на MSSQL. В Oracle я смог значительно улучшить скорость запроса, используя кэш результатов запроса (добавлен/* + RESULT_CACHE */подсказка к запросу). Поскольку результат запроса изменяется только время от времени, кеширование - это полезное решение в этом конкретном случае. Время выполнения переходит к чему-то вроде 1ms вместо 5 секунд, которые были раньше.

Мне было интересно, есть ли эквивалент в Microsoft SQL.

ответ

0

SQL Server Management Studio имеет возможность отображать план выполнения запроса, который показывает процент времени, затраченного на каждую часть запроса. В меню «Запрос» исследуйте пункты меню «Отобразить оценочный план выполнения» и «Включить фактический план выполнения».

Там также кэш плана запроса SQL Server:

-- First, clear the cache. 
-- WARNING: Do not execute this statement anywhere near production! 
DBCC FREEPROCCACHE 

-- Look at what executable plans are in cache 
SELECT sc.* 
FROM master.dbo.syscacheobjects AS sc 
WHERE sc.cacheobjtype = 'Executable Plan' 

-- Execute the following statement 
SELECT t.* 
FROM pubs.dbo.titles AS t 
WHERE t.price = 19.99 

-- Look at what executable plans are in cache and you'll 
-- find that there's a plan for a NUMERIC(4,2) 
SELECT sc.* 
FROM master.dbo.syscacheobjects AS sc 
WHERE sc.cacheobjtype = 'Executable Plan' 

-- If you execute the EXACT same statement with a 4,2 
-- then you will get THAT plan. But if you execute with a 5,2 
-- then you'll get a new plan. Try this: 
SELECT t.* 
FROM pubs.dbo.titles AS t 
WHERE price = 199.99 

-- Look again at the cached executable plans, and you'll see a NEW one... 
SELECT sc.* 
FROM master.dbo.syscacheobjects AS sc 
WHERE sc.cacheobjtype = 'Executable Plan' 
+1

Спасибо, но я не думаю, что это то, что я искал. Выполняемый запрос удалит один и тот же результат, если скажем 29 из 30 исполнений. Из-за этого было бы неплохо, если бы SQL-сервер мог кэшировать результат запроса, а не план выполнения, как вы можете в oracle. Я бы, однако, был доволен любым улучшением, но запросы на master.dbo.syscacheobjects не дают мне никаких строк вообще. – ErikL

+0

@ ErikL, см. Ответы на этот вопрос SO: http://stackoverflow.com/questions/4095762/can-i-request-sql-server-to-cache-a-certain-result-set – RoadWarrior

Смежные вопросы