3

特定の URL を、その URL の生成を要求した顧客と結び付けるために使用される 8,100 万件のレコードを含むデータベース テーブルがあります。このテーブルからの URL のクエリをある程度合理的にするために、url フィールドを a にしましたvarchar(500)(これまでに見た URL の最大長は 410 です)。

SSMS で次のクエリを実行すると、すぐに結果が得られます。

select CustomerId, UserId, Requested from LogURL where LogData = '<url>'

次に、ログ ファイルを処理するために次のクエリを実行するメソッドを C# でコーディングしました。

    public UrlInformation GetInfoForUrl(string url)
    {
        const string query = "select top 1 CustomerId, UserId, Requested from LogURL where LogData = @url";

        using (var command = new SqlCommand(query, _connection))
        {
            command.Parameters.Add(new SqlParameter
            {
                DbType = DbType.AnsiString,
                ParameterName = "url",
                Value = url
            });

            using (var reader = command.ExecuteReader())
            {
                UrlInformation info = null;

                // Sometimes there are multiple results, just take the first
                if (reader.Read())
                {
                    var customerId = reader.GetInt32(0);
                    var userId = reader.GetInt32(1);
                    var date = reader.GetDateTime(2);

                    info = new UrlInformation
                    {
                        CustomerId = customerId,
                        UserId = userId,
                        RequestedDate = date
                    };
                }

                return info;
            }
        }

(このクラスは、コンストラクターで SQL 接続を作成して開き、Dispose() で破棄するため、同じ接続を再利用する必要があることに注意してください)。

このコードを実行すると、それぞれ 3 ~ 5 秒かかります (クラスcommand.ExecuteReader()を介して測定)。StopWatchSQLプロファイラーを開くと、実際に実行されるクエリは次のとおりです。

exec sp_executesql N'select top 1 CustomerId, UserId, Requested from LogURL where LogData = @url',N'@url nvarchar(346)',@url=N'<url>'

URL を に変換しているためnvarchar、私の参照を利用しておらずvarchar()、完全なテーブル スキャンを行っているようです。

URL を nvarchar ではなく varchar と見なすように C# コードを取得するにはどうすればよいですか?

4

1 に答える 1