Длина параметров для параметризованных запросов в OrmLite - PullRequest
1 голос
/ 02 июня 2019

Обновление POCO в OrmLite выполняет SQL, как в этом примере:

(@P1 varchar(1043),@P2 varchar(6))
UPDATE table 
SET FILEDATA=@P1 
WHERE FILEID=@P2

Но оно приводит к нескольким планам запросов, основанным на разных значениях @P1 и @P2 с переменной длиной параметра.

Итак, как лучше всего указать типы / длины данных для параметризованных запросов в Ormlite, чтобы планы запросов кэшировались правильно и избегали нескольких планов запросов из-за переменной длины параметров?

Вотаналогичная ситуация с наличием строк переменной длины: https://dba.stackexchange.com/questions/216330/parameterized-query-creating-many-plans

Обновление

Вот пример:

Таблица базы данных

dbo.Users
    Id (PK, int, not null)
    Email (nvarchar(150), not null)

POCO

[Alias("Users")]
public class User
{
    [PrimaryKey]
    [AutoIncrement]
    public int Id { get; set; }

    public string Email { get; set; }
}

Код

int userId = 1;
User user;

// get User
using (var db = DbConn.OpenDbConnection())
{
    user = db.SingleById<User>(userId);
}

// print User email (hi@example.com)
Console.WriteLine(user.Email);

// update User email
using (var db = DbConn.OpenDbConnection())
{
    user.Email = "tester@example.org";

    db.Update(User);
}

Операция обновления приведет к выполнению SQL-запроса, аналогичноготот, который я разместил сверху, с переменной длиной параметров.Это приводит к тому, что SQL Server создает несколько планов запросов из-за переменной длины параметров.В идеале запрос должен иметь фиксированную длину параметров, чтобы план запроса можно было создавать, кэшировать и повторно использовать для одних и тех же операций (например, обновление пользователя) с различными значениями параметров (например, для разных адресов электронной почты).

1 Ответ

1 голос
/ 05 июня 2019

Размер строковых параметров теперь задается из this commit , где он принимает размер строки по умолчанию настроенного StringConverter.Это изменение доступно с v5.5.1, которое теперь доступно на MyGet .

. При необходимости его поведение может быть изменено с помощью , заменяя String Converter и переопределяя InitDbParam().

...