我有一个包含8100万条记录的数据库表,这些记录用于将特定URL与请求生成URL的客户绑定在一起。为了使从此表中查询到的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()中对其进行处理,因此应重复使用同一连接)。
该代码运行时,command.ExecuteReader()
每个需要3-5秒(通过StopWatch
类衡量)。打开sql探查器,我看到实际执行的查询是:
exec sp_executesql N'select top 1 CustomerId, UserId, Requested from LogURL where LogData = @url',N'@url nvarchar(346)',@url=N'<url>'
由于它将url转换为a,nvarchar
因此没有利用我的varchar()
引用,似乎正在进行全表扫描。
如何获取C#代码以将URL视为varchar而不是nvarchar?
由于您使用的是SqlParameter,因此不妨使用SqlDbType而不是DbType。如果这样做,则可以使用SqlDbType.VarChar代替DbType.Ansi。
command.Parameters.Add(new SqlParameter
{
SqlDbType = SqlDbType.VarChar,
ParameterName = "url",
Value = url
});
另外,从MSDN,DbType参数DbType通过覆盖基本DbType属性来获取或设置参数的SqlDbType。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句