Binnenhalen data te traag

Status
Niet open voor verdere reacties.

666joe666

Gebruiker
Lid geworden
23 nov 2005
Berichten
137
Het binnenhalen van data van mijn SQL server is zeer traag. Ookal stel ik de filter van mijn where commando steng in.
Ik maak gebruik van volgende code.

tabel aanmaken:
Code:
using (SqlCommand cmd = connection.CreateCommand())
{
    cmd.Parameters.AddWithValue("jaar", jaartal);
    cmd.CommandText =
        @" 

       BEGIN
       CREATE TABLE " + jaartal + @"(
        [noparse][code][/noparse] [Varchar](max) NULL,
        [type] [Varchar](max) NULL,
        [datum] [datetime] NULL,
        [uur] [Varchar](max) NULL,
        [controller] [Varchar](max) NULL,
        [fout] [Varchar](max) NULL,
        [teller] [Varchar](max) NULL,
        [omschrijving] [Varchar](max) NULL,
        [graad] [Varchar](max) NULL,
        [var1] [Varchar](max) NULL,
        [var2] [Varchar](max) NULL,
        [var3] [Varchar](max) NULL,
        [var4] [Varchar](max) NULL,
        [var5] [Varchar](max) NULL,
        [var6] [Varchar](max) NULL,
        [var7] [Varchar](max) NULL,
        [var8] [Varchar](max) NULL,
        [var9] [Varchar](max) NULL,
        [var10] [Varchar](max) NULL,
        [var11] [Varchar](max) NULL,
        [var12] [Varchar](max) NULL,
        [var13] [Varchar](max) NULL,
        [var14] [Varchar](max) NULL,
        [var15] [Varchar](max) NULL,
        [var16] [Varchar](max) NULL,
        [var17] [Varchar](max) NULL,
        [var18] [Varchar](max) NULL,
        [var19] [Varchar](max) NULL,
        [var20] [Varchar](max) NULL,
        [var21] [Varchar](max) NULL,
        [var22] [Varchar](max) NULL,
        [var23] [Varchar](max) NULL,
        [var24] [Varchar](max) NULL,
        [var25] [Varchar](max) NULL,
        [var26] [Varchar](max) NULL,
        [var27] [Varchar](max) NULL,
        [var28] [Varchar](max) NULL,
        [var29] [Varchar](max) NULL,
        [var30] [Varchar](max) NULL,
        [var31] [Varchar](max) NULL,
        [var32] [Varchar](max) NULL,
        [var33] [Varchar](max) NULL,
        [var34] [Varchar](max) NULL,
        [var35] [Varchar](max) NULL,
        [var36] [Varchar](max) NULL,
        [var37] [Varchar](max) NULL,
        [var38] [Varchar](max) NULL,
        [var39] [Varchar](max) NULL,
        [var40] [Varchar](max) NULL,
        [Cat_MMAP] [Varchar](max) NULL
        ); END";

    try
    {           
        cmd.ExecuteNonQuery();
    }
    catch
    { 
    }
}

connection.Close();

Retrieving data from SQL Server:

Ik heb een tabel voor ieder jaar.
Daarom wil ik al deze tabellen inlezen.
Echter gaat dit om een groot aantal gegevens (10000000 rijen)

Code:
Tbl_events.Columns.Clear();

aantalfouten = 0; //numbers of error 
jaartaltabel = DataContainer.jaartalstart;
statusbalk.Value=statusbalk.Minimum;

while (aantalfouten < 40)
{
    try
    {
        statusbalk.Visible = true;

        tabelnaam = "Evenementen" + jaartaltabel.ToString(); //create name of the table that i want to read so as Events2013                       
        connection.Open(); 
        datatabel.Load(new SqlCommand("SELECT type,datum,uur,controller,fout,teller,omschrijving,graad,var1,var2,var3,var4,var5,var6,var7,var8,var9,var10,var11,var12,var13,var14,var15,var16,var17,var18,var19,var20,var21,var22,var23,var24,var25,var26,var27,var28,var29,var30,var31,var32,var33,var34,var35,Cat_MMAP  FROM " + tabelnaam + " where " + filter + "", connection).ExecuteReader());//Select statement
        connection.Close();

        Tbl_events.DataSource = datatabel.DefaultView; //insert the data in my datagridview this takes also a  lot of time
        jaartaltabel++;
    }
    catch
    {
        jaartaltabel++;
        aantalfouten++;
        connection.Close();
    }
}
ColumnWidth();

Soms krijg ik ook een system out of memory exception.
Iemand een idee wat ik verkeer doe.
 
Laatst bewerkt door een moderator:
Vind ik niet zo raar. Een Varchar(Max) bevat kan tot 2147483647 bytes data bevatten. Dat doe je dan 35x per record.
En een tabel voor ieder jaar? Tijd om de database eens te normaliseren zou ik zeggen.
 
Alvast bedankt voor je reactie.
De varchar neemt toch enkel de plaats in die hij nodig heeft voor de tekst?
Is er dan een betere manier om de tekst opteslaan?

Het probleem zit niet in de meerdere tabellen maar het binnehalen van de data van een tabel.
 
niet als je er (max) van maakt maak er dan varchar() van die doet wel wat je denkt.
 
Wanneer ik nu data wil zendern naar de tabel krijg ik deze fout "'String or binary data would be truncated.
The statement has been terminated." Ik heb de tabel als volgend aangemaakt [var39] [Varchar] NULL,
Met lege haakjes werkte dit niet.

Heb nu de waardes ingevuld tussen da haakjes.
Nu weer 2 dagen wachten tot alle evenemeten zijn ingeladen en dan opnieuw proberen

Zal hiermee het probleem van de system out of memory exception ook opgelost zijn?

Mod: Gelieve de knop "Bericht aanpassen" gebruiken wanneer je toevoegingen hebt en er geen reacties tussendoor zijn.
 
Laatst bewerkt door een moderator:
Vind ik niet zo raar. Een Varchar(Max) bevat kan tot 2147483647 bytes data bevatten. Dat doe je dan 35x per record.

Hoeveel een veld kan bevatten maakt nauwelijks uit voor de snelheid. Als een veld niet gebruikt wordt worden de bytes op disk gewoon overgeslagen.

Als in al die velden een paar kilobyte data staat die geselecteerd wordt dan moeten er potentieel vele megabytes aan data worden teruggegeven en dat kan even duren.


Maar zoals altijd bij trage queries: wat is de query precies en wat is de EXPLAIN van die query? Als je een paar simpele indexes mist dan zal de database een sequential scan moeten doen en met 1M records zal dat wel even duren.
 
Bedankt voor je reactie.

Nu ben ik terug opnieuw mijn data aan het inladen. nu werkt het inladen van de server vrij vlot. Echter duurt het omzetten van de datatable naar datagridview extreem lang. Hiervoor gebruik ik volgende code :Tbl_events.DataSource = datatabel.DefaultView;

Kan ik de gegevens niet rechtstreeks in een datagridview plaatsen?
 
Echter duurt het omzetten van de datatable naar datagridview extreem lang

Wat duurt er lang, is het de query naar de database toe die traag is, of is het het doorgeven van de data naar je applicatie, of is het je applicatie die de data traag verwerkt? Laat je applicatie eens wat performance logging doen, dat kan zo simpel als het printen van de huidige tijd na elke handeling.

Hoe filtert je datagrid trouwens? Doet hij dat via de query of doet hij dat in de view zelf? Want als hij hetin de view doet is er kans dat hij *alle* records probeert te laden en daar vervolgens uit weg gaat filteren wat jij niet wilt zien. Met zoveel grote records zal dat wel een klats geheugen claimen waar je helemaal dol van wordt.
 
Ik lees de data in van de SQL tabel. Deze komt zo terecht in een datatabel. Dit lijkt allemaal vrij vlot te werken.
Aangezien de data ook zichtbaar moet gemaakt worden in een tabel wil ik deze datatabel in een datagridview plaatsen.
Dit is echter zeer traag. Voor 100 lijnen duurt dit al bijna 15 sec.
Hiervoor gebruik ik volgende code.
Code:
Tbl_events.DataSource = datatabel.DefaultView;

Het filteren van de data doe ik rechtstreeks op mijn sql query met het where commando.
 
Wordt het aanzienlijk sneller als je minder kolommen selecteert, of als je maar 10 records ophaalt?
 
In totaal gaat het om 45 kolommen. Indien ik hier 20 kolommen aflaat blijft het nog zeer traag. In de laatste 20 tabellen zitten variable waarde. Deze waardes zijn vaak niet aanwezig en zijn dus lege cellen
 
Apart. Ik kan me zo moeilijk voorstellen dat het renderen van een tabelletje zo lang moet duren, maar wellicht is dat iets wat je moet googlen.
 
Hum, ik zie nu pas dit:

while (aantalfouten < 40)

Je vult die tabel dus meerdere keren?
 
Ja ik heb een sql tabel per jaar. Daarom moet ik voor ieder jaar de tabel raadplegen. Zo lees ik eerst de tabel voor 2012 in daarna de tabel van 2013 enz.
 
Dus het gaat niet om 100 records, maar 100x het aantal jaren dat je print.
Pikt je datasource het uberhaupt dat je telkens een nieuwe source toewijst?

Ik zou beginnen met het platslaan van die tabellen, maak één query, desnoods naar een view, die de versschillende tabellen aan elkaar knoopt via een UNION of iets dergelijks.
[sql]
SELECT * FROM tabel2013
UNION ALL
SELECT * FROM tabel2012
UNION ALL
SELECT * FROM tabel2011
[/sql]

In sommige databases kun je ook partitionering of overerving toepassen, dan heb je nog wel het voordeel van één tabel per jaar, maar dan zie je in je applicatie gewoon één tabel waar je naartoe leest en schrijft.
 
Heb net mijn code even aangepast.
Nu lees ik een tabel in en voeg ik de data toen aan mijn datagrid.
Zo is de data die ik moet toevoegen kleiner.

Tocht blijft het commando "Tbl_events.DataSource = datatabel.DefaultView;" traag
 
Daar ben ik ook al naar opzoek gegaan maar kan geen veranderingen vinden.
Is het mogelijk dat het sneller is dat ik mijn datagridview wijzig in een listview?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan