|
|
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
Существует мнение, что если создать БД в которой выборка данных будет происходить преимуществеено с помощью временных таблиц в памяти (@table), то резко возрастет нагрузка на сервер, т.е. "забьется" память. Вопрос следуюий. Обычный селект разве не формирует dataset в памяти прежде чем отправить его клиенту? Такая мысль зародилась у меня после того как я обнаружил, работая с Delphi что событие OnFetch срабатывает только после того как произойдет селект, т.е. какой бы тяжелый селект не был прогресс бежит быстро но не сразу, а слегка погодя. Может пока идет "погодя" датасет формируется в памяти сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 12:15:10 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
на самом деле что селект, что табле если они тяжеловесные - используют временные таблицы... просто и прозрачно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 12:34:46 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
По моему обычный селект формирует dataset в памяти прежде чем отправить его клиенту, однако отправляет не весь dataset а сколько то записей, этим числом можно варьировать, если Вы вышли за пределы полученных строк dataset, то Вам подгружаются следующие. А указанные возможные проблемы с временными таблицами, в другой области. Я думаю такое мнение из за того, что временные таблицы удаляются при закрытии сессии а результаты селекта после его выполнения. Хотя если пользоваться процедурами то, по моему, разницы никакой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 15:11:30 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
А через что вы работаете? Если через ADO, то там в параметрах соединения все указывается. Если курсор серверный, то информация подгружается по одной записи. Если клиентский, то по умолчанию грузится весь набор данных. Можно сделать так, что грузится он будет асинхронно. Можно, чтобы синхронно. Можно задать количество строк одной порции. Через BDE - не знаю, не пробовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 17:59:02 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
Попробовал 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 секунд. --и то и другое повторил несколько раз Возможно, преимущество переменных в скорости (нет транзакций!) проявляется при небольших объёмах? Или преимущество только в логике? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 18:26:50 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
2 VAT.... правильной дорогой идете товарисч..... ;)) могу добавить - маленькая переменная табле быстрее маленькой временной таблицы.... и наоборот.... конкретные значения зависят от количества ваше озу.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2002, 20:29:24 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
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). " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 00:47:51 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
Glory спасибо за полезную ссылку. При работе с клиентом я вроде все понимаю. Можно указать тип курсора. Можно количество записей на странице и еще кучу параметров. Но меня интересует прежде всего вот что. Допустим курсор на сервере и разбит на страницы. Датасет для этого курсора сформированный например "select * from myTab" в памяти(может на диске коли большой) или курсор по таблице бегает, т.е. этот датасет материализуется в памяти? И самое главное если датасет сформирован не простым селектом а "declare @tmp table... insert into @tmp... select * from @tmp" где датасет для курсора? Ну когда курсор на клиенте, то вроде и думать нечего. Датасет для него у клиента в памяти. Ну коли он большой операционка его на диск пихнет. А может я сейчас и сам отвечу. Если select вернул большое количество данных, то он полагаю преимущественно на диске во временной таблице и курсор по диску бегает. Если не большое то он в памяти. Тоже самое и @tmp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 15:37:20 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
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 . Может это и есть ответ на прозвучавший недавно вопрос о неполном роллбэке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 16:28:06 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
И действительно: Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 16:32:04 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
2VVG_ IMHO все логично - транзакции и не должны действовать на локльные переменные (пусть даже они и являются таблицами по сути ), потому как они "are not part of the persistent database". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 16:35:55 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
Так это замечательно. declare @t table во внешнем scope, потом транзакции, потом insert into ErrorLog select * from @t и все путем. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 16:41:04 |
|
||
|
Про тип данных table
|
|||
|---|---|---|---|
|
#18+
А что, по-вашему, временные таблицы (не переменные!) are part of the persistent database? Однако rollback на них действует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2002, 16:59:46 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32051380&tid=1820255]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 329ms |

| 0 / 0 |
