Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Про тип данных table / 14 сообщений из 14, страница 1 из 1
17.09.2002, 12:15:10
    #32050931
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
Существует мнение, что если создать БД в которой выборка данных будет происходить преимуществеено с помощью временных таблиц в памяти (@table), то резко возрастет нагрузка на сервер, т.е. "забьется" память.
Вопрос следуюий. Обычный селект разве не формирует dataset в памяти прежде чем отправить его клиенту? Такая мысль зародилась у меня после того как я обнаружил, работая с Delphi что событие OnFetch срабатывает только после того как произойдет селект, т.е. какой бы тяжелый селект не был прогресс бежит быстро но не сразу, а слегка погодя. Может пока идет "погодя" датасет формируется в памяти сервера?
...
Рейтинг: 0 / 0
17.09.2002, 12:34:46
    #32050939
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
на самом деле что селект, что табле если они тяжеловесные - используют временные таблицы...
просто и прозрачно....
...
Рейтинг: 0 / 0
17.09.2002, 15:11:30
    #32051006
fima
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
По моему обычный селект формирует dataset в памяти прежде чем отправить его клиенту, однако отправляет не весь dataset а сколько то записей, этим числом можно варьировать, если Вы вышли за пределы полученных строк dataset, то Вам подгружаются следующие. А указанные возможные проблемы с временными таблицами, в другой области. Я думаю такое мнение из за того, что временные таблицы удаляются при закрытии сессии а результаты селекта после его выполнения. Хотя если пользоваться процедурами то, по моему, разницы никакой...
...
Рейтинг: 0 / 0
17.09.2002, 17:59:02
    #32051117
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
А через что вы работаете? Если через ADO, то там в параметрах соединения все указывается. Если курсор серверный, то информация подгружается по одной записи. Если клиентский, то по умолчанию грузится весь набор данных. Можно сделать так, что грузится он будет асинхронно. Можно, чтобы синхронно. Можно задать количество строк одной порции.
Через BDE - не знаю, не пробовал.
...
Рейтинг: 0 / 0
17.09.2002, 18:26:50
    #32051126
VAT
VAT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
Попробовал 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
17.09.2002, 20:29:24
    #32051152
MiCe
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
2 VAT.... правильной дорогой идете товарисч..... ;))
могу добавить - маленькая переменная табле быстрее маленькой временной таблицы....
и наоборот.... конкретные значения зависят от количества ваше озу....
...
Рейтинг: 0 / 0
18.09.2002, 00:47:51
    #32051176
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
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
18.09.2002, 15:37:20
    #32051347
Slava
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
Glory спасибо за полезную ссылку.
При работе с клиентом я вроде все понимаю. Можно указать тип курсора. Можно количество записей на странице и еще кучу параметров. Но меня интересует прежде всего вот что. Допустим курсор на сервере и разбит на страницы. Датасет для этого курсора сформированный например "select * from myTab" в памяти(может на диске коли большой) или курсор по таблице бегает, т.е. этот датасет материализуется в памяти? И самое главное если датасет сформирован не простым селектом а "declare @tmp table... insert into @tmp... select * from @tmp" где датасет для курсора?
Ну когда курсор на клиенте, то вроде и думать нечего. Датасет для него у клиента в памяти. Ну коли он большой операционка его на диск пихнет.
А может я сейчас и сам отвечу. Если select вернул большое количество данных, то он полагаю преимущественно на диске во временной таблице и курсор по диску бегает. Если не большое то он в памяти.
Тоже самое и @tmp.
...
Рейтинг: 0 / 0
18.09.2002, 16:28:06
    #32051377
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
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
18.09.2002, 16:32:04
    #32051380
VVG_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Про тип данных table
И действительно:

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


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