PHP mssql подсчитывает строки в выражении

Я хотел бы подсчитать количество строк в операторе, возвращаемом запросом. Единственные решения, которые я нашел, были:

  1. sqlsrv_num_rows() Это кажется слишком сложным для такой простой задачи, как эта, и я читал, что это немного замедляет выполнение
  2. Выполнение запроса с помощью SELECT COUNT Этот метод кажется ненужным, кроме того, он замедляет выполнение, и если у вас уже есть оператор, зачем возиться с другим запросом.
  3. Подсчет строк при создании таблицы Поскольку мне нужно сгенерировать html-таблицу из оператора, я мог бы поместить переменную в цикл генерации таблицы и увеличить ее на единицу, но это работает только тогда, когда у вас уже есть для перебора всего оператора.

Мне не хватает какой-то фундаментальной функции и/или знания, или нет более простого способа?

Любая помощь или руководство приветствуются.

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


person gergalyb    schedule 20.07.2015    source источник
comment
Не могли бы вы предоставить ссылку, в которой говорится, что sqlsrv_num_rows замедляется? Кроме того, на мой взгляд, использование sqlsrv_num_rows требует тех же усилий, что и использование select @@rowcount, если вам нужны и результаты, и подсчет, потому что вам нужно использовать sqlsrv_next_result, а затем sqlsrv_fetch (возможно, больше усилий), чтобы получить подсчет.   -  person alpakyol    schedule 21.07.2015
comment
@alalp В основном здесь: ссылка, но я пошел с этим (sqlsrv_num_rows()), и он довольно быстр даже при почти 200 000 строк.   -  person gergalyb    schedule 21.07.2015
comment
Кажется, что тип курсора является основной причиной производительности. Я просто протестировал (использовал микровремя) sqlsrv_num_rows на используемой таблице в реальном времени. В цикле 100 раз я вызвал запрос, который возвращает ок. 150 рядов. Нет существенной разницы во времени между sqlsrv_num_rows и увеличением счетчика в цикле while с помощью sqlsrv_fetch(). Однако на очень загруженных серверах он может отличаться.   -  person alpakyol    schedule 21.07.2015


Ответы (1)


В строках таблицы sql server информация хранится в представлениях каталога и динамических представлениях управления, которые вы можете использовать для поиска счетчика.

Этот метод будет работать только для физических таблиц. Таким образом, вы можете хранить записи в одной временной таблице и удалить ее позже.

SELECT Sum(p.rows) 
FROM   sys.partitions AS p 
       INNER JOIN sys.tables AS t 
               ON p.[object_id] = t.[object_id] 
       INNER JOIN sys.schemas AS s 
               ON t.[schema_id] = s.[schema_id] 
WHERE  p.index_id IN ( 0, 1 ) -- heap or clustered index 
       AND t.NAME = N'tablename' 
       AND s.NAME = N'dbo'; 

Для получения дополнительной информации проверьте это < em>статья

Если вы не хотите выполнять другой запрос, используйте select @@rowcount после запроса. Он получит count строк, возвращенных предыдущим select запросом.

select * from query_you_want_to_find_count 
select @@rowcount
person Pரதீப்    schedule 20.07.2015
comment
Спасибо за ваш ответ, но я ищу способ подсчета строк возвращаемого оператора, а не выполнения другого запроса для этой цели. - person gergalyb; 20.07.2015
comment
@gergalyb - тогда используйте select @@rowcount после запроса - person Pரதீப்; 20.07.2015
comment
хммм, выберите @@rowcount для меня, чтобы вернуть 4, в то время как мой возвращаемый оператор огромен - person gergalyb; 20.07.2015
comment
@gergalyb Убедитесь, что вы запускаете запрос select @@rowcount прямо рядом с запросом выбора, для которого вам нужно найти количество - person Pரதீப்; 20.07.2015
comment
Под следующим вы имеете в виду сразу после или внутри одного запроса? (Я запустил его после него) @fireblade - person gergalyb; 20.07.2015
comment
@gergalyb - добавил пример - person Pரதீப்; 20.07.2015
comment
К сожалению, это все еще не работает для меня, но я выясню это. Большое спасибо за ваши усилия, я хотел бы дать вам больше репутации :) - person gergalyb; 20.07.2015