Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
abort
Member

Откуда:
Сообщений: 625
переменные table @ хранятся в памяти сервера в течение сессии, временные таблицы хранятся в temdb в течение сессии.
Есть сервер с 8 гб памяти. При каких объемах данных (кол-во строк или в МБ) оптимальнее будет хранить временные данные в tempdb(#). Есть ли какое то правило или это строго индивидуально. Насколько правильно хранить 200000 записей в памяти переменной @table?
23 фев 15, 08:26    [17300772]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
информация устарела
Guest
abort,

автор
переменные table @ хранятся в памяти сервера в течение сессии, временные таблицы хранятся в temdb

утверждение и противопоставление в контексте объема данных в корне неверно.
23 фев 15, 09:35    [17300820]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
abort
Member

Откуда:
Сообщений: 625
есть 10 хранимок, запускающиеся кадые 3 часа жобами, в которых будут использоваться до 200000 записей для всяких расчетов. Где лучше хранить данные?
временные таблицы #
локальных переменных table @
или выделить постоянные таблицы и транкейтить их перед использованием
23 фев 15, 09:39    [17300828]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
и транкейт для верности
Guest
abort,

1) http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server
и все остальное из гугла и книжек, где все рассосано, размазано и раскрыто

2) вы блин издеваетесь? сколько займет времени изменить @ на #, # на dbo. и нажать F5?

жопа с производительностью чаще всего кроется в не самых удачных алгоритмах (которые довольно часто начинаются с "сначала все очищаем...", "если пересчитывать, то вообще все..", "берем 200000 записей, кладем...", "кластерный по гуидам..." (с)), потом в отсутствии элементарных знаний про построение индексов и ненаписание такого кода, с которым невозможно эти индексы применить, и уже в сто двадцать пятую очередь - про противопоставление собаки решетке, байт или бит, денормализация или нет, не будет ли выгоды, если на миллиарде сравнений сравниваться будет не datetime, а smallint. какие собаки-решетки? хоть один счетчик был отслежен? хоть один план выполнения просмотрен?
23 фев 15, 10:03    [17300851]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
abort
Member

Откуда:
Сообщений: 625
первая ссылка дала исчерпывающий результат. спасибо
23 фев 15, 10:09    [17300859]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
abort
переменные table @ хранятся в памяти сервера в течение сессии, временные таблицы хранятся в temdb в течение сессии.
В обоих случаях в tempdb
23 фев 15, 10:52    [17300950]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
alexeyvg
abort
переменные table @ хранятся в памяти сервера в течение сессии, временные таблицы хранятся в temdb в течение сессии.
В обоих случаях в tempdb


как говорят в определенных кругах: обломал кайф
23 фев 15, 11:25    [17301040]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
Winnipuh,
не совсем.
ТС все еще убежден, что
abort
переменные table @ хранятся в памяти сервера в течение сессии

так что есть еще место обломам
23 фев 15, 11:38    [17301066]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
В обоих случаях
Guest
abort,

по ссылке обязательно доберись до "про память"
ответ на вопрос "в tempdb или не в tempdb" не связан с ответом на вопрос "в памяти или на диске"
23 фев 15, 11:40    [17301071]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Павел-П
Member

Откуда:
Сообщений: 234
и транкейт для верности
жопа с производительностью чаще всего кроется в не самых удачных алгоритмах (которые довольно часто начинаются с "сначала все очищаем...", "если пересчитывать, то вообще все..", "берем 200000 записей, кладем...", "кластерный по гуидам..." (с)), потом в отсутствии элементарных знаний про построение индексов и ненаписание такого кода, с которым невозможно эти индексы применить, и уже в сто двадцать пятую очередь - про противопоставление собаки решетке, байт или бит, денормализация или нет, не будет ли выгоды, если на миллиарде сравнений сравниваться будет не datetime, а smallint. какие собаки-решетки? хоть один счетчик был отслежен? хоть один план выполнения просмотрен?


