2013-06-18 4 views
-1

Возможно ли, что с кешем очистится после выполнения оператора выбора?Sql Server 2008 Clear Выбрать кеш-заявление?

Я попытался с одним из моих sql, что в первый раз я его выполнил, его вернул мне 3,15 минуты и второй раз (смена каких-либо вещей), он вернул мне 2,55 минуты.

Это своего рода утомительно для меня, чтобы проверить фактическую производительность на sql.

Я обнаружил, что на сервере Sql Server 2005 есть кеш на this.

Правильно ли я имею кэш на сервере sql 2008?

ответ

1

Это то, что я делаю для той же цели:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
GO 
DROP TABLE [WHATEVER I NEED TO DROP] 
GO 
TRUNCATE TABLE [WHATEVER I NEED TO EMPTY] 
GO 
UPDATE [WHATEVER HAS TO BE "RESET"] 
GO 
[DO REST OF "RESET ACTIONS" HERE] 
USE [YOUR DATABASE NAME] 
GO

DECLARE @start_time datetime, @end_time datetime, @miliseconds int

DECLARE @ALL_YOUR_VARS -- _YOU'LL_USE_WHILE_YOU_MEASURE /* BECAUSE YOU DON'T WANT TO MEASURE THE TIME SPENT ON TEMP VARS YOU CREATE FOR MEASURING EXEC TIME ONLY */

-- TODO: SET VARS' VALUES HERE, SAME REASON AS ABOVE

SET @start_time = GETDATE()

-- [EXECUTE ALL YOUR STATEMENTS HERE] -- [YOU WANT TO MEASURE]

SET @end_time = GETDATE() SET @miliseconds = DATEDIFF(ms, @start_time, @end_time) SELECT @start_time, @end_time, CAST(@miliseconds AS VARCHAR(max)) + ' ms' GO



EDIT: Чуть не забыл! Вы также можете отбросить все активные подключения к своей БД до начала измерения (не забудьте создать новое соединение после того, как вы выполните код ниже, как фактическое мгновенное окно, из которого вы запускаете запрос, тоже будет отключено !!!)
USE master 
GO

SET NOCOUNT ON DECLARE @DBName varchar(50) DECLARE @spidstr varchar(8000) DECLARE @ConnKilled smallint SET @ConnKilled=0 SET @spidstr = ''

Set @DBName = 'YOURDBNAMEHERE' IF db_id(@DBName) < 4 BEGIN PRINT 'Connections to system databases cannot be killed' RETURN END SELECT @spidstr=coalesce(@spidstr,',')+'kill '+convert(varchar, spid)+ '; ' FROM master..sysprocesses WHERE dbid=db_id(@DBName)

IF LEN(@spidstr) > 0 BEGIN EXEC(@spidstr) SELECT @ConnKilled = COUNT(1) FROM master..sysprocesses WHERE dbid=db_id(@DBName) END

+0

Спасибо за ваш ответ. – Worgon

+0

Я пробовал с кодом DBCC DROPCLEANBUFFERS и DROP FREEPROCCACHE Его возвращает мне ошибку, что «команда DBCC« DROPCLEANBUFFERS »не поддерживается в этой версии SQL Server», моя версия сервера SQL - это SqlServer 2008 R2. Что такое версия? Я попытался найти его на Msdn по этой ссылке http://msdn.microsoft.com/en-us/library/ms187762.aspx, кажется, что версия 2008 года отсутствует. Разве это не поддерживается? – Worgon

+0

@Worgon 2005 также поддерживает его, 2012 год, но не 2008 ... странно ... Попробуйте следующее: DBCC FREESYSTEMCACHE, DBCC FREEPROCCACHE, DBCC FREESESSIONCACHE и DBCC FLUSHPROCINDB (db_name) и дайте мне знать, если они также «не поддерживаются». PS .: 2008 полностью отсутствует в списке MSDN «Другие версии», поскольку 2008 год должен поддерживать все, что поддерживает 2005 год. Очень странно. Теперь я помню, почему я пропустил версию :) –