Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Undvik flaskhalsar med temporära tabeller

Postad 2002-09-12 av Anna-Karin Söderberg i sektionen ASP.NET, C#, Okategoriserat med 0 Kommentarer | Läst av: 4046, Betyg: 45%

Förord

Vet du om att genom att fylla en SQL-servers temporära tabell så kan du få stora prestanda problem med sk flaskhalsar på din server? Problemen kan uppstå både på SQL server 6.5 och 7.0 på olika sätt, i den här artikeln ska jag visa hur man bäst undviker dem.
Innehåll
  » Flaskhalsar i SQL Server 6.5
  » Genväg till en lösning
  » Flaskhalsar i SQL Server 6.5 och 7.0
  » Fortsatt läsning


Flaskhalsar i SQL Server 6.5

Många använder en SELECT ... INTO fråga för att skapa en temporär tabell, liknande det här:


SELECT *
INTO #TempTable
FROM SourceTable


När det här körs så skapar det låsningar mot den temporära tabellen under SELECT frågans körning (kan ta en tid om du loopar genom mycket data i källtabellen och ännu längre om SELECT....INTO är starten på en längre explicit körning). När låsningen väl är så kan ingen annan användare skapa en temporär tabell. Den riktigt placeringen av flaskhalsen är en låsning på tempdb system tabell. I senare versioner av SQL server är den här låsningsmodellen ändrad och problemet undviks därmed.

Om ett antal konkurrerande processer försöker att ladda en temporär tabell på det här sättet, speciellt stora om kvantiteter data är med, då är en flaskhals ofrånkomlig. Tricket är att frigöra tempdb för att säkerställa att "skapa temporär tabell" delen av operationen är skapad så fort som möjligt. För att göra detta, koda om ovanstående fråga till det här:


CREATE TABLE #temp
(
......
)

INSERT #temp
SELECT *
FROM SourceTable


På det här sättet skapar vi vår temporära tabell och frigör sysobjekt eller schema låsningar så fort det bara går, reducerar påtagligt låsning och höjer prestandan.


Genväg till en lösning

Om du vill undvika att koda INSERT...INTO frågan, eller om du skriver en generell kod och om du inte kommer att veta den exakta tabell definitionen före körning, då kan du återgå till detta trick.


SELECT *
INTO #temp
FROM SourceTable
WHERE 1 = 0

INSERT #temp
SELECT *
FROM SourceTable


Självklart kommer WHERE 1=0 aldrig att vara sann. Oavsett hur mycket data som finns i källtabellen så är SQL serverns optimerare smart nog att inse att eftersom ett aldrig är lika med noll så är det ingen ide att söka igenom källtabellen.(Om jag kan så kollar jag alltid frågekörnings delen just för att vara säker, men än har det inte hänt.) Även om SQL servern inte kommer att gå igenom källtabellen, #temp tabellen kommer fortfarande att skapas, baserad på formatet på datat i SELECT frågan, men den kommer inte att innehålla några rader. Du kan sen köra INSERT...SELECT frågan säker på att du inte blockerar andra processers försök att accessa tempdb.


Flaskhalsar i SQL Server 6.5 och 7.0

För det mesta, problemen beskrivna ovanför stämmer inte på SQL server 7.0, men det finns fortfarande en instans där du oavsiktligt kan skapa de här flaskhalsarna under varje version av SQL server.

Problemet uppstår när du använder en INSERT...EXEC fråga för att fylla en temporär tabell, eftesom den lagrade proceduren självt skapar temporära tabeller, och du fastnar med en låsning på tempdb liknande det som beskrevs ovanför. Den föreslagna lösningen är antingen "gör det inte i första taget", vilket är obekvämt om du inte vill hålla på med arv frågor eller kod som du inte kontrollerar eller annars köra en lagrad procedur som en remote lagrad procedur (t ex."INSERT #temp EXEC server.database.owner.proc") vilket igen inte är är ett ideal under alla omständigheter.


Fortsatt läsning

Kolla den här artikeln på Technet för mer information om tempdb låsnings problem i SQL 6.5 och även artikeln som handlar om låsningsproblem som finns både i SQL 6.5 och 7.0
Upp

0 Kommentarer

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
301
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies