Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
Всем привет!

Сразу прошу прощенье если вопросы глупые, но в чистом виде ответа я не нашел.

Вопроса всего два.
1. Где MS SQL хранит временные таблицы, в оперативной памяти или на диске?
Я понимаю что временные таблицы относятся к базе TempDB, но TempDB это база данных, а не место хранения. Если объект лежит в TempDB это ведь не значит что таблица обязательно будет читаться с диска или значит?

2. Как определить откуда идет чтение данных, из кэша в памяти или c диска?


Если дадите ссылку на документацию где про это написано, буду премного благодарен.
21 мар 15, 18:37    [17414256]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
в tempdb
21 мар 15, 19:10    [17414347]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Андрей_Батькович
Если дадите ссылку на документацию где про это написано

временные таблицы - это обычные таблицы. Просто они хранятся в базе tempdb из их область видимости и время жизни определяет сервер
21 мар 15, 19:53    [17414515]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Андрей_Батькович
Если объект лежит в TempDB это ведь не значит что таблица обязательно будет читаться с диска или значит?
Не значит.
Андрей_Батькович
2. Как определить откуда идет чтение данных, из кэша в памяти или c диска?
Имеется в виду, для конкретного запроса? Вот в sys.dm_exec_query_stats что то похожее есть, ***physical_reads
21 мар 15, 19:58    [17414538]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
Всем спасибо за ответы, но для меня ситуация так и не прояснилась.
То что временные таблицы относятся к TempDB это я и так знал.
Меня интересует где именно сервер эти таблицы хранит, на диске или в сразу в памяти?
21 мар 15, 20:20    [17414644]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Андрей_Батькович
Меня интересует где именно сервер эти таблицы хранит, на диске или в сразу в памяти?
Да как для обычных таблиц обычных баз данных, сразу в памяти.
В фоне, по возможности, будет сбрасывать на диск.
То есть, как для обычных таблиц, чтение будет из памяти, но если из памяти их выкинут для размещения других данных, то будет читать с диска.

Там вроде есть некие различия в логировании и использовании кеша, но несущественно для вашего вопроса.
21 мар 15, 20:45    [17414752]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
alexeyvg,

Большое спасибо за ответ.
А есть ли ссылка на раздел в документации где описано такое поведение?
22 мар 15, 20:53    [17417005]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
o-o
Guest
Андрей_Батькович
А есть ли ссылка на раздел в документации где описано такое поведение?

Database Checkpoints (SQL Server)
For performance reasons, the Database Engine performs modifications to database pages in memory—in the buffer cache—and does not write these pages to disk after every change. Rather, the Database Engine periodically issues a checkpoint on each database. A checkpoint writes the current in-memory modified pages (known as dirty pages) and transaction log information from memory to disk and, also, records information about the transaction log.

+ What does checkpoint do for tempdb? By: Paul Randal
[...]when a checkpoint occurs for a user database, all dirty pages for that database are flushed to disk (as well as other operations). This does not happen for tempdb. Tempdb is not recovered in the event of a crash, and so there is no need to force dirty tempdb pages to disk, except in the case where the lazywriter process (part of the buffer pool) has to make space for pages from other databases. Of course, when you issue a *manual* CHECKPOINT, all the dirty pages are flushed, but for automatic checkpoints they’re not.
[...]
This is all that happens for a checkpoint of tempdb – no data pages are flushed to disk except for a manual CHECKPOINT.

Understanding TempDB, table variables v. temp tables and Improving throughput for TempDB By: Kimberly Tripp
TempDB is in cache just as any other database is in cache. TempDB does not spill to disk unless you are low on cache and/or if you have a lot of inflight transactions in TempDB.
22 мар 15, 23:37    [17417281]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
Андрей_Батькович
А есть ли ссылка на раздел в документации где описано такое поведение?
Вот, o-o уже написал, ещё могу предложить первую ссылку на русском: https://msdn.microsoft.com/ru-ru/library/ms189573.aspx (обычно статьи в msdn есть на русском, нужно заменить в адресе en-us на ru-ru)
23 мар 15, 00:17    [17417351]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
1. Где MS SQL хранит временные таблицы, в оперативной памяти или на диске?


