Обновление 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 создает несколько планов запросов из-за переменной длины параметров.В идеале запрос должен иметь фиксированную длину параметров, чтобы план запроса можно было создавать, кэшировать и повторно использовать для одних и тех же операций (например, обновление пользователя) с различными значениями параметров (например, для разных адресов электронной почты).