Как увидеть, что на самом деле происходит при выполнении запроса? - PullRequest
1 голос
/ 17 июля 2011

В SQL Server 2008 я хотел бы изучить, что на самом деле происходит за кулисами при выполнении запроса.Могу ли я как-нибудь увидеть следующее?

  1. Количество (и, может быть, даже содержимое) записей журнала, «произведенных» запросом.
  2. Когда содержимое журналафактически применяется к реальным структурам данных.Например:
    1. когда новые строки фактически добавляются в структуру индекса (кластеризации)?
    2. и подразумевает ли обновление / вставка реорганизацию B-дерева (и если да, то насколькочасть этого B-дерева (сколько страниц) были затронуты в этом)?Хм, может быть, я должен был опубликовать отдельный вопрос по этому поводу ...
  3. Количество пропусков / попаданий в буфер для каждой доступной таблицы.
  4. Содержание буфера (какие или сколько страниц из таблицы в данный момент находятся в буфере)?

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

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Вот простой демонстрационный скрипт, с которого можно начать знакомство с внутренними компонентами SQL Server.Чтобы увидеть отдельные действия запроса, перейдите по ссылке Блог SQLSkills Пола Рэндала .

Другие посты в этом блоге будут посвящены таким темам, как DBCC PAGE, что позволит вам увидеть содержимое PAGE иDBCC IND, который покажет вам карты размещения для таблиц / индексов.Я рекомендую прочитать копию Microsoft SQL Server 2008 Internals, в которой подробно рассматриваются все эти темы.

Демонстрационный сценарий записей журнала транзакций

Для двух вариантов выбора пропуски отображаются как физические чтения и чтения с опережающим чтением, это чтения с диска в пул буферов.Затем механизм запросов использует эти страницы, и это логическое чтение.Таким образом, для статистики io в режиме «горячего» выбора он не имеет физических чтений или операций чтения с опережением, поэтому все требуемые страницы уже находятся в пуле буферов.

/* -- Cleanup Script
USE master
DROP DATABASE ExampleDB
*/
SET NOCOUNT ON
SET STATISTICS IO OFF
GO
CREATE DATABASE ExampleDB
GO
USE ExampleDB
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
-- Show Empty Transaction Log
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- CREATE SIMPLE TABLE
CREATE TABLE NewTable
(
    A   int identity NOT NULL PRIMARY KEY,
    B   char(8000) NOT NULL DEFAULT ('')
)
GO
-- Show Transaction Log With CREATE TABLE records
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
PRINT 'INSERT Start'
GO
INSERT  NewTable
VALUES (DEFAULT)
GO 1000
PRINT 'INSERT End'
GO
-- Show Transaction Log With INSERT records
SELECT * FROM fn_dblog(NULL,NULL)
GO
-- Turn On IO Statistics (these appear in the messages tab)
SET STATISTICS IO ON
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log and modified buffer pages
CHECKPOINT
GO
-- DROP CLEAN BUFFERS to empty cache
DBCC DROPCLEANBUFFERS
GO
PRINT 'SELECT Start Cold Cache'
GO
SELECT * FROM NewTable
GO
PRINT 'SELECT End Cold Cache'
GO
PRINT 'SELECT Start Warm Cache'
GO
SELECT * FROM NewTable
GO
PRINT 'SELECT End Warm Cache'
GO
-- Force a CHECKPOINT to CLEAR the Transaction Log
CHECKPOINT
GO
DROP TABLE NewTable
-- Show Transaction Log With DROP TABLE records
SELECT * FROM fn_dblog(NULL,NULL)
GO

Для содержимого пула буферов начальныйДело в том, что это DMV

SELECT      *
FROM        sys.dm_os_buffer_descriptors
0 голосов
/ 17 июля 2011

У вас есть опции SQL Profiler и просмотр плана выполнения хранимой процедуры.

...