webForumDet fria alternativet

Temporärtabeller i minnet på SQL Server

Webbutveckling

11 svar · 492 visningar · startad av OveRRidE

Medlem sedan feb. 200112 078 inlägg
Frågan#1

Tjo. Nu kommer det en sån där krånglig fråga igen. ;)

Jag behöver kunna skapa en temporär tabell i minnet på en SQL Server, som inte har en, på disk, fysisk gestaltning (helst) som jag kan lägga till, ändra och radera data från.

Jag har hört nåt om IMDB (In Memory DataBase), men tydligen la Microsoft ner den tekniken efter RC2 av Windows 2000. (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncomser/html/whatimdb.asp)

Någon som vet hur man gör?

Medlem sedan feb. 20011 198 inlägg
#2

en vanlig create table fast du skriver # framför tabellnamnet.

create table #nisse
(
namn varchar(50)
)
insert #nisse (namn) values('jag heter nils')
select * from #nisse
update #nisse set namn = 'jag heter inte nils'
select * from #nisse

drop table #nisse
Medlem sedan dec. 19995 874 inlägg
#3

För att skapa den i minnet gör du:

declare @tbl table(username varchar(50))
insert into @tbl (username) values('Brimba')
insert into @tbl (username) values('OveRRidE')
Medlem sedan feb. 200112 078 inlägg
#4

Yeah, that's what I'm talking about! :D

  1. Hur länge allokeras den i minnet?
  2. Har den några begränsningar?
  3. Finns det någon risk att datat lagras på disk (förutom i ev. swap)?
Medlem sedan dec. 19995 874 inlägg
#5

1. På samma sätt en vilken annan variabel som helst som du deklarerar.

2. Ja men #tbl och @tbl skiljer sig åt i sina begränsningar. Begränsningarna är få, men jag har stött på någon begränsning när man bygger en egen funktion. Minns dock inte exakt hur det var för det går exempelvis utmärkt att returnera en temporärtabell oavsett om den är deklarerad eller skapad på disk. Du kan även skapa index och joins mot tabellen. Begränsningarna

3. När du skapar en temporärtabell genom create table lagras den alltid på disk, det kan iofs vara en fördel eftersom du då inte riskerar att förlora den på samma sätt som när du deklarerar en tabell.
Om du skapar en tabell genom ##tbl blir den dessutom global och kan användas i andra frågor.
När du skapar en tabell genom create #table skall du tänka på att radera tabellen när du är klar med den med drop #tbl även om det oftast är så att den raderas automatiskt. (exempelvis när en SP är slutförd).
All information om din temporärtabell (#tbl) sparas i sysobjects i tempdb. Detta sker inte när du deklarerar din tabell.

Medlem sedan feb. 200112 078 inlägg
#6
  1. Okej, inte så länge då med andra ord? Men om jag vill att tabellen skall finnas så länge servern är vaken?

  2. Är det @tbl som rekommenderas då eller? Jag får felmeddelanden på din kod;

    Server: Msg 170, Level 15, State 1, Line 1
    Line 1: Incorrect syntax near 'baluba'.
    

    .

  3. Jag vill att den inte skall finnas i fysisk form på servern, det har lite med säkerheten att göra.

    Det jag vill åstakomma är; 1.) Hämta data och joxa lite med det. 2.) Fös in i temporärtabellen i minnet. 3.) Gör en sökning mot minnestabellen.

Medlem sedan dec. 19995 874 inlägg
#7

3. Skall du hämta data, redigera, söka i en och samma SP?

Medlem sedan feb. 200112 078 inlägg
#8

Nej, datat måste ut en runda genom ett C++-API först, så det blir inte i en och samma SP, nej.

Medlem sedan dec. 19995 874 inlägg
#9

Ok, då föreslår jag att du skapar en global temporärtabell

CREATE TABLE ##tbl (ID INT PRIMARY KEY)
INSERT INTO ##tbl VALUES (1)
INSERT INTO ##tbl VALUES (2)

Denna kan du sedan använda att söka i en annan session.
Men om det blir säkrare än att skapa en riktig tabell det vet jag inte. Du kan ju ändra rättigheter om du så vill. Men jag vet inte riktigt vad du vill göra heller.

Medlem sedan feb. 200112 078 inlägg
#10

Ok. Men då kommer tabellen att finnas någonstans på disk antar jag? Det är som sagt något som jag vill undvika så långt som möjligt, det är därför jag vill ha tabellen i minnet och ingen annanstans.

1. Hämta data.
2. Dekryptera data.
3. In i minnet.
4. Sök.
5. Förstör.

Dekrypterad data får aldrig finnas på disken.

Medlem sedan feb. 200112 078 inlägg
#11

Nu kom jag iallafall på varför jag fick meddelande på din kod.

Professional SQL Server Programming skrev:

Datatype Name: Table
Class: Other
Nature of the data: Brand new in SQL Server 2000. [..]

Jag använder SQL Server 7. :l

Medlem sedan dec. 19995 874 inlägg
#12

Beskriv gärna förfarandet också. Hur hämtar du datan, var dekrypteras den? När skickas den in i minnet? Hur många gånger skall man kunna söka? När skall den förstöras?

278 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
138 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)