Подтвердить что ты не робот

Поддерживает ли MS-SQL таблицы в памяти?

В последнее время я начал менять некоторые из наших приложений, поддерживая MS SQL Server как альтернативный конец.

Одной из проблем совместимости, с которой я столкнулся, является использование MySQL CREATE TEMPORARY TABLE для создания таблиц в памяти, содержащих данные для очень быстрого доступа во время сеанса, без необходимости постоянного хранения.

Что такое эквивалент в MS SQL?

Требование состоит в том, что мне нужно иметь возможность использовать временную таблицу так же, как и любую другую, особенно JOIN с постоянными.

4b9b3361

Ответ 1

@Keith

Это распространенное заблуждение: переменные таблицы НЕ обязательно хранятся в памяти. Фактически SQL Server решает, сохранять ли переменную в памяти или проливать ее на TempDB. Нет надежного способа (по крайней мере, в SQL Server 2005), чтобы гарантировать, что данные таблицы хранятся в памяти. Для более подробной информации смотрите здесь

Ответ 2

Вы можете создавать переменные таблицы (в памяти) и два разных типа таблицы temp:

--visible only to me, in memory (SQL 2000 and above only)
declare @test table (
    Field1 int,
    Field2 nvarchar(50)
);

--visible only to me, stored in tempDB
create table #test (
    Field1 int,
    Field2 nvarchar(50)
)

--visible to everyone, stored in tempDB
create table ##test (
    Field1 int,
    Field2 nvarchar(50)
)

Edit:

Следуя отзывам, я думаю, что это немного разъясняет.

#table и ##table всегда будут находиться в TempDB.

@Table переменные обычно будут в памяти, но не гарантируются. SQL решает на основе плана запроса и использует TempDB, если это необходимо.

Ответ 3

Вы можете объявить "переменную таблицы" в SQL Server 2005, например:

declare @foo table (
    Id int,
    Name varchar(100)
);

Затем вы ссылаетесь на него точно так же, как переменная:

select * from @foo f
    join bar b on b.Id = f.Id

Не нужно его отбрасывать - он исчезает, когда переменная выходит из области видимости.

Ответ 4

Это возможно с MS SQL Server 2014.

Смотрите: http://msdn.microsoft.com/en-us/library/dn133079.aspx

Вот пример кода генерации SQL (из MSDN):

-- create a database with a memory-optimized filegroup and a container.
CREATE DATABASE imoltp 
GO

ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod 
ALTER DATABASE imoltp SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
GO

USE imoltp
GO


-- create a durable (data will be persisted) memory-optimized table
-- two of the columns are indexed
CREATE TABLE dbo.ShoppingCart ( 
  ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
  UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
  CreatedDate DATETIME2 NOT NULL, 
  TotalPrice MONEY
  ) WITH (MEMORY_OPTIMIZED=ON) 
GO

 -- create a non-durable table. Data will not be persisted, data loss if the server turns off unexpectedly
CREATE TABLE dbo.UserSession ( 
  SessionId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=400000), 
  UserId int NOT NULL, 
  CreatedDate DATETIME2 NOT NULL,
  ShoppingCartId INT,
  INDEX ix_UserId NONCLUSTERED HASH (UserId) WITH (BUCKET_COUNT=400000) 
  ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO

Ответ 5

Хорошее сообщение в блоге здесь, но в основном префикс локальных temp-таблиц С# и глобальным temp С## - eg

CREATE TABLE #localtemp

Ответ 6

Я понимаю, чего вы пытаетесь достичь. Добро пожаловать в мир различных баз данных!

SQL Server 2000 поддерживает временные таблицы, созданные путем префикса # в имя таблицы, делая его локально доступной временной таблицей (локальной для сеанса) и предшествующей ## для имени таблицы для глобальных доступных временных таблиц, например, #MyLocalTable и ## MyGlobalTable соответственно.

SQL Server 2005 и выше поддерживают как временные таблицы (локальные, глобальные), так и переменные таблицы - следите за новыми функциями табличных переменных в SQL 2008 и выпускайте два! Разница между временными таблицами и табличными переменными не так велика, но заключается в том, как обрабатывает их сервер базы данных.

Я бы не хотел говорить о более старых версиях SQL-сервера, таких как 7, 6, хотя я работал с ними, и там, откуда я вообще пришел: -)

Его общее мнение о том, что переменные таблицы всегда находятся в памяти, но это неправильно. В зависимости от объема использования памяти и объема транзакций на сервере базы данных таблицы переменных таблицы могут быть экспортированы из памяти и записаны в tempdb, а остальная часть обработки выполняется там (в tempdb).

Обратите внимание, что tempdb - это база данных на экземпляре без каких-либо постоянных объектов, но она ответственна за обработку рабочих нагрузок, связанных с побочными транзакциями, такими как сортировка и другая обработка, которая носит временный характер. С другой стороны, переменные таблицы (как правило, с меньшими данными) хранятся в памяти (ОЗУ), что делает их более быстрыми для доступа и, следовательно, меньше ввода-вывода IO с точки зрения использования накопителя tempdb при использовании переменных таблицы с меньшими данными по сравнению с временными таблицами, которые всегда войдите в tempdb.

Табличные переменные не могут быть проиндексированы, а временные таблицы (как локальные, так и глобальные) могут быть проиндексированы для более быстрой обработки в случае большого объема данных. Таким образом, вы знаете свой выбор в случае более быстрой обработки с большими объемами данных с помощью временных транзакций. Также стоит отметить, что транзакции только с табличными переменными не регистрируются и не могут быть отброшены, а те, которые выполняются на временных таблицах, могут быть отброшены назад.

Таким образом, переменные таблицы лучше подходят для меньших данных, тогда как временные таблицы лучше для больших данных, обрабатываемых временно. Если вы также нуждаетесь в правильном управлении транзакциями с использованием блоков транзакций, переменные таблицы не являются вариантом для отката транзакций, поэтому в этом случае вам будет лучше с временными таблицами.

Наконец, временные таблицы всегда будут увеличивать дисковый IO, поскольку они всегда используют tempdb, в то время как переменные таблицы могут не увеличивать его, в зависимости от уровней напряжения памяти.

Сообщите мне, если вам нужны советы о том, как настроить ваш tempdb, чтобы заработать гораздо более высокую производительность, чтобы превысить 100%!

Ответ 7

CREATE TABLE #tmptablename

Используйте префикс знака хеша/фунта

Ответ 8

Синтаксис, который вы хотите, это:

создать таблицу #tablename

ПрефикС# указывает таблицу как временную таблицу.