Я пытаюсь получить количество строк, возвращаемых в запросе. Цикл цикла while через результаты работает, но по какой-то причине sqlsrv_num_rows не возвращает никакого значения:
$result = "SELECT * from dtable WHERE id2 = 'apple'"; $query = sqlsrv_query($conn, $result); $row_count = sqlsrv_num_rows($query); echo $row_count; while($row = sqlsrv_fetch_array($query)) { echo 'yes'; }
Благодарю.
Это потому, что sqlsrv_query()
по умолчанию использует SQLSRV_CURSOR_FORWARD
курсора SQLSRV_CURSOR_FORWARD
. Однако, чтобы получить результат из sqlsrv_num_rows()
, вы должны выбрать один из следующих типов курсоров:
Для получения дополнительной информации проверьте: Типы курсоров (драйвер SQLSRV)
В заключение, если вы используете свой запрос, например:
$query = sqlsrv_query($conn, $result, array(), array( "Scrollable" => 'static' ));
вы получите результат:
$row_count = sqlsrv_num_rows($query);
Я согласен с Джеком. Я считаю (*) быстрый способ получить количество строк, однако вам, возможно, придется выполнять кластерное сканирование индексов. Для небольших наборов данных это не проблема.
С другой стороны, вы можете использовать представления системного каталога. Тем не менее, они обновляются по некоторому фоновому потоку. Для наборов данных с несколькими терабайтами поиск каталога может быть более быстрым.
В зависимости от системных событий подсчет может быть или не быть точным.
http://sqlblog.com/blogs/kalen_delaney/archive/2009/12/07/how-many-rows.aspx
Все зависит от того, насколько вы точны. Если это данные в регистре, то очень точно. Если прогнозные данные могут быть менее точными.
Я предлагаю использовать RCSI вместо стандартного READ COMMITTED, чтобы получить лучшее время во времени. Это используется синтаксис SELECT COUNT (*) FROM [TABLE] .
http://www.sqlpass.org/summit/2013/Sessions/SessionDetails.aspx?sid=4730
В прошлом году у Рэнди Найт была отличная презентация.
Вы также можете посмотреть мою презентацию изоляции, в которой есть код, демонстрирующий, что READ COMMITTED может быть неточным.
http://craftydba.com/?page_id=880
Ниже перечислены три решения.
Удачи
J
-- Show time & i/o SET STATISTICS TIME ON SET STATISTICS IO ON GO -- Remove clean buffers & clear plan cache CHECKPOINT DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE GO -- test database use adventureworks2012 go -- traverse the table select count(*) as 'rows' from person.address go
/ *
Время и время компиляции SQL Server: время CPU = 0 мс, прошедшее время = 0 мс.
(Затронуты 1 строка) Таблица «Адрес». Число сканирования 1, логическое считывание 36, физическое чтение 1, чтение вперед 34, логическое чтение логических чисел 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время CPU = 15 мс, прошедшее время = 26 мс.
* /
-- Look at sysindexes select o.name as 'Table', max(i.rows) 'Rows' from sysobjects o join sysindexes i on o.id = i.id where (i.indid = 1 or i.indid = 0) and o.type = 'U' and o.name = 'Address' group by o.name go
/ *
Время и время компиляции SQL Server: время CPU = 15 мс, прошедшее время = 132 мс.
(Затронуты 1 строка (ы)) Таблица 'sysidxstats'. Число сканирования 1, логическое чтение 2, физическое чтение 2, чтение вперед 0, логическое чтение лоб 0, физическое чтение lob 0, считывание с чтением lob 0. Таблица «sysschobjs». Число сканирования 1, логическое чтение 6, физическое чтение 3, чтение вперед 0, логическое чтение лоб 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 36 мс.
* /
-- Look at sys.partitions SELECT max(rows) as 'Rows' FROM sys.partitions WHERE object_id = object_id('Person.Address');
/ *
Время и время компиляции SQL Server: время процессора = 16 мс, прошедшее время = 104 мс.
(Затронуты 1 ряд (строк)) Таблица «Рабочий стол». Число сканирования 0, логическое чтение 0, физическое чтение 0, чтение вперед 0, логическое чтение lob 0, физическое чтение lob 0, чтение с чтением lob 0. Таблица «sysidxstats». Число сканирования 1, логическое чтение 10, физическое чтение 2, чтение вперед 0, логическое чтение lob 0, физическое считывание lob 0, чтение с открытым номером читает 0. Таблица «sysschobjs». Число сканирования 0, логическое чтение 4, физическое считывание 2, чтение вперед 0, логическое считывание логических чисел 0, физическое чтение lob 0, чтение с чтением lob. 0. Таблица «sysrowsets». Число сканирования 1, логическое чтение 6, физическое чтение 1, чтение вперед 24, логическое чтение лоб 0, физическое чтение lob 0, чтение с чтением lob 0.
Время выполнения SQL Server: время процессора = 0 мс, прошедшее время = 34 мс.
* /