Сведения о вопросе

1234123213

13:07, 28th August, 2020

Теги

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

Просмотров: 438   Ответов: 8

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

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

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

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



  Сведения об ответе

repe

15:48, 19th August, 2020

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

--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)
)

Редактировать:

После обратной связи я думаю, что это нуждается в небольшом уточнении.

#table и ##table всегда будут в TempDB.

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


  Сведения об ответе

#hash

03:15, 16th August, 2020

@Keith

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


  Сведения об ответе

PAGE

19:12, 9th August, 2020

Вы можете объявить "table variable" в SQL Server 2005, как это:

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

Затем вы ссылаетесь на него как на переменную:

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

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


  Сведения об ответе

KOMP

16:01, 21st August, 2020

Это возможно с 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


  Сведения об ответе

SILA

18:09, 13th August, 2020

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

CREATE TABLE #localtemp


  Сведения об ответе

ASSembler

21:06, 1st October, 2020

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

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

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

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

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

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

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

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

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

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


  Сведения об ответе

DINO

19:23, 11th August, 2020

СОЗДАТЬ ТАБЛИЦУ #tmptablename

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


  Сведения об ответе

ASSembler

19:27, 26th August, 2020

Синтаксис, который вам нужен, таков:

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

Префикс # определяет таблицу как временную таблицу.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться