Самый быстрый способ получить одну запись с SubSonic - PullRequest
0 голосов
/ 04 мая 2009

Я новичок в SubSonic и Linq Stuff и пытаюсь найти самый короткий и оптимальный способ получения одной записи.

Какой другой способ быстрее и требует меньше кода для записи, чем этот, чтобы получить одну запись?

User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();

Я использовал инструмент AntsProfiler для проверки, и это занимает в среднем 29,12 мс времени процессора - проверено в течение десяти запусков

Где это займет еще больше времени

UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);   
User user = uc.FetchByQuery(query).First<User>();

Только последняя строка занимает 256,08 мс процессорного времени, а UserController - 66,86 мс.

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Узким местом будет выполнение сгенерированного запроса, а не SubSonic, генерирующий его или возвращающий результат. Если какой-то конкретный запрос выполняется медленно, вы должны изучить возможность использования функций индексации вашего провайдера базы данных для его оптимизации.

Во втором случае я предполагаю, что дополнительное время выполнения является чрезмерным для LINQ, чтобы вернуть первый элемент из коллекции.

Таким образом, мой ответ будет таким: первый способ - лучший способ сделать это, и если 29 мс неприемлемо (что для вызова БД, я не думаю, что это неразумно), добавьте несколько индексов в свой БД для ускорения поиска.

1 голос
/ 04 мая 2009

IIRC, объект Query свободно .. т.е. 1001 *

query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);

Следует читать как:

query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);

Из-за этого может быть учтено увеличенное время в ваших тестах (вы запрашиваете все элементы пользователя, а затем получаете первый).

0 голосов
/ 04 мая 2009

Я думаю, что Джон прав на деньги. Если вы действительно хотите протестировать SubSonic, чтобы увидеть, сколько времени требуется, вам нужно проверить, сколько времени требуется Subonic для создания оператора SQL, а не сколько нужно SubSonic для создания оператора SQL и сколько времени потребуется вашей БД для возврата результатов. в то же время (вам необходимо изолировать свои тесты).

Возможно, вам следует проверить, сколько времени потребуется, чтобы получить результаты с помощью обычной SQLCommand Regular, передать ей ваше соединение и параметры и посмотреть, сколько времени это займет, чтобы у вас было сравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...