Frage

Vor kurzem habe ich damit begonnen, einige unserer Anwendungen auf Support umzustellen MS SQL Server als alternatives Backend.

Eines der Kompatibilitätsprobleme, auf die ich gestoßen bin, ist die Verwendung von MySQLs CREATE TEMPORARY TABLE zum Erstellen von In-Memory-Tabellen, die Daten für einen sehr schnellen Zugriff während einer Sitzung enthalten, ohne dass eine permanente Speicherung erforderlich ist.

Was ist das Äquivalent in MS SQL?

Eine Voraussetzung ist, dass ich die temporäre Tabelle wie jede andere verwenden kann, insbesondere JOIN es mit den permanenten.

War es hilfreich?

Lösung

@Keith

Dies ist ein weit verbreitetes Missverständnis:Tabellenvariablen werden NICHT unbedingt im Speicher gespeichert.Tatsächlich entscheidet SQL Server, ob die Variable im Speicher bleibt oder an TempDB übertragen wird.Es gibt keine zuverlässige Möglichkeit (zumindest in SQL Server 2005), sicherzustellen, dass Tabellendaten im Speicher verbleiben.Für detailliertere Informationen schauen Sie Hier

Andere Tipps

Sie können Tabellenvariablen (im Speicher) und zwei verschiedene Arten von temporären Tabellen erstellen:

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

Bearbeiten:

Aufgrund des Feedbacks denke ich, dass dies einer kleinen Klarstellung bedarf.

#table Und ##table wird immer in TempDB sein.

@Table Variablen befinden sich normalerweise im Speicher, dies kann jedoch nicht garantiert werden.SQL entscheidet auf Grundlage des Abfrageplans und verwendet bei Bedarf TempDB.

Sie können eine „Tabellenvariable“ in SQL Server 2005 wie folgt deklarieren:

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

Sie beziehen sich dann darauf wie auf eine Variable:

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

Es ist nicht nötig, es zu löschen – es verschwindet, wenn die Variable den Gültigkeitsbereich verlässt.

Dies ist mit MS SQL Server 2014 möglich.

Sehen: http://msdn.microsoft.com/en-us/library/dn133079.aspx

Hier ist ein Beispiel für SQL-Generierungscode (von 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

Eine gute Blogbeitrag hier Aber grundsätzlich stellen Sie lokalen temporären Tabellen das Präfix # und globalen temporären Tabellen das Präfix ## voran – z

CREATE TABLE #localtemp

Ich verstehe, was Sie erreichen wollen.Willkommen in der Welt der Datenbankvielfalt!

SQL Server 2000 unterstützt temporäre Tabellen, die erstellt werden, indem dem Tabellennamen ein # vorangestellt wird, wodurch es zu einer lokal zugänglichen temporären Tabelle (lokal für die Sitzung) wird, und indem dem Tabellennamen ein ## vorangestellt wird, für global zugängliche temporäre Tabellen, z. B. #MyLocalTable und ##MyGlobalTable jeweils.

SQL Server 2005 und höher unterstützen sowohl temporäre Tabellen (lokal, global) als auch Tabellenvariablen – achten Sie auf neue Funktionen für Tabellenvariablen in SQL 2008 und Release 2!Der Unterschied zwischen temporären Tabellen und Tabellenvariablen ist nicht so groß, sondern liegt in der Art und Weise, wie der Datenbankserver damit umgeht.

Ich möchte nicht über ältere Versionen von SQL Server wie 7, 6 sprechen, obwohl ich mit ihnen gearbeitet habe und ohnehin von dort komme :-)

Es ist üblich zu glauben, dass Tabellenvariablen immer im Speicher liegen, aber das ist falsch.Abhängig von der Speichernutzung und dem Transaktionsvolumen des Datenbankservers können die Seiten einer Tabellenvariablen aus dem Speicher exportiert und in tempdb geschrieben werden und der Rest der Verarbeitung findet dort (in tempdb) statt.

Bitte beachten Sie, dass es sich bei tempdb um eine Datenbank auf einer Instanz ohne permanente Objekte handelt, sie jedoch für die Verarbeitung von Arbeitslasten mit Nebentransaktionen wie Sortieren und anderen Verarbeitungsarbeiten verantwortlich ist, die vorübergehender Natur sind.Andererseits werden Tabellenvariablen (normalerweise mit kleineren Daten) im Arbeitsspeicher (RAM) gehalten, was den Zugriff auf sie beschleunigt und daher weniger Datenträger-IO im Hinblick auf die Verwendung des Tempdb-Laufwerks verursacht, wenn Tabellenvariablen mit kleineren Daten im Vergleich zu temporären Tabellen verwendet werden, die dies immer tun Melden Sie sich bei tempdb an.

Tabellenvariablen können nicht indiziert werden, während temporäre Tabellen (sowohl lokale als auch globale) für eine schnellere Verarbeitung bei großen Datenmengen indiziert werden können.So kennen Sie Ihre Wahl im Falle einer schnelleren Verarbeitung größerer Datenmengen durch temporäre Transaktionen.Es ist auch erwähnenswert, dass Transaktionen auf Tabellenvariablen allein nicht protokolliert werden und nicht zurückgesetzt werden können, während Transaktionen auf temporären Tabellen rückgängig gemacht werden können!

Zusammenfassend lässt sich sagen, dass Tabellenvariablen für kleinere Daten besser geeignet sind, während temporäre Tabellen für größere Daten, die vorübergehend verarbeitet werden, besser geeignet sind.Wenn Sie auch eine ordnungsgemäße Transaktionssteuerung mithilfe von Transaktionsblöcken wünschen, sind Tabellenvariablen keine Option zum Zurücksetzen von Transaktionen. Daher sind Sie in diesem Fall mit temporären Tabellen besser bedient.

Schließlich erhöhen temporäre Tabellen immer die Festplatten-IO, da sie immer tempdb verwenden, während Tabellenvariablen diese je nach Speicherbelastung möglicherweise nicht erhöhen.

Lassen Sie mich wissen, wenn Sie Tipps zur Optimierung Ihrer Tempdb benötigen, um eine viel schnellere Leistung zu erzielen, die über 100 % liegt!

Die gewünschte Syntax ist:

Erstellen Sie die Tabelle #Tabellenname

Das Präfix # identifiziert die Tabelle als temporäre Tabelle.

TABELLE ERSTELLEN #tmptablename

Verwenden Sie das Raute-/Nummernzeichen-Präfix

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top