на диске, в бд tempdb.
бд может кэшироваться в памяти и частично или полностью лежать в памяти (tempdb in ram).

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

это и место хранения тоже.

Если объект лежит в TempDB это ведь не значит что таблица обязательно будет читаться с диска или значит?

не значит. это значит, что она может читаться с диска.

кстати, самое узкое место будет запись в лог, а не в саму базу.

2. Как определить откуда идет чтение данных, из кэша в памяти или c диска?

по фактическим планам запросов и по performance counters.
23 мар 15, 01:18    [17417450]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
Андрей_Батькович
Всем спасибо за ответы, но для меня ситуация так и не прояснилась.
То что временные таблицы относятся к TempDB это я и так знал.
Меня интересует где именно сервер эти таблицы хранит, на диске или в сразу в памяти?


если не доходит, то НА ДИСКЕ.
23 мар 15, 01:19    [17417451]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
MasterZiv,

1) Судя по тому что написал о-о, вы не правы.
По крайней мере подтверждающих ссылок я у вас в сообщении не вижу.

2) Подскажите как именно по плану запроса можно определить откуда были прочитаны данные?
23 мар 15, 09:29    [17417762]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
o-o,

Спасибо за развернутый ответ.
23 мар 15, 09:29    [17417767]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
o-o
Guest
Андрей_Батькович,

как посмотреть:
создайте временную таблицу и выведите с помощью dbcc ind все ее страницы,
затем отфильтруйте по номерам страниц вывод sys.dm_os_buffer_descriptors:
create table #t (id int);
insert into #t values (1), (2), (3);

dbcc ind(tempdb, #t, -1);
--182, 183

select *
from sys.dm_os_buffer_descriptors
where page_id in (182, 183) and database_id = 2;

database_id file_id page_id page_level allocation_unit_id page_type row_count free_space_in_bytes is_modified numa_node
2 1 182 0 1008806317065240576 DATA_PAGE 3 8057 1 0
2 1 183 0 1008806317065240576 IAM_PAGE 2 6 1 0

is_modified = 1 означает, что содержимое страницы в памяти разнится с тем, что на диске:
sys.dm_os_buffer_descriptors (Transact-SQL)
Column name Data type Description
is_modified bit 1 = Page has been modified after it was read from the disk. Is nullable.

на странице в памяти 3 строки, а на диске? нету их, или что с чем различается?
tempdb при рестарте пересоздается, о вашей #t вообще нет никакого инфо.
зачем вообще о #t информация на диске кроме случая, когда просто из памяти выперли?
все необходимое для отката транзакции с участием временной таблицы есть в логе tempdb,
а redo info для нее нет, тк и не нужно

но как и было уже выше процитировано, можно заставить на диск сбросить:
use tempdb;
checkpoint;

снова опросите sys.dm_os_buffer_descriptors и убедитесь, что is_modified стало 0.

теперь читаем из таблицы и смотрим, откуда идет чтение:
set statistics io on;
select *
from #t
set statistics io off;

(3 row(s) affected)
Table '#t__________________________________________________________________________________________________________________000000000005'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

logical reads 1, physical reads 0 говорит о том, что с диска считывания не было
23 мар 15, 11:07    [17418120]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
Андрей_Батькович
MasterZiv,

1) Судя по тому что написал о-о, вы не правы.
По крайней мере подтверждающих ссылок я у вас в сообщении не вижу.

2) Подскажите как именно по плану запроса можно определить откуда были прочитаны данные?


physical iO.
23 мар 15, 16:32    [17420617]     Ответить | Цитировать Сообщить модератору
 Re: Где MS SQL хранит временные таблицы?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 82
o-o,

Огромное спасибо!
23 мар 15, 19:05    [17421488]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить