什么是InSonic的SubSonic Update Query安全最大值

时间:2012-05-10 19:17:24

标签: sql subsonic

 var query = new Query(Tables.Ticket) {QueryType = QueryType.Update};

                query.WHERE(Ticket.Columns.IsDeleted, false);
                query.AND(Ticket.Columns.IsSold, false);                
                query.AND(Ticket.Columns.SeatId, Comparison.In, seats);
                query.AddUpdateSetting(Ticket.Columns.Price, 123);
                query.Execute();

如果“席位”是具有2000个项目的列表,此查询是否写得不好?

1 个答案:

答案 0 :(得分:1)

我的数据库是MySQL,所以我只能谈论它,但性能仍然适用于这类查询(取决于你的情况下的慢查询。我的代码可以查询具有160000记录的表甚至使用在不到3秒的时间内SELECT * FROM table WHERE id IN(1,2,3,...159999))。这种情况下的瓶颈是通过网络传输大型查询,但这在本地局域网中并不是什么大问题。

如果您可以从另一个表中查询seatids,您甚至可以通过服务器端执行(子查询)来提高性能。

SubSonic.SqlQuery subQuery = DB
    .Select(Seats.Columns.Id)
    .From<Seats>()
    .Where(Seat.Columns.Type).IsEqualTo(1);

// translates to
// UPDATE tickets SET price = 123
// WHERE seatid IN (SELECT id FROM seats WHERE type = 1)
DB.Update<Tickets>()
  .Set(Tickets.Columns.Price).EqualTo(123)
  .Where(Tickets.Columns.SeatId).In(subQuery)
  .Execute();

// translates to
// UPDATE tickets SET price = 123
// WHERE seatid IN (1,3,5,7,...,2000)
DB.Update<Tickets>()
  .Set(Tickets.Columns.Price).EqualTo(123)
  .Where(Tickets.Columns.SeatId).In(subQuery.ToList<int>())
  .Execute();