Помогите . Что то странное происходит про запросе

Alexander_fx
Дата: 22.02.2013 11:25:05
Привет
большая база - 500 гигов
много таблиц по 3-4 гига
оперативки 16 гигов
делаю на клиенте запрос - select * from table where time between
запрос возвращает 100К ( примерно 5% от таблицы) записей за 10 секунд но как только последняя запись ко мне приходит я еще жду почти минуту чего то. такое впечатление что сервер после выполнения этого запроса закачивает в себя какой то индекс
странность в том что я реально быстро получаю на клиенте нужные мне данные - но после получения последней строки recordset долго думает а не последняя ли это строка.

подскажите что оттрасировать чтобы понять что происходит
P.S. может ли быть что при обращении к таблице которая не в памяти - даже при запросе небольшого кусочка данных - таблица или запрашиваемые индексы считываются в память полностью или с избытком?
pkarklin
Дата: 22.02.2013 11:27:36
автор
я еще жду почти минуту чего то


Ждет Ваше клиентское приложение? Трассу профайлером снимали, чтобы сравнить момент, когда сервер закончил обработку бача с временем, когда Ваше приложение "откликнулось"?
Гость333
Дата: 22.02.2013 11:53:26
Alexander_fx,

План запроса смотрели? Если тот же запрос выполнить из SSMS, будет такое же поведение?

автор
может ли быть что при обращении к таблице которая не в памяти - даже при запросе небольшого кусочка данных - таблица или запрашиваемые индексы считываются в память полностью или с избытком?

Может. Например, пусть сервер выбрал для вашего запроса Clustered Index Scan (а при чтении 5% таблицы скорее всего так и будет), и столбец time не является первым столбцом кластерного индекса. При этом случилось так, что все необходимые данные находятся где-то в начале индекса (например, в первых 10% страниц). Но сервер этого не знает, он должен прочитать всю таблицу. То есть за первые 10% времени будет получен весь результат, а остальные 90% сервер будет считывать данные, проверять условие "where time between", но ни одна запись в итоговый набор не попадёт.
Glory
Дата: 22.02.2013 11:56:17
Alexander_fx
запрос возвращает 100К ( примерно 5% от таблицы) записей за 10 секунд но как только последняя запись ко мне приходит

Это вы в своем программном коде увидели, что "запись приходит" ? Т.е. вы ее прочитали и отобразили на экране ?
Alexander_fx
Дата: 22.02.2013 12:00:58
Glory,

да
я в клиентском коде получаю рекордсет и вижу что получил запись после которой идет пауза и больше ничего не приходит
Glory
Дата: 22.02.2013 12:03:14
Alexander_fx
я в клиентском коде получаю рекордсет и вижу что получил запись после которой идет пауза и больше ничего не приходит

Это как интересно ?
- вы прочитали последнюю запись
- вывели ее на экран
- и тут возникает задержка в минуту до следующей команды вашего кода ?
Alexander_fx
Дата: 22.02.2013 12:03:42
Гость333,

я как этого избежать?
таблица большая и клепать лишние индексы под конкретные запросы не очень хочется
Alexander_fx
Дата: 22.02.2013 12:07:22
Glory,

да именно так
Glory
Дата: 22.02.2013 12:09:32
Alexander_fx
да именно так

И почему вы думаете, что это не следующая строка вашего кода тормозит ?
Alexander_fx
Дата: 22.02.2013 12:28:47
Glory,

ошибся с запросом там не between и видимо это все меняет
очевидно надо делать индекс по полям index1 и index2

таблица 5 гигов

кластерный индекс index1
индекс 2

select * from tbl where index1>1 and index2<999

do while read
.....
print index2
loop

msgbox "comleted"

вижу что получил записи 998 - и только через минуту вижу сообщение "comleted"