Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL получает RecordCount путем полного перебора !!! / 6 сообщений из 6, страница 1 из 1
13.10.2002, 15:19:11
    #32057750
qwert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
Ситуация такая - открываю Recorset (adOpenKeyset) с указанием PageSize & AbsolutePage и при этом испытываю жуткие тормоза - после разбора оказывается что тормозит на вызове RecordCount - после трасировки оказывается что в этот момент SQL считает записи путем полного перебора :-(((

Все необходимые индексы присутствуют но тем не менее по умолчанию он делает выборку путем сканирования кластерного индекса (выборка ~30% от общего кол-ва записей) а не с использованием обычного индекса (в этом случае действительно для подсчета записей кроме сканирования делать больше нечего) но даже если явно указать какой индекс использовать он все равно считает записи полным перебором ?!

Я не могу понять почему и зачем он это делает а это всего навсего реализуется просмотр записей по страницам

конечно если не использовать RecordCount а зделать дополнительный вызов с получением COUNT(*) по тем же условиям что и основная выборка то все встанет на свои места и будет быстро работаеть но все таки почему он так делает !!!
...
Рейтинг: 0 / 0
13.10.2002, 18:31:54
    #32057756
AVL
AVL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
если не ошибаюсь, RecordCount считается на клиенте.
...
Рейтинг: 0 / 0
13.10.2002, 20:33:03
    #32057763
Гнездин Петр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
AVL не ошибается. А для получения количества записей не надо выполнять второй SELECT, достаточно сразу после выполнения запроса взять значение переменной @@rowcount
...
Рейтинг: 0 / 0
13.10.2002, 21:02:17
    #32057765
qwert
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
интересно каким это образом получить @@ROWCOUNT из вызова Conn.Execute :-)
для этого как раз RecordCount и существует

а вот зачем в момент вызова RecordCount MSSQL вызывает
exec sp_cursorfetch 180150090, 16, 1089, 64
и так по всем записям я не понимаю

Задача ведь простая - отображать по десять записей на странице и показать страницы для прокрутки т.е. от MSSQL требуется FETCH на десять записей и вернуть их общее кол-во - между прочим в MDB этот механизм работал на ура

и полное сканирование таблицы которое показывает Query Analyzer для этого запроса здесь ни в коем случае не нужно а MSSQL выберает именно этот метод по умолчанию и приходится ему явно указывать какой индекс использовать - по моему это смахивает на полный бред хотя соответсвующий индекс для выбрки присутствует
...
Рейтинг: 0 / 0
13.10.2002, 22:20:42
    #32057778
Гнездин Петр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
А что мешает взять @@rowcount внутри процедуры? Или внутри execute идет select? инкапсуляция в процедуры дает много всяческих удобств :)
...
Рейтинг: 0 / 0
14.10.2002, 10:40:25
    #32057837
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSSQL получает RecordCount путем полного перебора !!!
Используй клиентский курсор и не используй серверный. Тогда о таких и похожих проблемах размышлять не придется.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL получает RecordCount путем полного перебора !!! / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]