提高Dapper的性能
#dotnet #database #性能 #dotnetcore

我们经常开始编写Cadigos,并让可能影响系统性能的细节。我们认为性能问题比实际情况更大,因此,我们最终遵循更复杂的道路。

让我们考虑一些简单的东西。您正在使用Dapper,一个微ORM,以其其他CRM的速度而闻名。但是,您会正确使用Dapper并利用此性能吗?

您通常会仔细识别传递到查询的寓言吗?

让我们创建一个客户端类和一个存储客户的表:

class Cliente
{
    public string Nome { get; set; }
    public int Id { get; set; }
    public string CPF { get; set; }
}
CREATE TABLE CLIENTE (
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    NOME VARCHAR(200) NOT NULL,
    CPF CHAR(11) NOT NULL
)

创建表之后,让我们将1000 cpfs(假)插入一个循环中,然后创建一个CPFãdice:

CREATE UNIQUE NONCLUSTERED INDEX IX_CLIENTE_CPF   
    ON Cliente (Cpf)
    INCLUDE (Nome)

现在,让我们编写一个简单的代码以通过CPF获取客户,这是许多应用程序中的常见代码:

IConfigurationBuilder builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", false, true);
        IConfigurationRoot config = builder.Build();

        SqlConnection sqlConnection =
                new SqlConnection(
                    config.GetConnectionString("ecommerceConnectionString")
                    );
        sqlConnection.Open();

        var cliente = sqlConnection.QueryFirstOrDefault<Cliente>(
            "select * from Cliente where CPF = @cpf",
            new { cpf = "00000000090" });

        sqlConnection.Close();

我们期望的是,由于我们有一个CPF列,因此数据库中执行的查询是最可行的。让我们证明存在存在,并且我们有最好的执行计划。

Image description

查询是通过对我们先前创建的CPFãdice进行索引来执行的。

现在让我们通过应用“相同”查询来运行。

Image description

执行SQL的权利并获得执行计划。

Image description

结果并非如此。为了执行索引搜索,Dapper生成的查询执行了索引扫描。这是因为Dapper将咨询的Parano解释为标准NVarchar,这使SQL Server转换了Parano并更改执行计划,影响了咨询的绩效。 /P>

要避免此问题并改善查询的性能,有必要正确告知字符串类型Parano。在Dapper中,我们可以使用DBSTRING类指定Parano的类型。

var cliente = sqlConnection.QueryFirstOrDefault<Cliente>(
            "select * from Cliente where CPF = @cpf",
            new
            {
                cpf = new DbString
                {
                    IsAnsi = true,
                    IsFixedLength = true,
                    Length = 11,
                    Value = "00000000090"
                }
            });

通过设置DBSTRING属性,Dapper可以使用正确的Parante类型生成约会,从而使SQL Server可以进行索引。请注意,根据数据库中的数据类型正确指定属性很重要。

Image description

Image description

dbstring是一个dapper类,允许您指定将传递给数据库的parano的确切类型。因此,Dapper生成了一种使用正确的数据类型的仪器。这样,我们避免了不必要的对话并有助于提高咨询表现。

DBSTRING构建器允许您定义几个属性,例如Isansu,IsfixedLength,长度和值。 Isansons属性指示数据的类型是否对Unicode表示焦虑。 ISFIXEDLENGTH属性指示数据类型是固定还是变量。长度属性表示字段的大小,值属性是parano的值。

根据:

Parametros

这个小细节在我们实施过程中常常没有注意到,并且会显着影响我们的应用程序的性能,直接影响常规的体验。因此,使用良好的实践和工具来帮助我们识别和纠正可能的问题很重要。

在下一个!