1
 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();

"seats" が2000 項目のリストである場合、このクエリは不適切に記述されていますか?

4

1 に答える 1

1

私のデータベースはMySQLなので、それについてしか話せませんが、そのようなタイプのクエリでもパフォーマンスは良好です(あなたのケースで遅いクエリが何であるかによって異なります。私のコードは160000レコードのテーブルをクエリし、SELECT * FROM table WHERE id IN(1,2,3,...159999)それ以下で使用することさえできます) 3 秒)。この場合のボトルネックは、大規模なクエリをネットワーク経由で転送することですが、ローカル LAN では大したことではありません。

別のテーブルからシート ID を照会できる場合は、サーバー側の実行 (サブクエリ) でパフォーマンスを向上させることもできます。

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();
于 2012-05-15T13:54:57.723 に答える