|
|
|
MSSQL получает RecordCount путем полного перебора !!!
|
|||
|---|---|---|---|
|
#18+
Ситуация такая - открываю Recorset (adOpenKeyset) с указанием PageSize & AbsolutePage и при этом испытываю жуткие тормоза - после разбора оказывается что тормозит на вызове RecordCount - после трасировки оказывается что в этот момент SQL считает записи путем полного перебора :-((( Все необходимые индексы присутствуют но тем не менее по умолчанию он делает выборку путем сканирования кластерного индекса (выборка ~30% от общего кол-ва записей) а не с использованием обычного индекса (в этом случае действительно для подсчета записей кроме сканирования делать больше нечего) но даже если явно указать какой индекс использовать он все равно считает записи полным перебором ?! Я не могу понять почему и зачем он это делает а это всего навсего реализуется просмотр записей по страницам конечно если не использовать RecordCount а зделать дополнительный вызов с получением COUNT(*) по тем же условиям что и основная выборка то все встанет на свои места и будет быстро работаеть но все таки почему он так делает !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2002, 15:19:11 |
|
||
|
MSSQL получает RecordCount путем полного перебора !!!
|
|||
|---|---|---|---|
|
#18+
если не ошибаюсь, RecordCount считается на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2002, 18:31:54 |
|
||
|
MSSQL получает RecordCount путем полного перебора !!!
|
|||
|---|---|---|---|
|
#18+
AVL не ошибается. А для получения количества записей не надо выполнять второй SELECT, достаточно сразу после выполнения запроса взять значение переменной @@rowcount ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2002, 20:33:03 |
|
||
|
MSSQL получает RecordCount путем полного перебора !!!
|
|||
|---|---|---|---|
|
#18+
интересно каким это образом получить @@ROWCOUNT из вызова Conn.Execute :-) для этого как раз RecordCount и существует а вот зачем в момент вызова RecordCount MSSQL вызывает exec sp_cursorfetch 180150090, 16, 1089, 64 и так по всем записям я не понимаю Задача ведь простая - отображать по десять записей на странице и показать страницы для прокрутки т.е. от MSSQL требуется FETCH на десять записей и вернуть их общее кол-во - между прочим в MDB этот механизм работал на ура и полное сканирование таблицы которое показывает Query Analyzer для этого запроса здесь ни в коем случае не нужно а MSSQL выберает именно этот метод по умолчанию и приходится ему явно указывать какой индекс использовать - по моему это смахивает на полный бред хотя соответсвующий индекс для выбрки присутствует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2002, 21:02:17 |
|
||
|
MSSQL получает RecordCount путем полного перебора !!!
|
|||
|---|---|---|---|
|
#18+
А что мешает взять @@rowcount внутри процедуры? Или внутри execute идет select? инкапсуляция в процедуры дает много всяческих удобств :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2002, 22:20:42 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32057756&tid=1819640]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 330ms |

| 0 / 0 |
