2014-02-05 3 views
0

Я использую следующий запрос для подкачки в моем приложении (MVC4, SQL Server):Как я могу улучшить запрос подкачки sql?

string sql = "SELECT Id, Name, Date, allCount FROM (" + 
      "SELECT Id, Name, Date, COUNT(Id) OVER() as allCount, " + 
      "ROW_NUMBER() OVER (ORDER BY Date DESC, Id) AS RowNum FROM Products) AS SOD " + 
      "WHERE SOD.RowNum BETWEEN ((@PageNumber-1)*@RowsPerPage)+1 AND @RowsPerPage*(@PageNumber) ORDER BY Date DESC"; 

Это работает для меня, но я хочу знать, это нормальный подход рассчитывать allCount много раз? Я боюсь, что считать allCount много раз, повлияет на скорость для массовых данных. Но, для просмотра мне нужно Кол-во всех товаров сделать разбиение на страницы. Это нормальный код, если нет, как я могу его изменить?

ответ

1

Я бы, возможно, включил ваши параметры между параметрами в вашей сети .net. Вы можете управлять вычислением только один раз. Я лично не доверяю серверу SQL, чтобы решить, что является «детерминированным», так как меня несколько раз укусили. Также почему вам нужно вернуть allcount в КАЖДОЙ строке. Если вы используете ADO.Net, а не ORM, тогда вы можете контролировать свой SQL по своему усмотрению.

ли

SELECT Count(*); 

SELECT id, 
     name, 
     date 
FROM (SELECT id, 
       name, 
       date, 
       Row_number() 
       OVER ( 
        ORDER BY date DESC, id) AS RowNum 
     FROM products) AS SOD 
WHERE SOD.rownum BETWEEN @Start AND @End 
ORDER BY date DESC 

Хотя я подозреваю, что вы можете просто использовать пункт HAVING вместо вашего внутреннего запроса с WHERE.

1

Несмотря на то, что из полученных данных может показаться, что операция COUNT (Id) выполняется один раз для каждой записи в наборе данных, счет фактически выполняется только один раз. Оптимизатор запросов знает, что выражение COUNT(Id) OVER() не зависит от текущей записи, что позволяет ему делать только счетчик один раз.

Таким образом, я не вижу ничего плохого в вашем запросе с точки зрения поискового вызова.

+0

По-прежнему увеличивайте пропускную способность. – Aron

+0

Это, скорее всего, неясно, поскольку OP, вероятно, не возвращает более 100 записей за раз, вершины. 100 recods times 4 bytes (count возвращает 4-байтовое целое число) равно 400 байтам - это почти ничего. – Dan

Смежные вопросы