Verarbeitung Daten in SQL Datenbank immens verlangsamt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    Verarbeitung Daten in SQL Datenbank immens verlangsamt

    Hallo,

    in meinem aktuellen projekt habe ich irrsinnige timingprobleme.

    Ich habe ein Tool geschrieben, das mit nicht typisierten Dataset sowie Tabellen arbeitet. Im ersten schritt habe ich alles in xml Dateien gespeichert. Was gut ging aber Verwaltungstechnisch nicht mehr überschaubar sowie den Ram schon in der Anfangsphase auf 3GB belastet hat. Hier wurden grade mal 5 von 20 Tabellen erstellt und ausgelesen. Es werden zum schluss ca 20 sein also würde der Ram mit ca. 12 GB belastet werden. Zuviel und ich brauche ja nicht alle daten.Desweiteren dauert das Speicher der Daten jedesmal ca. 40sek. zu lange.

    Also war die Schlussvolgerung ich übertrage die vorhandenen Daten in eine SQL Datenbank und lade mir am anfang nur die benötigten Daten. Das funktioniert auch und die Arbeitspeicher Auslastung liegt bei ca. 800MB und das speichern der daten ist genial kurz mit unter 1sek. . soweit super!!!!

    Jetzt dauert aber die verarbeitung der Daten 55sek. mit der SQL variante und mit der xml Variante nur 3 sek.! Kann einer sagen woran das liegen kann.

    anbei der komplette Code meiner SQL-Klasse! Es betrifft die "AddnewHistoryData" Sub.


    Schonmal danke für jede Idee :)

    Spoiler anzeigen

    Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports System.Windows.Forms
    4. Imports System.Linq
    5. Imports System.Data
    6. Imports System.Data.SqlClient
    7. Imports System.Data.Entity
    8. Imports fxcore2
    9. Imports Trading_Calculators
    10. Public Class SQL_Allgemeine_Funktion
    11. Dim ClassSettings_DS As New ClassSettings
    12. Public SQL_All_Instruments_Table As DataTable
    13. Public SQL_Connection As New SqlConnection
    14. Public SQL_AdapterList As New Dictionary(Of String, SqlDataAdapter)
    15. Public Instrument_History_DS As New Dictionary(Of String, DataSet)
    16. Public AllInstrument_Table As DataTable
    17. Dim SQL_Adapter_AllInstrument_Table As ClassSettingsTableAdapters.All_Instrument_TableTableAdapter
    18. Dim TradingDaysInRAM As Integer = 1825 '5Jahre
    19. Dim Trading_Calc_ALGFunk As New Trading_Calculators.Allgemeine_Funktionen
    20. ''' <summary>
    21. ''' Erstellt ein Verbindung zur Datenbank her
    22. ''' </summary>
    23. Public Sub ConnectToDatabase()
    24. Dim Connection_String As String = "Data Source = DESK_PC_0001 \ TZCADDESIGNSQL;Initial Catalog=Historical_Database;Integrated Security=True"
    25. SQL_Connection.ConnectionString = Connection_String
    26. SQL_Connection.Open()
    27. AllInstrument_Table = ClassSettings_DS.Tables("All_Instrument_Table")
    28. SQL_Adapter_AllInstrument_Table = New ClassSettingsTableAdapters.All_Instrument_TableTableAdapter
    29. SQL_Adapter_AllInstrument_Table.Fill(ClassSettings_DS.All_Instrument_Table)
    30. For Each Selectedrow As DataRow In AllInstrument_Table.Rows
    31. Dim NewDataset As New DataSet
    32. Instrument_History_DS.Add(CStr(Selectedrow("Instrument")).Replace("/", "_").Trim, NewDataset)
    33. Next
    34. End Sub
    35. ''' <summary>
    36. ''' Wird ein neues Instrument gelesen, wird diese neu in der Datenbank erstellt danach laden der vorhandenen Tabellen
    37. ''' </summary>
    38. Public Sub AddInstrumentsToTableSQL(ByVal InstrumentList As List(Of List(Of String)))
    39. For Each DetailInstrument As List(Of String) In InstrumentList
    40. Dim addInstrument As Boolean = True
    41. Dim TabelRow As DataRow
    42. For Each SelectedRow As DataRow In AllInstrument_Table.Rows
    43. If CStr(SelectedRow("Instrument")).Trim = DetailInstrument(0) Then
    44. addInstrument = False
    45. TabelRow = SelectedRow
    46. Exit For
    47. End If
    48. Next
    49. If addInstrument Then
    50. Dim NewRow As DataRow = AllInstrument_Table.NewRow
    51. NewRow.BeginEdit()
    52. NewRow("Instrument_ID") = DetailInstrument(4)
    53. NewRow("Instrument") = DetailInstrument(0)
    54. NewRow("AskTradeable") = DetailInstrument(1)
    55. NewRow("BidTradeable") = DetailInstrument(2)
    56. NewRow("SubscriptionState") = DetailInstrument(3)
    57. NewRow("Table_M5") = Trading_Calc_ALGFunk.GetInstrumentTableName(DetailInstrument(0)) & "_M5"
    58. NewRow("Table_M15") = Trading_Calc_ALGFunk.GetInstrumentTableName(DetailInstrument(0)) & "_M15"
    59. NewRow("Table_M30") = Trading_Calc_ALGFunk.GetInstrumentTableName(DetailInstrument(0)) & "_M30"
    60. NewRow("Table_M60") = Trading_Calc_ALGFunk.GetInstrumentTableName(DetailInstrument(0)) & "_M60"
    61. NewRow.EndEdit()
    62. AllInstrument_Table.Rows.Add(NewRow)
    63. CreateInstrumentTabel(CStr(NewRow("Table_M5")))
    64. CreateInstrumentTabel(CStr(NewRow("Table_M15")))
    65. CreateInstrumentTabel(CStr(NewRow("Table_M30")))
    66. CreateInstrumentTabel(CStr(NewRow("Table_M60")))
    67. SQL_Adapter_AllInstrument_Table.Update(Me.ClassSettings_DS.All_Instrument_Table)
    68. End If
    69. Next
    70. LoadAllInstrument()
    71. End Sub
    72. ''' <summary>
    73. ''' Lädt alle Instrumente aus der SQL Datenbank in den Cash
    74. ''' </summary>
    75. Public Sub LoadAllInstrument()
    76. Dim AllTables As DataTable = SQL_Connection.GetSchema("Tables")
    77. Dim SelectionDay As Date = System.DateTime.UtcNow
    78. For Each SelectedRow As DataRow In AllTables.Rows
    79. If CStr(SelectedRow(2)) Like "*M5" Or CStr(SelectedRow(2)) Like "*M15" Or CStr(SelectedRow(2)) Like "*M30" _
    80. Or CStr(SelectedRow(2)) Like "*M60" Then
    81. Dim Temp_SQL_Adapter As SqlDataAdapter = New SqlDataAdapter("Select * From " & CStr(SelectedRow(2)) & " Where Time >= '" & SelectDaysInTable(CStr(SelectedRow(2))) & "'", SQL_Connection) '
    82. SQL_AdapterList.Add(CStr(SelectedRow(2)), Temp_SQL_Adapter)
    83. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = GetInstrumentName(CStr(SelectedRow(2)))).Value
    84. Temp_SQL_Adapter.FillSchema(Instrument_DS, SchemaType.Source)
    85. Temp_SQL_Adapter.Fill(Instrument_DS, CStr(SelectedRow(2)))
    86. End If
    87. Next
    88. End Sub
    89. Private Function SelectDaysInTable(ByVal InstrumentName As String) As Date
    90. Dim SelectionDay As Date = System.DateTime.UtcNow
    91. Dim InstrumentTempName As String = GetInstrumentName(InstrumentName)
    92. Dim ReturningDate As Date
    93. For Each SelectedRow_Temp As DataRow In AllInstrument_Table.Rows
    94. Dim TempInstrument As String = CStr(SelectedRow_Temp("Instrument")).Replace("/", "_").Trim
    95. If InstrumentTempName = TempInstrument Then
    96. ReturningDate = CDate(SelectedRow_Temp("LastAddDate")).AddDays(-(TradingDaysInRAM))
    97. Exit For
    98. End If
    99. Next
    100. Return ReturningDate
    101. End Function
    102. Private Function GetInstrumentName(ByVal InstrumentName As String) As String
    103. Dim InstrumentTempName As String = ""
    104. If CStr(InstrumentName) Like "*M5" Then
    105. InstrumentTempName = CStr(InstrumentName).Replace("_M5", "")
    106. ElseIf CStr(InstrumentName) Like "*M15" Then
    107. InstrumentTempName = CStr(InstrumentName).Replace("_M15", "")
    108. ElseIf CStr(InstrumentName) Like "*M30" Then
    109. InstrumentTempName = CStr(InstrumentName).Replace("_M30", "")
    110. ElseIf CStr(InstrumentName) Like "*M60" Then
    111. InstrumentTempName = CStr(InstrumentName).Replace("_M60", "")
    112. End If
    113. Return InstrumentTempName
    114. End Function
    115. Private Sub CreateInstrumentTabel(ByVal TableName As String)
    116. Dim CreateTable As String = "CREATE TABLE " & TableName
    117. CreateTable = CreateTable & "(Time datetime NOT Null,"
    118. CreateTable = CreateTable & "ASK NUMERIC(18, 7) NULL,"
    119. CreateTable = CreateTable & "ASKClose NUMERIC(18, 7) NULL,"
    120. CreateTable = CreateTable & "ASKHigh NUMERIC(18, 7) NULL,"
    121. CreateTable = CreateTable & "ASKLow NUMERIC(18, 7) NULL,"
    122. CreateTable = CreateTable & "ASKOpen NUMERIC(18, 7) NULL,"
    123. CreateTable = CreateTable & "BID NUMERIC(18, 7) NULL,"
    124. CreateTable = CreateTable & "BIDClose NUMERIC(18, 7) NULL,"
    125. CreateTable = CreateTable & "BIDHigh NUMERIC(18, 7) NULL,"
    126. CreateTable = CreateTable & "BIDLow NUMERIC(18, 7) NULL,"
    127. CreateTable = CreateTable & "BIDOpen NUMERIC(18, 7) NULL,"
    128. CreateTable = CreateTable & "Volume int NULL)"
    129. Dim ExCommand As SqlCommand = New SqlCommand(CreateTable, SQL_Connection)
    130. ExCommand.ExecuteNonQuery()
    131. ChangePrimarykey(TableName, "Time")
    132. End Sub
    133. Public Sub AddOldHistoryToSQL(ByVal OlDatsets As List(Of DataSet))
    134. For Each SelectedDataset As DataSet In OlDatsets
    135. Dim InstrumentName As String = SelectedDataset.DataSetName
    136. For Each SelectedTabel As DataTable In SelectedDataset.Tables
    137. Dim SQLTableName As String = InstrumentName & "_" & SelectedTabel.TableName
    138. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = InstrumentName).Value
    139. For Each DB_Instrument_table As DataTable In Instrument_DS.Tables
    140. If DB_Instrument_table.TableName = SQLTableName Then
    141. Dim SQL_DataAdapter As SqlDataAdapter = SQL_AdapterList.First(Function(match As KeyValuePair(Of String, SqlDataAdapter)) match.Key = SQLTableName).Value
    142. Dim mycb As New SqlCommandBuilder(SQL_DataAdapter)
    143. For Each SelectedRows As DataRow In SelectedTabel.Rows
    144. Dim NewRow As DataRow = DB_Instrument_table.NewRow
    145. NewRow.BeginEdit()
    146. NewRow("Time") = SelectedRows("Time")
    147. NewRow("ASK") = SelectedRows("ASK")
    148. NewRow("ASKClose") = SelectedRows("ASKClose")
    149. NewRow("ASKHigh") = SelectedRows("ASKHigh")
    150. NewRow("ASKLow") = SelectedRows("ASKLow")
    151. NewRow("ASKOpen") = SelectedRows("ASKOpen")
    152. NewRow("BID") = SelectedRows("BID")
    153. NewRow("BIDClose") = SelectedRows("BIDClose")
    154. NewRow("BIDHigh") = SelectedRows("BIDHigh")
    155. NewRow("BIDLow") = SelectedRows("BIDLow")
    156. NewRow("BIDOpen") = SelectedRows("BIDOpen")
    157. NewRow("Volume") = SelectedRows("Volume")
    158. NewRow.EndEdit()
    159. DB_Instrument_table.Rows.Add(NewRow)
    160. Next
    161. SQL_DataAdapter.Update(DB_Instrument_table)
    162. Exit For
    163. End If
    164. Next
    165. Next
    166. Next
    167. End Sub
    168. Public Sub AddNewColumnToTabel(ByVal TableName As String, ByVal ColumnName As String, ByVal SQLDataType As String, Optional ByVal AllowDBNull As String = "NULL")
    169. Using cmd = New SqlCommand()
    170. cmd.Connection = SQL_Connection
    171. cmd.CommandText = "ALTER TABLE " & TableName & " ADD " & ColumnName & " " & SQLDataType & " " & AllowDBNull
    172. cmd.CommandType = CommandType.Text
    173. cmd.ExecuteNonQuery()
    174. End Using
    175. End Sub
    176. Public Sub ChangePrimarykey(ByVal TableName As String, ByVal ColumnName As String)
    177. Try
    178. Using cmd = New SqlCommand()
    179. cmd.Connection = SQL_Connection
    180. cmd.CommandText = "ALTER TABLE " & TableName & " ADD PRIMARY KEY (" & ColumnName & ")"
    181. cmd.CommandType = CommandType.Text
    182. cmd.ExecuteNonQuery()
    183. End Using
    184. Catch ex As Exception
    185. End Try
    186. End Sub
    187. ''' <summary>
    188. ''' Prüft und fügt neue Historische Daten Hinzu
    189. ''' </summary>
    190. Public Sub AddnewHistoryData(ByVal Instrument As String, ByVal HistoryList As List(Of List(Of Object)))
    191. Dim NormalInstrumentName As String = Instrument
    192. Dim NewRowsAdded As Boolean = False
    193. Dim lastAddedDate As Date = Nothing
    194. Instrument = Trading_Calc_ALGFunk.GetInstrumentTableName(Instrument)
    195. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = Instrument).Value
    196. Dim TempInstrumentTable_M5 As DataTable = Instrument_DS.Tables(Instrument & "_M5")
    197. Dim TempInstrumentTable_M15 As DataTable = Instrument_DS.Tables(Instrument & "_M15")
    198. Dim TempInstrumentTable_M30 As DataTable = Instrument_DS.Tables(Instrument & "_M30")
    199. Dim TempInstrumentTable_M60 As DataTable = Instrument_DS.Tables(Instrument & "_M60")
    200. Dim Secondtime As Date = System.DateTime.Now
    201. Dim timespan_temp As TimeSpan
    202. For Each Detaillist As List(Of Object) In HistoryList
    203. Dim AddNewRow As Boolean = True
    204. Dim Foundrow() As DataRow = TempInstrumentTable_M5.Select("Time = '" & CDate(Detaillist(0)) & "'")
    205. For Each SelectedRow As DataRow In Foundrow
    206. If CDate(SelectedRow("Time")) = CDate(Detaillist(0)) Then
    207. AddNewRow = False
    208. Exit For
    209. End If
    210. Next
    211. If AddNewRow Then
    212. Dim NewRow As DataRow = TempInstrumentTable_M5.NewRow
    213. NewRow.BeginEdit()
    214. lastAddedDate = CDate(Detaillist(0))
    215. NewRow("Time") = CDate(Detaillist(0))
    216. NewRow("ASK") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(1)))
    217. NewRow("ASKClose") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(2)))
    218. NewRow("ASKHigh") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(3)))
    219. NewRow("ASKLow") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(4)))
    220. NewRow("ASKOpen") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(5)))
    221. NewRow("BID") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(6)))
    222. NewRow("BIDClose") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(7)))
    223. NewRow("BIDHigh") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(8)))
    224. NewRow("BIDLow") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(9)))
    225. NewRow("BIDOpen") = Trading_Calc_ALGFunk.AuswahlWaehrung(Instrument, CDbl(Detaillist(10)))
    226. NewRow("Volume") = CInt(Detaillist(11))
    227. NewRow.EndEdit()
    228. TempInstrumentTable_M5.Rows.Add(NewRow)
    229. Dim M15Thread = New System.Threading.Thread(Sub() Me.AddNewTimeSteps(15, NewRow, Instrument, TempInstrumentTable_M15))
    230. Dim M30Thread = New System.Threading.Thread(Sub() Me.AddNewTimeSteps(30, NewRow, Instrument, TempInstrumentTable_M30))
    231. Dim M60Thread = New System.Threading.Thread(Sub() Me.AddNewTimeSteps(60, NewRow, Instrument, TempInstrumentTable_M60))
    232. M15Thread.Start()
    233. M30Thread.Start()
    234. M60Thread.Start()
    235. M15Thread.Join()
    236. M30Thread.Join()
    237. M60Thread.Join()
    238. NewRowsAdded = True
    239. End If
    240. Next
    241. timespan_temp = System.DateTime.Now - Secondtime
    242. Debug.Print("Time All Data: " & timespan_temp.TotalSeconds)
    243. Dim thirdtime As DateTime = System.DateTime.Now
    244. If NewRowsAdded Then
    245. UpdateInstrumentInSQLDatabase(Instrument, "_M5")
    246. UpdateInstrumentInSQLDatabase(Instrument, "_M15")
    247. UpdateInstrumentInSQLDatabase(Instrument, "_M30")
    248. UpdateInstrumentInSQLDatabase(Instrument, "_M60")
    249. ChangeLastAddedDate(NormalInstrumentName, lastAddedDate)
    250. End If
    251. timespan_temp = System.DateTime.Now - thirdtime
    252. Debug.Print("Time SQL: " & timespan_temp.TotalSeconds)
    253. End Sub
    254. Private Sub ChangeLastAddedDate(ByVal Instrument As String, ByVal LastDate As Date)
    255. Try
    256. For Each SelectedRow As DataRow In AllInstrument_Table.Rows
    257. If CStr(SelectedRow("Instrument")).Trim = Instrument Then
    258. SelectedRow.BeginEdit()
    259. SelectedRow("LastAddDate") = LastDate
    260. SelectedRow.EndEdit()
    261. Exit For
    262. End If
    263. Next
    264. SQL_Adapter_AllInstrument_Table.Update(Me.ClassSettings_DS.All_Instrument_Table.Select("", "", DataViewRowState.ModifiedCurrent))
    265. Catch ex As Exception
    266. MessageBox.Show(ex.Message & vbNewLine & ex.Source)
    267. End Try
    268. End Sub
    269. Private Sub UpdateInstrumentInSQLDatabase(ByVal Instrument As String, ByVal Timestep As String)
    270. Try
    271. Dim SQL_DataAdapter As SqlDataAdapter = SQL_AdapterList.First(Function(match As KeyValuePair(Of String, SqlDataAdapter)) match.Key = Instrument & Timestep).Value
    272. Dim mycb As New SqlCommandBuilder(SQL_DataAdapter)
    273. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = Instrument).Value
    274. SQL_DataAdapter.Update(Instrument_DS.Tables(Instrument & Timestep).Select("", "", DataViewRowState.ModifiedCurrent))
    275. SQL_DataAdapter.Update(Instrument_DS.Tables(Instrument & Timestep).Select("", "", DataViewRowState.Added))
    276. Catch ex As Exception
    277. MessageBox.Show(ex.Message & vbNewLine & ex.Source)
    278. End Try
    279. End Sub
    280. ''' <summary>
    281. ''' Fügt neue Historische Daten in anderen Zeitlinien hinzu
    282. ''' </summary>
    283. Private Sub AddNewTimeSteps(ByVal Timestep As Integer, ByVal LastRowTimeM5 As DataRow, ByVal Instrument As String, ByVal Instrument_Table_CurrentTimeStep As DataTable)
    284. Dim addingtime As New List(Of Integer)
    285. Dim NewRowTime As New List(Of Integer)
    286. Dim EndTime As New List(Of Integer)
    287. If Timestep = 15 Then
    288. NewRowTime.Add(0)
    289. addingtime.Add(5)
    290. EndTime.Add(10)
    291. NewRowTime.Add(15)
    292. addingtime.Add(20)
    293. EndTime.Add(25)
    294. NewRowTime.Add(30)
    295. addingtime.Add(35)
    296. EndTime.Add(40)
    297. NewRowTime.Add(45)
    298. addingtime.Add(50)
    299. EndTime.Add(55)
    300. End If
    301. If Timestep = 30 Then
    302. NewRowTime.Add(0)
    303. addingtime.Add(5)
    304. addingtime.Add(10)
    305. addingtime.Add(15)
    306. addingtime.Add(20)
    307. EndTime.Add(25)
    308. NewRowTime.Add(30)
    309. addingtime.Add(35)
    310. addingtime.Add(40)
    311. addingtime.Add(45)
    312. addingtime.Add(50)
    313. EndTime.Add(55)
    314. End If
    315. If Timestep = 60 Then
    316. NewRowTime.Add(0)
    317. addingtime.Add(5)
    318. addingtime.Add(10)
    319. addingtime.Add(15)
    320. addingtime.Add(20)
    321. addingtime.Add(25)
    322. addingtime.Add(30)
    323. addingtime.Add(35)
    324. addingtime.Add(40)
    325. addingtime.Add(45)
    326. addingtime.Add(50)
    327. EndTime.Add(55)
    328. End If
    329. Dim SelectionString As String = ""
    330. For Each SelectedInt As Integer In NewRowTime
    331. If CDate(LastRowTimeM5("Time")).Minute = SelectedInt Then
    332. SelectionString = "New"
    333. Exit For
    334. End If
    335. Next
    336. For Each SelectedInt As Integer In addingtime
    337. If CDate(LastRowTimeM5("Time")).Minute = SelectedInt Then
    338. SelectionString = "Add"
    339. Exit For
    340. End If
    341. Next
    342. For Each SelectedInt As Integer In EndTime
    343. If CDate(LastRowTimeM5("Time")).Minute = SelectedInt Then
    344. SelectionString = "Last"
    345. Exit For
    346. End If
    347. Next
    348. If SelectionString = "New" Then
    349. Dim NewRow As DataRow = Instrument_Table_CurrentTimeStep.NewRow
    350. NewRow.BeginEdit()
    351. NewRow("Time") = LastRowTimeM5("Time")
    352. NewRow("ASK") = LastRowTimeM5("ASK")
    353. NewRow("ASKClose") = LastRowTimeM5("ASKClose")
    354. NewRow("ASKHigh") = LastRowTimeM5("ASKHigh")
    355. NewRow("ASKLow") = LastRowTimeM5("ASKLow")
    356. NewRow("ASKOpen") = LastRowTimeM5("ASKOpen")
    357. NewRow("BID") = LastRowTimeM5("BID")
    358. NewRow("BIDClose") = LastRowTimeM5("BIDClose")
    359. NewRow("BIDHigh") = LastRowTimeM5("BIDHigh")
    360. NewRow("BIDLow") = LastRowTimeM5("BIDLow")
    361. NewRow("BIDOpen") = LastRowTimeM5("BIDOpen")
    362. NewRow("Volume") = LastRowTimeM5("Volume")
    363. NewRow.EndEdit()
    364. ChangeOldClose(CDbl(LastRowTimeM5("ASKOpen")), CDbl(LastRowTimeM5("BIDOpen")), Instrument_Table_CurrentTimeStep)
    365. Instrument_Table_CurrentTimeStep.Rows.Add(NewRow)
    366. End If
    367. If SelectionString = "Add" Or SelectionString = "Last" Then
    368. Dim NewRow As DataRow = Instrument_Table_CurrentTimeStep.Rows(Instrument_Table_CurrentTimeStep.Rows.Count - 1)
    369. NewRow.BeginEdit()
    370. If CDbl(NewRow("ASKHigh")) <= CDbl(LastRowTimeM5("ASKHigh")) Then
    371. NewRow("ASKHigh") = LastRowTimeM5("ASKHigh")
    372. End If
    373. If CDbl(NewRow("ASKLow")) >= CDbl(LastRowTimeM5("ASKLow")) Then
    374. NewRow("ASKLow") = LastRowTimeM5("ASKLow")
    375. End If
    376. If CDbl(NewRow("BIDHigh")) <= CDbl(LastRowTimeM5("BIDHigh")) Then
    377. NewRow("BIDHigh") = LastRowTimeM5("BIDHigh")
    378. End If
    379. If CDbl(NewRow("BIDLow")) >= CDbl(LastRowTimeM5("BIDLow")) Then
    380. NewRow("BIDLow") = LastRowTimeM5("BIDLow")
    381. End If
    382. NewRow("Volume") = CInt(NewRow("Volume")) + CInt(LastRowTimeM5("Volume"))
    383. If SelectionString = "Last" Then
    384. NewRow("ASKClose") = LastRowTimeM5("ASKClose")
    385. NewRow("BIDClose") = LastRowTimeM5("BIDClose")
    386. End If
    387. NewRow.EndEdit()
    388. End If
    389. End Sub
    390. Private Sub ChangeOldClose(ByVal AskClose As Double, ByVal BidClose As Double, ByVal Instrument_Table As DataTable)
    391. If Instrument_Table.Rows.Count > 1 Then
    392. Dim NewRow As DataRow = Instrument_Table.Rows(Instrument_Table.Rows.Count - 1)
    393. NewRow.BeginEdit()
    394. NewRow("ASKClose") = AskClose
    395. NewRow("BIDClose") = BidClose
    396. NewRow.EndEdit()
    397. End If
    398. End Sub
    399. End Class


    *Spoiler eingefügt" ~NoFear23m

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    Ok habe den Fehler gefunden!!! Hier die Lösung :)

    Ich habe die SQLTables in das Dataset geladen. Ich hätte vorher eine Table erstellen müssen(Logisch). Nun Liegen die Zeiten bei angenehmen 1-4 sek je nach datenmenge.

    Hier der Falsche Code:

    VB.NET-Quellcode

    1. Public Sub LoadAllInstrument()
    2. Dim AllTables As DataTable = SQL_Connection.GetSchema("Tables")
    3. Dim SelectionDay As Date = System.DateTime.UtcNow
    4. For Each SelectedRow As DataRow In AllTables.Rows
    5. If CStr(SelectedRow(2)) Like "*M5" Or CStr(SelectedRow(2)) Like "*M15" Or CStr(SelectedRow(2)) Like "*M30" _
    6. Or CStr(SelectedRow(2)) Like "*M60" Then
    7. Dim Temp_SQL_Adapter As SqlDataAdapter = New SqlDataAdapter("Select * From " & CStr(SelectedRow(2)) & " Where Time >= '" & SelectDaysInTable(CStr(SelectedRow(2))) & "'", SQL_Connection) '
    8. SQL_AdapterList.Add(CStr(SelectedRow(2)), Temp_SQL_Adapter)
    9. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = GetInstrumentName(CStr(SelectedRow(2)))).Value
    10. Temp_SQL_Adapter.FillSchema(Instrument_DS As DataSet, SchemaType.Source)
    11. Temp_SQL_Adapter.Fill(Instrument_DS As DataSet,CStr(SelectedRow(2)))
    12. End If
    13. Next
    14. End Sub


    Hier der korigierte Code:

    VB.NET-Quellcode

    1. Public Sub LoadAllInstrument()
    2. Dim AllTables As DataTable = SQL_Connection.GetSchema("Tables")
    3. Dim SelectionDay As Date = System.DateTime.UtcNow
    4. For Each SelectedRow As DataRow In AllTables.Rows
    5. If CStr(SelectedRow(2)) Like "*M5" Or CStr(SelectedRow(2)) Like "*M15" Or CStr(SelectedRow(2)) Like "*M30" _
    6. Or CStr(SelectedRow(2)) Like "*M60" Then
    7. Dim Temp_SQL_Adapter As SqlDataAdapter = New SqlDataAdapter("Select * From " & CStr(SelectedRow(2)) & " Where Time >= '" & SelectDaysInTable(CStr(SelectedRow(2))) & "'", SQL_Connection) '
    8. SQL_AdapterList.Add(CStr(SelectedRow(2)), Temp_SQL_Adapter)
    9. Dim Instrument_DS As DataSet = Instrument_History_DS.First(Function(match As KeyValuePair(Of String, DataSet)) match.Key = GetInstrumentName(CStr(SelectedRow(2)))).Value
    10. Dim test As DataTable = Instrument_DS.Tables.Add() ' erst eine Datatable im Dataset erstellen
    11. test.TableName = CStr(SelectedRow(2)) 'Datatable den Namen der SQLTabelle geben
    12. Temp_SQL_Adapter.FillSchema(test, SchemaType.Source) 'Schema der SQLTabelle übergeben
    13. Temp_SQL_Adapter.Fill(test) 'Daten der SQLTabelle an Datatable übergeben
    14. End If
    15. Next
    16. End Sub
    Uih - mir scheint, was du da baust sind viele viele Datasetse, und jedes hat genau eine DataTable (naja, vlt noch mehr, weiss ja nicht, was du sonst noch da anstellst).
    Nee - du baust es nicht, sondern in Form von Instrument_History_DS besteht das bereits - welchen Datentyp hat Instrument_History_DS?

    Warum tust du nicht alle DataTables in ein einziges Dataset? - dann könntest du - falls es Relationen zwischen den Tabellen gibt - diese auch nutzen.
    Also in der Datenbank sind ja auch alle Tabellen in einer DB - warum daraus viele Datasetse machen?
    Hallo @ErfinderDesRades.

    Instrument_History_DS = New Dictonary(string, Dataset)
    Fast, ich baue vier tabellen in ein Dataset. Hier Logik:

    EUR_USD Datset
    EUR_USD_M5 (Tabel)
    EUR_USD_M15 (Tabel)
    EUR_USD_M30 (Tabel)
    EUR_USD_M60 (Tabel)

    Die Tabellen haben selbst noch keine Relationen zu einander und werden zukünftig keine benötigen. Nur brauche ich auch nicht für jedes Dataset(also 4 Tabellen) eine Datenbank auf dem SQL-Server.Da die DB größe ja unendlich ist. Nur die Performance macht mir zukünftig sorgen, da ich gerne pro Instrument also hier den fall(EUR/USD) für die berechnung von Daten nicht länger wie 1sek bzw. 2sek. haben möchte.
    Ein Dictionary wird viel einfacher verwendet:

    VB.NET-Quellcode

    1. Dim Instrument_DS As DataSet = Instrument_History_DS(GetInstrumentName(CStr(SelectedRow(2))))
    Guck dir Dictionary(Of TKey, TValue) im ObjectBrowser an.
    Und experimentiere auch damit. Ist Wichtig, diese Klasse zu kennen.

    Zu deim Datenmodell kann ich wohl nix sagen, ausser: "Äusserst unkonventionell, verstösst gegen allerlei Regeln der Datenmodellierung".
    Ich hoffe, das ist dir bewusst, und du hast gute Gründe, es so zu machen, und nicht "nach den Regeln der Kunst".
    @ErfinderDesRades was genau meinst du damit "es so zu machen, und nicht nach den Regeln der Kunst"?(Bitte genauer sein) :)
    Ja das mit dem Dictionary, werde ich mir unbedingt noch genauer anschauen müssen.
    naja, die Regeln der Datenmodelliererei zielen vor allem auf Redundanz-Freiheit ab.
    Damit sind sowohl Datenredundanzen gemeint - also dass ein Datum nur an einer Stelle gespeichert wird, und nirgends eine Dublette davon existieren darf.
    Als auch strukturelle Redundanzen - also wenn du eine Entität definierst (etwa eine Addresse) - dass die nur ein einziges mal definiert ist.

    Wenn ich nu sowas lese:

    Rattenfänger schrieb:

    EUR_USD Datset
    EUR_USD_M5 (Tabel)
    EUR_USD_M15 (Tabel)
    EUR_USD_M30 (Tabel)
    EUR_USD_M60 (Tabel)
    Dann scheinen mir da strukturelle Redundanzen vorzuliegen.
    Also ich vermute, die Tabellen EUR_USD_M15 und mw. EUR_USD_M30 etc. sind struklturell äusserst ähnlich oder sogar identisch, und wären sauber modelliert nur eine einzige Tabelle.
    Solche Dinge halt.



    Aber es gibt auch dicke Bücher zum Thema Datenmodellierung, und Fachbegriffe, und zT schwer verständliche Definitionen - die letztlich auch nix anneres bezwecken, als Redundanz-Eliminierung.
    Die berühmteste Regeln sind wohl die 5 "NormalFormen der Datenmodellierung" - google mal danach.
    MinimalForderung an eine Datenbank ist Einhaltung der "3. NormalForm" (auch googlen).



    Mir persönlich sind die Normalform-Definitionen aber zu abstrakt, mathematisch und schwer verständlich.
    Ich konzipiere Datenmodelle lieber im ER-Diagramm ("Entity-Relation-Diagram" - google das). Was dabei herauskommt, erfüllt automatisch die 3.Normalform.

    Ohne Anspruch auf mathematische Korrektheit entwickel ich diese Gedanken auch hier:
    Grundlagen: Relationale Datenmodellierung
    Oder (in den Folge-Tuts weitergehender) auf englisch
    codeproject.com/Articles/10309…l-Datamodel-for-Beginners
    und in den beiden dort verlinkten weitergehenden Tutorials



    Also ganz genau mag ich nicht werden, weil es gibt inne Fachwelt (zu der ich mich nicht zähle) bestimmt mehrere Ansichten bezüglich dessen, was im Einzelnen zu "den Regeln der Kunst" zu gelten hat.
    Einigkeit besteht aber im Ziel: Strikte Eleminierung funktionaler (zB stored Procedures), struktureller (Tabellen-Design) und Daten-Redundanzen (auch Tabellen-Design).

    Genau kann ich besser werden anhand konkreter Beispiele.
    Also wenn ich die Wirklichkeit (Dinge, Geschäftsvorfälle, etc.) verstehe, die im Datenmodell abzubilden ist, kann ich imo nachvollziehbare Vorschläge machen, wie solch redundanzfrei und selbsterklärend zu modellieren ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Du hast Teilweise recht!
    Alle Tabellen haben als ID(Primärschlüssel) die Timespalte.

    Instrument_M5: enthält alle Zeitstempel im 5 minuten tackt.
    instrument_M15: enthält alle Zeitstempel im 15 Minuten Tackt.
    Instrument_M30: enthält alle Zeitstempel im 30 Minuten Tackt.

    usw.

    Da ich aber die Zeit als Primärschlüssel Festgelegt habe, musste ich einzelne tabellen erstellen. Auch möchte ich über Multithreading später 4 oder mehr Tabellen gleichzeitig berechnen und Modifizieren lassen.
    Und ich glaube nicht, das ich auf eine Tabelle mit mehreren Threads schreiben kann!?
    Wie gesagt: äusserst unkonventionell, und:

    ErfinderDesRades schrieb:

    Ich hoffe, das ist dir bewusst, und du hast gute Gründe, es so zu machen, und nicht "nach den Regeln der Kunst".

    Nach Regeln der Kunst hätte man der Tabelle (es gäbe nur eine) mindestens eine ID-Spalte spendiert - vermutlich weitere - ebenfalls wie gesagt: von deinen Geschäftsvorfällen weiss ich nix.
    Ansonsten sind Datenbanken soweit ich weis Threadsicher.
    (Dataset aber nicht, auch hier bin ich nicht sicher, welche Art Tabelle du meinst)
    (und wenn es um Dataset-Tabellen geht, gibts immer noch Wege, die threadsicher zu bearbeiten)
    (aber das kostet Performance)
    (wie gesagt: wenn du gute Gründe hast, so zu tun, und weisst, was du tust (dassis meist die Crux), dann tu halt so)
    Also ich habe mir schon Gedanken gemacht. Warum ich das so handhabe wie ich es jetzt mache. Und bis jetzt funktioniert es.
    Ich habe mir deinen Link Relationele Datenmodellierung angeschaut, das Tutorial ist suppi und passt auch zur Personalverwaltung, sowie Artikel Verwaltung, aber leider nicht zu meinem Projekt.

    Bzw. ich weiss nicht ob es dazu passt. Ich habe mich für dieses datenmodell entschieden, da ich gerne auf einfache art und weise alle daten gerne erweitern möchte.

    D.h ich habe ein klassenbibliothek in der Formeln für verschieden Berechnungen sind, als Bsp. DMI; RSI und so weiter berechnen kann, nur möchte ich nicht wenn ich das Tool neu starte jedesmal diese werte neu berechnen.
    Besonders wenn es um 15 jahre an daten geht(pro Instrument). also berechne ich die einmal, beim aktuellen abruf der aktuellen daten. Bzw. wenn ein neues Instrument hinzukommt Was heute bei dem Kryptowährungs wahn schnell passieren kann.

    Also ich möchte flexible bleiben und das ohne Perfomnce verluste für aktuelle Realtime berechnungen.