powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про тип данных table
14 сообщений из 14, страница 1 из 1
Про тип данных table
    #32050931
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует мнение, что если создать БД в которой выборка данных будет происходить преимуществеено с помощью временных таблиц в памяти (@table), то резко возрастет нагрузка на сервер, т.е. "забьется" память.
Вопрос следуюий. Обычный селект разве не формирует dataset в памяти прежде чем отправить его клиенту? Такая мысль зародилась у меня после того как я обнаружил, работая с Delphi что событие OnFetch срабатывает только после того как произойдет селект, т.е. какой бы тяжелый селект не был прогресс бежит быстро но не сразу, а слегка погодя. Может пока идет "погодя" датасет формируется в памяти сервера?
...
Рейтинг: 0 / 0
Про тип данных table
    #32050939
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле что селект, что табле если они тяжеловесные - используют временные таблицы...
просто и прозрачно....
...
Рейтинг: 0 / 0
Про тип данных table
    #32051006
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По моему обычный селект формирует dataset в памяти прежде чем отправить его клиенту, однако отправляет не весь dataset а сколько то записей, этим числом можно варьировать, если Вы вышли за пределы полученных строк dataset, то Вам подгружаются следующие. А указанные возможные проблемы с временными таблицами, в другой области. Я думаю такое мнение из за того, что временные таблицы удаляются при закрытии сессии а результаты селекта после его выполнения. Хотя если пользоваться процедурами то, по моему, разницы никакой...
...
Рейтинг: 0 / 0
Про тип данных table
    #32051117
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А через что вы работаете? Если через ADO, то там в параметрах соединения все указывается. Если курсор серверный, то информация подгружается по одной записи. Если клиентский, то по умолчанию грузится весь набор данных. Можно сделать так, что грузится он будет асинхронно. Можно, чтобы синхронно. Можно задать количество строк одной порции.
Через BDE - не знаю, не пробовал.
...
Рейтинг: 0 / 0
Про тип данных table
    #32051126
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал 2 варианта - с временной таблицей и с переменной типа TABLE (около 100 мег). Результат - используемая оперативная память не меняется, всё происходит в tempdb:
1.
select * into #m from T1
--делается 20 секунд

create function fm ()
returns table
return (
select
...
from
T1)
go

declare @m table
(
...
)
insert @m select * from fm ()

--делается 40 секунд.
--и то и другое повторил несколько раз
Возможно, преимущество переменных в скорости (нет транзакций!) проявляется при небольших объёмах? Или преимущество только в логике?
...
Рейтинг: 0 / 0
Про тип данных table
    #32051152
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VAT.... правильной дорогой идете товарисч..... ;))
могу добавить - маленькая переменная табле быстрее маленькой временной таблицы....
и наоборот.... конкретные значения зависят от количества ваше озу....
...
Рейтинг: 0 / 0
Про тип данных table
    #32051176
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INF: Frequently Asked Questions - SQL Server 2000 - Table Variables

"A table variable is not a memory-only structure. Because a table variable might hold more data than can fit in memory, it has to have a place on disk to store data. Table variables are created in the tempdb database similar to temporary tables. If memory is available, both table variables and temporary tables are created and processed while in memory (data cache). "
...
Рейтинг: 0 / 0
Про тип данных table
    #32051347
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory спасибо за полезную ссылку.
При работе с клиентом я вроде все понимаю. Можно указать тип курсора. Можно количество записей на странице и еще кучу параметров. Но меня интересует прежде всего вот что. Допустим курсор на сервере и разбит на страницы. Датасет для этого курсора сформированный например "select * from myTab" в памяти(может на диске коли большой) или курсор по таблице бегает, т.е. этот датасет материализуется в памяти? И самое главное если датасет сформирован не простым селектом а "declare @tmp table... insert into @tmp... select * from @tmp" где датасет для курсора?
Ну когда курсор на клиенте, то вроде и думать нечего. Датасет для него у клиента в памяти. Ну коли он большой операционка его на диск пихнет.
А может я сейчас и сам отвечу. Если select вернул большое количество данных, то он полагаю преимущественно на диске во временной таблице и курсор по диску бегает. Если не большое то он в памяти.
Тоже самое и @tmp.
...
Рейтинг: 0 / 0
Про тип данных table
    #32051377
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory: Кстати, там я обнаружил очень любопытный абзац:

Transactions that involve table variables last only for the duration of an update on the table variable. Therefore, table variables require less locking and logging resources. Because table variables have limited scope and are not part of the persistent database, transaction rollbacks do not affect them .

Может это и есть ответ на прозвучавший недавно вопрос о неполном роллбэке?
...
Рейтинг: 0 / 0
Про тип данных table
    #32051380
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И действительно:

Код: plaintext
1.
2.
3.
4.
declare @t table (a int)
begin transaction
insert into @t values ( 1 )
rollback transaction
select * from @t
...
Рейтинг: 0 / 0
Про тип данных table
    #32051381
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2VVG_
IMHO все логично - транзакции и не должны действовать на локльные переменные (пусть даже они и являются таблицами по сути ), потому как они "are not part of the persistent database".
...
Рейтинг: 0 / 0
Про тип данных table
    #32051384
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это замечательно.
declare @t table во внешнем scope, потом транзакции, потом insert into ErrorLog select * from @t и все путем. :)
...
Рейтинг: 0 / 0
Про тип данных table
    #32051394
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, по-вашему, временные таблицы (не переменные!) are part of the persistent database? Однако rollback на них действует.
...
Рейтинг: 0 / 0
Про тип данных table
    #32051399
Фотография VVG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По нашему - не знаю, но с точки зрения сервера видимо да. оbject_id они же имеют.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про тип данных table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]