Avatar billede aadal_dk Nybegynder
05. februar 2004 - 14:12 Der er 11 kommentarer og
1 løsning

Stored Procedure med insert into table er meget langsom.

Jeg er ved at lave en sproc der skal lave en tabel med løbende datoer. den skal gives en parameter til hvor mange år den skal går frem i tiden og så oprette en tabel med datoer.
Jeg har lavet selv princippet i det MEN det tager meget lang tid fordi jeg bruger INSERT INTO for hver linie(Stor problem) og det ville jeg jo helt udenom. Her er koden:
------ T-SQL ----------
DECLARE DatoCursor CURSOR
KEYSET
FOR
SELECT Dato
FROM dbo.tblFinanspost

DECLARE @firstDato AS Datetime
DECLARE @lastDato AS Datetime
DECLARE @countDato AS Datetime
DECLARE @counter AS int

OPEN DatoCursor
FETCH FIRST FROM DatoCursor INTO @firstDato
FETCH LAST FROM DatoCursor INTO @lastDato

SET @countDato = @firstDato
WHILE @countDato != @lastDato
BEGIN
    INSERT INTO dbo.tblDato (DATO)
    VALUES (@countDato)
    SET @countDato = DATEADD(d,1,@countDato)
END

PRINT @firstDato
PRINT @lastDato

CLOSE DatoCursor
---------------------------
Jeg ville gerne oprette en "virtuel" tabel (ligesom et array) og derefter fylde det over i tabelle: eller oprette den inde kode, men jeg ved ikke lige hvordan man gør :-(
Hvis der er andre forslag til hvordan man kunne lave noget der gør det samme ville det også hjælpe. jeg bruger MS SQL server og det hele skulle gern puttes derind :-)

Mvh
Anders Aadal
Avatar billede runesoft Nybegynder
05. februar 2004 - 14:19 #1
noget i denne stil:
insert into dintabel (felt1) (select dato from dinanden tabel where ....)
Avatar billede aadal_dk Nybegynder
05. februar 2004 - 14:30 #2
Ja men jeg skal jo lave min datoer(oprette "dinanden tabel") først, og det er der jeg skal bruge en anden sætning end insert into.
Avatar billede runesoft Nybegynder
05. februar 2004 - 14:40 #3
ok, så har jeg misforstået...
Så vil jeg komme med et andet spørgsmål! Hvorfor!

Din tabel vil kun indeholde indlysende data, og indholdsværdien vil derfor være meget lille.
Avatar billede runesoft Nybegynder
05. februar 2004 - 14:42 #4
Jeg kan ikke se hvad en sådan tabel vil kunne bruges til. Hvis du skal bruge den til at relatere andre tabeller til, kan du jo bare oprette datoen, når der er brug for den.
Avatar billede aadal_dk Nybegynder
05. februar 2004 - 14:57 #5
Jeg skal bruge den i en Kube så jeg ikke under processering skal til at lave en Disitinct(Dato) på alle min finans poster ca. 3-4 millioner men kun på de unikke og derved "linke" dem på dato som id key. det spare også en del når jeg har 3-4 dato dimension at de kun skal kigge i denne lille tabel.
Sener skal der også skrives måndes navn og dags navn ind i kolonner ved siden af. Så man kan holde styr på skæve rengskabsår(Analysis Service kan dette men ikke hvis man vil splitte datoer op i dimension af dim År, dim Måned, dim Dag).
Normalt ville man have denne opdeling hvis databasen var normaliseret oprdentlig evt
|dateId|Date|dateMonth| osv linket til din posteringers dateID. MEN sådan opføre XAL sig ikke, her er stort set det hele i én tabel(skidt!)
Avatar billede trer Nybegynder
06. februar 2004 - 09:27 #6
du kan bruge en table-variabel som vist nedenfor. @d1 er din start-dato, @d2 er din slutdato.

Den vil være en smule hurtigere end den du allerede har, men TSQL er ikke specielt godt til at loope

create procedure makedates(@d1 datetime, @d2 datetime)
as
begin
declare @c int
set @c = datediff(d,@d1,@d2)

declare @t table(dato datetime)
--begin transaction
While @c>0 begin
  insert into @t values(@c+@d1)
  set @c=@c-1
end
--commit transaction
select *
from $t
order by 1
end
go

Mvh
Troels
Avatar billede aadal_dk Nybegynder
06. februar 2004 - 11:02 #7
Det var jo lige DET tusind tak.
Avatar billede trer Nybegynder
06. februar 2004 - 11:11 #8
Tak for points. 

Prøv i øvrigt at lege med at sætte en transaktion på (som vist ovenfor), og husk at angive locking hints ved bulk updates.

Hvis du sætter locking-hint (TABLOCK) efter tabelnavnet når du overfører til den reelle permanente tabel vil du slippe for overhead ved låsninger (låse-eskalering) og dermed opnå bedre performance.  Det er specielt anvendeligt når det drejer sig om loads hvor der ikke er brugere på systemet.
Avatar billede aadal_dk Nybegynder
06. februar 2004 - 14:16 #9
Jeg vil lige lege med det (lockin-hint).
Det var jo meget rart at vide da jeg så sent som i mandag lagde 2 servere(kun 2,4Ghz men alligevel) ned i 3-4 timer ved at køre en insert into med mange unions... Det kunne den ikke lide, men fik rette op på det ved at opdele det i en DTS pakke.. Det kunne være at det hjalp yderligere at låse lidt op først :-)
Avatar billede trer Nybegynder
06. februar 2004 - 15:01 #10
Hmm.. måske skulle jeg henvise dig til mine artikler om basal performance tuning på sql server? 

fx: Hvis du ikke har behov for sortering og fjernelse af dubletter, så bør du benytte en UNION ALL fremfor en UNION - det vil øge performance.

Og en anden ting - hvis du laver seriøse loads, så skal du bruge optionen (KEEP_PLAN) - eller også skal du slå automatisk statistik opdatering fra.  Ellers bliver statistikkerne opdateret når 20% af rækkerne er opdateret - og så skal queryen rekompileres og ny query plan laves => overhead.  Performance er bedre hvis man manuelt opdaterer statistikker efter load. 

Overvej også at fjerne indeks helt før load - det er ofte mere effektivt at oprette et nyt indeks end det er at opdatere.

Sidste - bruger du clustered indeks? Clustered indeks lagrer data i fysisk orden, så hvis data loades ind i en tabel i en anden orden, så skal data løbende reorganiseres - og det koster....
Avatar billede aadal_dk Nybegynder
06. februar 2004 - 15:09 #11
Jeg brugte UNION ALL og men før brugte jeg DELETE men fandt ud af at det tog alt for lang tid! så jeg droppede tabellen og oprettede indexs bagefter.
Men jeg andede ikke der var forskel på UNION / ALL. Jeg er lidt af en newbie skal jeg fortællet dig.... hvis du da ikke allerede havde regnet det ud :-) kun leget med sproc/udf osv. i denne uge.
Henvis mig endelig jeg er sikker på jeg vil lære en DEL :-D
Avatar billede trer Nybegynder
06. februar 2004 - 16:06 #12
Du finder dem her: http://www.eksperten.dk/artikler/Databaser/MS-SQL/

Håber du får noget ud af dem :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester