Закрыть ридер с оставшимися строками
У меня есть случай, когда мне нужны только первые 10000 строк.
Что странно, это выбрать топ-10000 против просто остановки SqlDataReader
на 10000 это не всегда то же самое, что к тому, что является самым быстрым.
Он никогда не отличается более чем на 10%, но есть ли лучший подход?
Я подозреваю, что Reader получает блоки за раз, и если 10 000 происходит в начале блока, это будет больше.
Но то, что я вижу, странно для меня.
Кажется, закрытие читателя занимает больше времени после того, как 10 000 читаются с помощью выбора без верха, как будто ему все еще нужно очистить строки.
Мои цифры не настолько различны, чтобы быть убедительными.
Есть ли лучший подход к чтению первых 10000 строк?
Я читаю отсортированные с (nolock) и только два Int32 на случай, если что-то изменится.
1 ответ
Когда вы запрашиваете TOP 10000
оптимизатор принимает это к сведению и производит это количество максимально эффективно (учитывая его ограничения в рассуждениях и информации).
Таким образом, вы, вероятно, получаете разные планы в двух случаях. Обычно, TOP 10000
будет более эффективным, но не указав его, возможно, совпадение даст вам более эффективный план. Случайное изменение, приводящее к лучшему плану, не случайно.
Обратите внимание, что существуют проблемы, связанные с ранним закрытием читателя. Я не могу найти ссылку сейчас, и я не помню, что это было. Я думаю, что при некоторых обстоятельствах закрытие читателя просто извлекает остальную часть запроса и отбрасывает его вместо отмены запроса.