2013-05-29 30 views
-1

從我的SQL Server中檢索數據非常緩慢。有人看到問題嗎?使用C檢索數據時,SQL Server速度非常慢

創建SQL Server表:

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

     BEGIN 
     CREATE TABLE " + jaartal + @"(
     [code] [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(); 

從SQL Server檢索數據:

我有一個表,所以每年我必須看所有這些表。

但我在所有的數據庫中有1000 000行。

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

我也使用過濾器與where語句不接收所有數據。

有時我也有系統內存異常。

有沒有人有這些問題的解決方案?

+8

你做錯了。 –

+0

然後我錯了什麼?我在catch事件中增加了aantalfouten。當tabelname沒有被激怒時,他會去捕捉。這會給出錯誤,我會增加錯誤的數量 – user2282583

+0

這裏有很多可能性。我會做的第一件事是嘗試確定緩慢發生在sql還是C#端。你可以直接在數據庫上運行你的查詢(即不是通過C#),看看它需要多長時間,以及實際的執行計劃產生了什麼? – Johnv2020

回答

3

您正在運行查詢,直到您有40個故障,這意味着您繼續運行您的查詢,直到您有40個異常。當內存不足時會出現異常情況...這意味着在崩潰之前您將檢索大量數據,這將需要一段時間。

刪除的時候,你會沒事的。

或者你想得到40 jaartabellen?更改aantalfouten到jaartaltabel:

while (aantalfouten < 40) ====> while (jaartaltabel < 40) 

我覺得你的過濾器是在桌子上的[datum] [datetime] NULL列,因此在數據列中添加一個索引將提高你的查詢,如果你在你的表有大量的數據(在結束你的創建表查詢)。

CREATE NONCLUSTERED INDEX IX_"+jaartal+" ON "+jaartal+" 
(
    datum 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW 
+0

與aantalfouten循環不是問題。問題是從SQL服務器檢索數據會變慢 – user2282583

+1

你有一個幾乎無止境的循環(你有多少個jaartaltabel?)。問題不在於你的sql,而在你的代碼中。 Abeit你的SQL可以更好:列名,索引,SQL注入,參數化查詢等 – Peter

+0

但我只能帶廣告的指數基準 – user2282583

1

in while loop if everythg ok可以使用break;出來的循環

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(); 
     SqlCommand sqlcmd = 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);//Select statement 
     SqlDataAdapter adp = new SqlDataAdapter(sqlcmd); 
     DataSet ds = new DataSet(); 
     adp.Fill(ds); 

     connection.Close(); 

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

while循環是沒有問題的。問題是用databel.load指令接收數據需要很多時間 – user2282583