Табличные переменные и временные таблицы в SQL Server 2014
Содержание:
1. Типы таблиц, оптимизированных для размещения в оперативной памяти, и параметры TVP (Вы читаете данный раздел);
2. Параллельная инструкция SELECT INTO;
3. Кардинальность с флагом трассировки 2453.
Как это ни странно, но поддержка типов таблиц (http://msdn.microsoft.com/en-us/Iibrary/ms175007.aspx) и возвращающих табличное значение параметров (TVP) (http://msdn.microsoft.com/en-us/library/bb510489.aspx) появилась только в SQL Server 2008. До выхода версии SQL Server 2014 табличная переменная на основе табличного типа всегда была представлена как набор страниц в tempdb. К таблицам, оптимизированным для размещения в оперативной памяти, и хранимым процедурам, скомпилированным в собственном коде, реализованным в SQL Server как часть In-Memory OLTP, специалисты Microsoft добавили поддержку типов таблиц, оптимизированных для размещения в оперативной памяти, и параметров TVP. Первоначально предполагалось обеспечить возможность объявлять табличную переменную типа таблиц, оптимизированных для размещения в оперативной памяти, заполнять ее строками и передавать как параметр TVP хранимой процедуре, скомпилированной в собственном коде. Но ничто не мешает создать табличные переменные на основе типов таблиц, оптимизированных для размещения в оперативной памяти, и использовать их для других целей, в том числе передавать в качестве параметров TVP регулярным процедурам. Таким образом можно реализовать преимущества производительности, свойственные структурам, оптимизированным для размещения в оперативной памяти, и избежать дискового представления в tempdb. Просто помните, что начальная реализация компонента In-Memory OLTP в SQL Server 2014 с использованием в запросе таблиц, оптимизированных для размещения в оперативной памяти, мешает параллелизму. Поэтому обязательно проведите тестирование, чтобы сравнить типы дисковых таблиц и параметры TVP с соответствующими элементами, оптимизированными для размещения в оперативной памяти, и выяснить, какие из них больше подходят для вашего случая.
Для использования этих возможностей необходимо добавить в базу данных файловую группу для данных, оптимизированных для размещения в оперативной памяти (отмеченную как CONTAINS М EMORY OPTI М IZED DATA), и контейнер, указывающий на папку в файловой системе, подобно тому как это делается в FILESTREAM. Родительская папка уже должна существовать, а дочерняя папка не должна существовать во время добавления контейнера. Поэтому, прежде чем выполнить программный код, убедитесь, что папка C:IMOLTP существует, а папка C:IMOLTPPerformanceV3_dir не существует (или измените имена папок по своему выбору) (см. код выше).
Чтобы создать тип таблицы, оптимизированной для размещения в оперативной памяти, добавьте параметр MEMORYOPTIMIZED = ON к определению типа. В качестве примера код выше создает тип таблицы OrderlDs, который представляет собой набор идентификаторов заказов.
Таблица, оптимизированная для размещения в оперативной памяти, должна располагать хотя бы одним индексом, чтобы получить доступ к строкам в памяти. Это может быть индекс BW-Tree (разновидность индекса B-tree без блокировок, без защелок), как приведенный в моем примере, или хеш-индекс. Первый эффективен для действий в диапазоне и по порядку. Второй оптимален для точечных запросов. Чтобы сделать индекс в нашем примере хеш-индексом, добавьте
непосредственно после ключевого слова NONCLUSTERED. Специалисты Microsoft рекомендуют указать число контейнеров, равное или вдвое превышающее число различных значений, предполагаемых в столбце.
Определив тип таблицы, можно использовать его в качестве типа табличных переменных, например, как в коде выше.
Как отмечалось выше, еще можно использовать тип таблицы, оптимизированной для размещения в оперативной памяти, как тип для параметров TVP. Например, в программном коде выше создается процедура, принимающая параметр @OrderlDs типа OrderlDs с входным набором идентификаторов заказов. Возвращается информация о запрошенных заказах. Используйте программный код ниже для выполнения процедуры с набором идентификаторов заказов {1759, 1760, 1761} в качестве входных данных. В приведенной ниже таблице показаны выходные данные.
После завершения выполните программный код ниже для очистки.
В SQL Server 2014 нельзя удалить файловую группу, оптимизированную для размещения в оперативной памяти. Чтобы это сделать, нужно удалить и повторно создать тестовую базу данных.
Далее мы поговорим о параллельной инструкции SELECT INTO, а сейчас я рекомендую вам заглянуть на www.nanokeramika.ru/brands/undefasa/ (http://www.nanokeramika.ru/brands/undefasa/). Здесь вы найдете роскошную керамическую плитку, которая станет настоящим украшением интерьера вашего дома.
1.
2. Параллельная инструкция SELECT INTO;
3. Кардинальность с флагом трассировки 2453.
Как это ни странно, но поддержка типов таблиц (http://msdn.microsoft.com/en-us/Iibrary/ms175007.aspx) и возвращающих табличное значение параметров (TVP) (http://msdn.microsoft.com/en-us/library/bb510489.aspx) появилась только в SQL Server 2008. До выхода версии SQL Server 2014 табличная переменная на основе табличного типа всегда была представлена как набор страниц в tempdb. К таблицам, оптимизированным для размещения в оперативной памяти, и хранимым процедурам, скомпилированным в собственном коде, реализованным в SQL Server как часть In-Memory OLTP, специалисты Microsoft добавили поддержку типов таблиц, оптимизированных для размещения в оперативной памяти, и параметров TVP. Первоначально предполагалось обеспечить возможность объявлять табличную переменную типа таблиц, оптимизированных для размещения в оперативной памяти, заполнять ее строками и передавать как параметр TVP хранимой процедуре, скомпилированной в собственном коде. Но ничто не мешает создать табличные переменные на основе типов таблиц, оптимизированных для размещения в оперативной памяти, и использовать их для других целей, в том числе передавать в качестве параметров TVP регулярным процедурам. Таким образом можно реализовать преимущества производительности, свойственные структурам, оптимизированным для размещения в оперативной памяти, и избежать дискового представления в tempdb. Просто помните, что начальная реализация компонента In-Memory OLTP в SQL Server 2014 с использованием в запросе таблиц, оптимизированных для размещения в оперативной памяти, мешает параллелизму. Поэтому обязательно проведите тестирование, чтобы сравнить типы дисковых таблиц и параметры TVP с соответствующими элементами, оптимизированными для размещения в оперативной памяти, и выяснить, какие из них больше подходят для вашего случая.
Для использования этих возможностей необходимо добавить в базу данных файловую группу для данных, оптимизированных для размещения в оперативной памяти (отмеченную как CONTAINS М EMORY OPTI М IZED DATA), и контейнер, указывающий на папку в файловой системе, подобно тому как это делается в FILESTREAM. Родительская папка уже должна существовать, а дочерняя папка не должна существовать во время добавления контейнера. Поэтому, прежде чем выполнить программный код, убедитесь, что папка C:IMOLTP существует, а папка C:IMOLTPPerformanceV3_dir не существует (или измените имена папок по своему выбору) (см. код выше).
Чтобы создать тип таблицы, оптимизированной для размещения в оперативной памяти, добавьте параметр MEMORYOPTIMIZED = ON к определению типа. В качестве примера код выше создает тип таблицы OrderlDs, который представляет собой набор идентификаторов заказов.
Таблица, оптимизированная для размещения в оперативной памяти, должна располагать хотя бы одним индексом, чтобы получить доступ к строкам в памяти. Это может быть индекс BW-Tree (разновидность индекса B-tree без блокировок, без защелок), как приведенный в моем примере, или хеш-индекс. Первый эффективен для действий в диапазоне и по порядку. Второй оптимален для точечных запросов. Чтобы сделать индекс в нашем примере хеш-индексом, добавьте
HASH WITH (BUCKET_COUNT = <count>) непосредственно после ключевого слова NONCLUSTERED. Специалисты Microsoft рекомендуют указать число контейнеров, равное или вдвое превышающее число различных значений, предполагаемых в столбце.
Определив тип таблицы, можно использовать его в качестве типа табличных переменных, например, как в коде выше.
Как отмечалось выше, еще можно использовать тип таблицы, оптимизированной для размещения в оперативной памяти, как тип для параметров TVP. Например, в программном коде выше создается процедура, принимающая параметр @OrderlDs типа OrderlDs с входным набором идентификаторов заказов. Возвращается информация о запрошенных заказах. Используйте программный код ниже для выполнения процедуры с набором идентификаторов заказов {1759, 1760, 1761} в качестве входных данных. В приведенной ниже таблице показаны выходные данные.
После завершения выполните программный код ниже для очистки.
В SQL Server 2014 нельзя удалить файловую группу, оптимизированную для размещения в оперативной памяти. Чтобы это сделать, нужно удалить и повторно создать тестовую базу данных.
Далее мы поговорим о параллельной инструкции SELECT INTO, а сейчас я рекомендую вам заглянуть на www.nanokeramika.ru/brands/undefasa/ (http://www.nanokeramika.ru/brands/undefasa/). Здесь вы найдете роскошную керамическую плитку, которая станет настоящим украшением интерьера вашего дома.