ну вообще-то оптимизатор всегда эстимирует содержимое table variable как 1 строчка. Т.е. # против @ все-таки иногда очень важно.
23 фев 15, 14:10    [17301405]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
Павел-П
ну вообще-то оптимизатор всегда эстимирует содержимое table variable как 1 строчка. Т.е. # против @ все-таки иногда очень важно.

вообще-то не всегда, и по той ссылке даже это есть.
а вот главную беду с переменными выделяю жирным:
The rows column in sys.partitions is maintained for table variables so it does actually know how many rows are in the table. This can be seen by using OPTION (RECOMPILE).
But the lack of column stats means it can't estimate specific column predicates.
23 фев 15, 14:16    [17301419]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Павел-П
Member

Откуда:
Сообщений: 234
o-o
вообще-то не всегда, и по той ссылке даже это есть.


ну при рекомпиляции после заполнения - это да, будет эстимировать правильно, что тем не менее не унижает приведенный факт.
23 фев 15, 14:31    [17301447]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Павел-П
o-o
вообще-то не всегда, и по той ссылке даже это есть.


ну при рекомпиляции после заполнения - это да, будет эстимировать правильно, что тем не менее не унижает приведенный факт.


не хотелось бы про унижение фактов, но что означает глагол "эстимировать"?
23 фев 15, 14:36    [17301452]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
Павел-П,
о блин, вроде же цитата целиком приведена.
о чем вы сказали, через OPTION (RECOMPILE) решаемо.
а вот выделенное не решить никак, только отказом от табличных переменных в пользу временных таблиц.
to Winnipuh: "to estimate"
23 фев 15, 14:38    [17301455]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
table (Transact-SQL)
в разделе Limitations and Restrictions все отлично описано

+
слушайте, а давно msdn стал https?
у нас просто все подряд https более не открываются.
т.е. гугл давно уже, а с недавних пор еще и msdn.
спасибо хоть сохраненные копии дают читать, извращенцы...



К сообщению приложен файл. Размер - 58Kb
23 фев 15, 15:03    [17301517]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
Winnipuh,
не совсем.
ТС все еще убежден, что
abort
переменные table @ хранятся в памяти сервера в течение сессии

так что есть еще место обломам


Перейти на SQL 2014 и использовать IN-MEMEORY для хранения в MEMORY ... хе хе
23 фев 15, 15:54    [17301645]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
a_voronin,

а что, в 2014 уже табличные переменные за пределами batch-a живут?
я ведь проверю
23 фев 15, 16:21    [17301746]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
o-o
a_voronin,

а что, в 2014 уже табличные переменные за пределами batch-a живут?
я ведь проверю


А причём тут вообще batch? In-Memory таблица точно живет не в tempdb, она живёт в IN-MEMORY партиции.

Под NATIVE_COMPILATION там вообще свой зоопарк. Сюда, если что наведайтесь http://www.mssqltips.com/sqlservertip/3065/migrate-to-natively-compiled-sql-server-stored-procedures-for-hekaton/

оттуда
USE TestDB
GO
IF TYPE_ID('dbo.T_Salaries_Table') IS NOT NULL 
    DROP TYPE dbo.T_Salaries_Table
GO
CREATE TYPE dbo.T_Salaries_Table AS TABLE
(
 Employee_ID   INT NOT NULL,  
 Total_Worked_hours INT NOT NULL, 
 [Date]    DATE NOT NULL
 PRIMARY KEY NONCLUSTERED HASH (Employee_ID) WITH (BUCKET_COUNT = 1024)
) WITH (MEMORY_OPTIMIZED = ON)
GO

USE TestDB
GO
-- Drop stored procedure if it already exists
IF OBJECT_ID('dbo.Compute_Salaries','P') IS NOT NULL
   DROP PROCEDURE dbo.Compute_Salaries
