用于检索xml表数据的性能优化

时间:2012-03-17 05:42:35

标签: vb.net performance sql-server-ce

我已经编写了一个代码来完成标题所说的内容。问题是,整个过程只需要10分钟就可以获得1000条记录。这是代码:(用vb.net 3.5和sql server ce编写)

MyConnection.Open()
 Dim count As UInt32
 cmnd = New SqlCeCommand(sqlstring, MyConnection)
 cmnd.CommandType = CommandType.TableDirect
 myreader = cmnd.ExecuteResultSet(ResultSetOptions.Scrollable Or ResultSetOptions.Updatable)
 myreader.ReadLast()
 myreader.Read()
 Dim i As UInt16
 Do Until _TableItem(count) Is Nothing
     record = myreader.CreateRecord()
     For i = 0 To 20
         record.SetString(i, _TableItem(count + i).value())
     Next
     myreader.Insert(record)
     count += 21
 Loop
MyConnection.Close()

如何优化此代码以获得更好的性能?

感谢。

2 个答案:

答案 0 :(得分:0)

您需要测量并找到需要很长时间的事情。 1000件物品需要10分钟很长时间,因此应该很容易发现问题。使用秒表类进行此类测量。

首先尝试查看您的代码是否记录了记录的数量 - 测量1-10-100-1000条记录。我希望你能找到时间的非线性增长(至少是O(n ^ 2))。

测量“记录”对象的创建,而不是将数据发送到数据库,即只需删除myReader.Insert()。

答案 1 :(得分:0)

嗯,虽然我已经弄明白了,但我正在回答有关其他人遇到同样问题的问题。

实际上,解决方案是使用for和each case(c#switch)语句而不是do和for循环。代码看起来像:

For Each child as _TableItemChildNode in _TableItem
    Select Case count
        case 0
            record = myreader.CreateRecord()
            record.SetString(count, child.value())
            count += 1
        case 1 to 19
            record.SetString(count, child.value())
            count += 1
        case 20
            record.SetString(count, child.value())
            myreader.Insert(record)
            count = 0
    End Select
Next

仅代码更改就节省了整整7分钟的时间。请注意,默认情况下该过程需要很长时间,因为项目内的记录非常大。