0

この関数の実行には約 1.2 秒かかります。私はなぜ理解できませんか?内部結合のためですか?はいの場合、どうすれば実行速度を改善できますか? Microsoft Enterprise Library を使用しています。

  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

もちろん、テーブル (UserInterestsおよびInterests) がフィールドInterestIDで正しくインデックス付けされていない場合、この最適化はまったく重要ではありません。AccountID

EDIT:別のマイクロ最適化は、内部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 に答える