Закрыть ридер с оставшимися строками

У меня есть случай, когда мне нужны только первые 10000 строк.

Что странно, это выбрать топ-10000 против просто остановки SqlDataReader на 10000 это не всегда то же самое, что к тому, что является самым быстрым.

Он никогда не отличается более чем на 10%, но есть ли лучший подход?

Я подозреваю, что Reader получает блоки за раз, и если 10 000 происходит в начале блока, это будет больше.

Но то, что я вижу, странно для меня.
Кажется, закрытие читателя занимает больше времени после того, как 10 000 читаются с помощью выбора без верха, как будто ему все еще нужно очистить строки.

Мои цифры не настолько различны, чтобы быть убедительными.

Есть ли лучший подход к чтению первых 10000 строк?

Я читаю отсортированные с (nolock) и только два Int32 на случай, если что-то изменится.

1 ответ

Когда вы запрашиваете TOP 10000 оптимизатор принимает это к сведению и производит это количество максимально эффективно (учитывая его ограничения в рассуждениях и информации).

Таким образом, вы, вероятно, получаете разные планы в двух случаях. Обычно, TOP 10000 будет более эффективным, но не указав его, возможно, совпадение даст вам более эффективный план. Случайное изменение, приводящее к лучшему плану, не случайно.

Обратите внимание, что существуют проблемы, связанные с ранним закрытием читателя. Я не могу найти ссылку сейчас, и я не помню, что это было. Я думаю, что при некоторых обстоятельствах закрытие читателя просто извлекает остальную часть запроса и отбрасывает его вместо отмены запроса.

Другие вопросы по тегам