Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Код я писал в dbForge Studio, у этого IDE самый лучший форматировщик исходников (это единственный плюс этого IDE), но у меня он не настроен, поэтому форматирование выполнено в ручную
DECLARE @consumers_report_columns TABLE (column_id INT)
INSERT INTO @consumers_report_columns (column_id)
SELECT rc.column_id
FROM consumers_report_columns rc
WHERE rc.consumer_id = @ConsumerId
DECLARE consumers_report_columns_cursor CURSOR
FOR
SELECT rc.column_id
FROM @consumers_report_columns rcDECLARE consumers_report_columns_cursor CURSOR LOCAL READ_ONLY
FOR
SELECT column_id
FROM dbo.consumers_report_columns
WHERE consumer_id = @ConsumerId--освобождаем оперативную память
DELETE @consumers_report_columnsUSE test
GO
ALTER DATABASE test
ADD FILEGROUP test_mem CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE test
ADD FILE (name='test_mem', filename='D:\test_mem') TO FILEGROUP test_mem
GO
CREATE TYPE dbo.ListInt AS TABLE (
ID INT NOT NULL,
INDEX Type_IX_ID HASH (ID) WITH (BUCKET_COUNT = 1000)
)
WITH (MEMORY_OPTIMIZED = ON)
GO
DECLARE @a dbo.ListInt
INSERT INTO @a VALUES (1)
SELECT * FROM @a
Не знаю уместно ли, но много лишнего кода
Кто из вас прав выясняйте без меня.
SELECT COUNT(1) FROM tempdb.sys.tables
GO
DECLARE @t TABLE (i INT)
SELECT COUNT(1) FROM tempdb.sys.tables-----------
1
-----------
2Также немного смутили комментарии
-- Test registration in tempdb
SELECT COUNT(1) AS BEFOR FROM tempdb.sys.tables -- До объявления табличной переменной
GO
DECLARE @t1 TABLE (i INT)
SELECT COUNT(1) AS AFTER FROM tempdb.sys.tables -- После объявления табличной переменной
GO
SELECT COUNT(1) AS PAST FROM tempdb.sys.tables -- После блока кода с объявлением табличной переменной
-- Test Drop
SELECT COUNT(1) AS BEFOR FROM tempdb.sys.tables
GO
DECLARE @t2 TABLE (i INT)
SELECT COUNT(1) AS AFTER FROM tempdb.sys.tables
DROP TABLE @t2
GO
-- Test Trunc
SELECT COUNT(1) AS BEFOR FROM tempdb.sys.tables
GO
DECLARE @t3 TABLE (i INT)
SELECT COUNT(1) AS AFTER FROM tempdb.sys.tables
TRUNCATE TABLE @t3
GO
-- Test Delete
SELECT COUNT(1) AS BEFOR FROM tempdb.sys.tables
GO
DECLARE @t4 TABLE (i INT)
SELECT COUNT(1) AS AFTER FROM tempdb.sys.tables
DELETE @t4
GOIf you are using SQL Server 2000 or higher, you can take advantage of the new TABLE variable type. These are similar to temporary tables except with more flexibility and they always stay in memory.
Like memory-optimized tables, memory-optimized table variables,
- Must fit in memory and do not use disk resources.
Disk-based table variables exist in tempdb. Memory-optimized table variables exist in the user database (but they do not consume storage and are not recovered).
You cannot create a memory-optimized table variable using in-line syntax. Unlike disk-based table variables, you must create a type first.
CREATE TYPE [Sales].[SalesOrderDetailType_inmem] AS TABLE(
[ProductID] [int] NOT NULL,
[SpecialOfferID] [int] NOT NULL,
INDEX [IX_ProductID] HASH ([ProductID]) WITH ( BUCKET_COUNT = 8),
INDEX [IX_SpecialOfferID] NONCLUSTERED
)
WITH ( MEMORY_OPTIMIZED = ON )справедливость восстановлена?
DECLARE @t TABLE(i INT)
INSERT INTO @t
VALUES (1), (2)
SELECT sys.fn_PhysLocFormatter(%%physloc%%)
FROM @tSELECT *
FROM sys.dm_os_buffer_descriptors
WHERE database_id = DB_ID('tempdb')
Отсутствие статистикии т.п.
Временная таблица может быть записана на диск и проиндексирована, временная таблица существует даже после завершения выполнения блока кода.
Табличная переменная существует только в оперативной памяти и только внутри блока кода и не может быть проиндексирована.
Table variables does not have distribution statistics, theywill not trigger recompiles. Therefore, in many cases, the optimizer will build a query plan on the assumption that the table variable has no rows. For this reason, you should be cautious about using a table variable if you expect a larger number of rows (greater than 100).
Martin Smith
Caveat
This answer discusses «classic» table variables introduced in SQL Server 2000. SQL Server 2014 in memory OLTP introduces Memory-Optimized Table Types. Table variable instances of those are different in many respects to the ones discuss
The use of memory-optimized table variables has a number of advantages over traditional table variables:
- The variables are truly in memory: they are guaranteed to never spill to disk
Не знаю, почему Вы в негативном ключе воспринимаете мои слова
мой первый опыт «серьезной» работы с T-SQL
Код я писал в dbForge Studio, у этого IDE самый лучший форматировщик исходников ( это единственный плюс этого IDE ), но у меня он не настроен, поэтому форматирование выполнено в ручную, и только там где я про него помнил.
Движок для построения отчётов на SQL. Черновик решения