Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Поддерживает ли MS-SQL таблицы в памяти?
Недавно я начал изменять некоторые из наших приложений, чтобы поддерживать MS SQL Server в качестве альтернативного бэк-энда.
Одна из проблем совместимости, с которой я столкнулся,-это использование функции MySQL CREATE TEMPORARY TABLE для создания таблиц в памяти, которые содержат данные для очень быстрого доступа во время сеанса без необходимости постоянного хранения.
Что такое эквивалент в MS SQL?
Требование состоит в том, что мне нужно иметь возможность использовать временную таблицу так же, как и любую другую, особенно JOIN с постоянными таблицами.
Можно создать табличные переменные (в памяти) и два различных типа временных таблиц:
--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, если это необходимо.
@Keith
Это распространенное заблуждение: табличные переменные NOT обязательно хранятся в памяти. На самом деле сервер SQL решает, оставить ли переменную в памяти или передать ее в TempDB. Нет надежного способа (по крайней мере, в SQL Server 2005) обеспечить хранение табличных данных в памяти. Для получения более подробной информации смотрите здесь
Вы можете объявить "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
Нет необходимости отбрасывать его-он уходит, когда переменная выходит за пределы области видимости.
Это возможно с 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
Хороший пост в блоге здесь , но в основном префикс локальных временных таблиц с # и глобальной temp с # # - eg
CREATE TABLE #localtemp
Я понимаю, чего ты хочешь добиться. Добро пожаловать в мир разнообразных баз данных!
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%!