0

此函数执行大约需要 1.2 秒。我无法理解为什么?是因为内部连接吗?如果是,那么我该如何提高执行速度?我正在使用 Microsoft 企业库。

  Public Shared Function GetDataByInterests(ByVal accountId As Integer) As Object


            Dim details As New List(Of GetIdBasedOnInterest)()
            Dim getIDs As New GetIdBasedOnInterest

            Dim interests As String = ""

            Dim db As SqlDatabase = Connection.Connection


            Using cmdGeneric As DbCommand = db.GetSqlStringCommand("SELECT Interests.InterestName FROM UserInterests INNER JOIN Interests ON UserInterests.InterestID = Interests.InterestID WHERE UserInterests.AccountID=@AccountID")
                db.AddInParameter(cmdGeneric, "AccountID", SqlDbType.Int, accountId)
                Dim dsInterests As DataSet = db.ExecuteDataSet(cmdGeneric)
                For i = 0 To dsInterests.Tables(0).Rows.Count - 1
                    If i = dsInterests.Tables(0).Rows.Count - 1 Then
                        interests = interests & dsInterests.Tables(0).Rows(i).Item(0).ToString
                    Else
                        interests = interests & dsInterests.Tables(0).Rows(i).Item(0).ToString & ","
                    End If
                Next
            End Using
    getIDs.InterestName = interests
            details.Add(getIDs)

            Return details
        End Function
4

2 回答 2

1

在不知道任何基础表及其索引的情况下(这是您应该立即进行的检查),您的循环中有一个明显的问题。
您可以连接字符串,这可能会对程序使用的内存造成很大压力。
字符串连接会导致在内存上分配一个新字符串,因此,如果您的表包含许多行,则效果可能会很明显。

您可以尝试使用StringBuilder

Dim interests As new StringBuilder(1024) ' suppose an internal buffer of 1K'
...

If i = dsInterests.Tables(0).Rows.Count - 1 Then
    interests.Append(dsInterests.Tables(0).Rows(i).Item(0).ToString)
Else
    interests.Append(dsInterests.Tables(0).Rows(i).Item(0).ToString & ",")
End If

....

getIDs.InterestName = interests.ToString

当然,如果您的表 (UserInterestsInterests) 没有在字段上正确索引InterestID并且AccountID

编辑:另一个微优化是删除内部 IF 测试并仅在循环结束后截断结果输出

For ....
    interests.Append(dsInterests.Tables(0).Rows(i).Item(0).ToString & ",")
Next
if(interest.Length > 0) interest.Length -= 1;

编辑至于您的要求,这是创建唯一索引的示例。语法可能更复杂,并且取决于 Sql Server 版本,但基本上你在 Sql Management Studio 中执行此操作

CREATE UNIQUE INDEX <indexname> ON <tablename>
(
   <columntobeindexed>
) 

查看 MSDN 上的CREATE INDEX语句示例

于 2013-02-04T09:54:29.880 回答
1

1) 在 SQL Server Management Studio 中为您的查询计时。将它与您的 VB 代码隔离开来调整它会容易得多。您还可以运行显示查询计划,它甚至可以建议新的索引。

2)检查您是否定义了相关的主键和索引。

3) 从你的 for 循环中提取常用表达式,以避免一遍又一遍地重新计算相同的东西:

4) 就像史蒂夫说的,使用 StringBuilder

结合这些点:

            Dim theTable as ...
            Dim rowCount as Integer
            Dim interests As new StringBuilder(1024)
            Set theTable = dsInterests.Tables(0)
            rowCount = theTable.Rows.Count 
            For i = 0 To rowCount  - 1
                interests.Append(theTable.Rows(i).Item(0).ToString)
                If i <> rowCount - 1 Then
                    interests.Append(",")
                End If
            Next
于 2013-02-04T10:24:04.890 回答