GO
CREATE PROCEDURE dbo.Compute_Salaries
@DateFrom DATE
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(
 TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english'
)
   
  DECLARE @TempTable dbo.T_Salaries_Table
  DECLARE @Exists BIT = 0
  SELECT TOP 1
            @Exists = 1
  FROM      dbo.Worked_Hours
  WHERE  [Date] > @DateFrom
  
  IF @Exists = 1 
    BEGIN  
        INSERT  INTO @TempTable
                SELECT  E.Employee_ID ,
                        SUM(W.Worked_Hours),
      MAX(W.[Date])
                FROM    dbo.employees E
                        INNER JOIN dbo.Worked_Hours W ON E.Employee_ID = W.Employee_ID
    WHERE W.[Date] > @DateFrom
                GROUP BY E.Employee_ID
        SELECT  E.Employee_id ,
                E.Name ,
                E.Base_Salary + E.Hour_Cost * T.Total_Worked_hours AS 'Salary',
    T.[Date]
        FROM    dbo.employees E
                INNER JOIN @TempTable T ON E.Employee_ID = T.Employee_ID  
    END
END
GO
23 фев 15, 16:56    [17301831]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
NickAlex66
Member

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

Можно вспомнить про индексы и статистику для #
23 фев 15, 17:41    [17301976]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
o-o
Guest
a_voronin
А причём тут вообще batch?

а при чем там цитата из меня с указанием ВРЕМЕНИ ЖИЗНИ табличной переменной???
не in-memory table, а табличной переменной.
вы жирненьким выделенное видите?
вот когда цитируете, обращайте внимание на то, что цитируете.

ну и заодно, если пишете репро, оно должно быть воспроизводимым,
т.е. я ваш код копирую и он должен исполняться, иначе это не репро
23 фев 15, 17:55    [17302011]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
o-o
Павел-П,
о блин, вроде же цитата целиком приведена.
о чем вы сказали, через OPTION (RECOMPILE) решаемо.
а вот выделенное не решить никак, только отказом от табличных переменных в пользу временных таблиц.
to Winnipuh: "to estimate"


вот! значит русское слово "эстимейтировать", а то как неудобно получается
23 фев 15, 17:58    [17302015]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
nomemory патриция
Guest
a_voronin
А причём тут вообще batch? In-Memory таблица точно живет не в tempdb, она живёт в IN-MEMORY партиции.

ну да, теперь у каждой базы будет свой собственный маленький tempdb
автор
To optimize data storage for database startup times, you can add multiple containers to the memory-optimized data filegroup, each on a different disk. This way SQL Server will read all of the containers in parallel.
что-то мне это напоминает
автор
Lock free objects that eliminate all physical locks and latches. Threads that perform transactional work don’t use locks or latches for concurrency control.

nolock 2.0 )) с блэкджеком и собственной файловой группой
23 фев 15, 19:19    [17302232]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
nomemory патриция
a_voronin
А причём тут вообще batch? In-Memory таблица точно живет не в tempdb, она живёт в IN-MEMORY партиции.

ну да, теперь у каждой базы будет свой собственный маленький tempdb
автор
To optimize data storage for database startup times, you can add multiple containers to the memory-optimized data filegroup, each on a different disk. This way SQL Server will read all of the containers in parallel.
что-то мне это напоминает
автор
Lock free objects that eliminate all physical locks and latches. Threads that perform transactional work don’t use locks or latches for concurrency control.

nolock 2.0 )) с блэкджеком и собственной файловой группой


Да ни хрена ты не понял про InMemory. И объяснять я тебе не буду. Иди RTFM-мь
23 фев 15, 22:31    [17302768]     Ответить | Цитировать Сообщить модератору
 Re: при каких объемах нужно использовать временные таблицы (#) вместо переменных (@ - table)  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Winnipuh
вот! значит русское слово "эстимейтировать", а то как неудобно получается
Самое неудобное получается, когда людям, неправильно заучишвим технические термины, вдруг приходится общаться с иностранцами.
23 фев 15, 23:47    [17302904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить