2017-02-17 5 views
2

Я проанализировал the code из SqlCommand и посмотрю, что он отлично работает (см. Метод CompleteExecuteScalar). Но я не уверен, должен ли я использовать top 1 в запросе. Например, у меня есть select name from Person, а в таблице Person содержится много записей. Должен ли я изменить qry на select top 1 name from Person? Или я могу оставить qry как есть, и это не повлияет на производительность/память и т. Д.? Я боюсь, что сервер может буферизовать некоторые данные перед выходом.Нужно ли положить верх 1 при использовании SqlCommand.ExecuteScalar()

+0

Ну, если вам нужно одиночное значение, вам нужно применить условие 'WHERE', которое возвращает одну строку. В противном случае ваш результат будет произвольным. Если вам нужно использовать TOP 1 (с дополнительным ORDER BY), чтобы получить правильное значение, оно не будет более эффективным, чем использование правильного условия WHERE. –

+0

Запрос фильтруется, но он может выводить 0-30 строк. Основываясь на ответе, я буду фильтровать его также сверху 1. – Serg046

+2

Всегда рекомендуется использовать подсказки базы данных, так как тогда он может оптимизировать план запроса. «SELECT TOP 1» - такой намек, который может дать вам лучшую производительность, чем исключить «TOP n» –

ответ

5

В запросе обязательно укажите TOP 1, если вы хотите получить только одну строку из базы данных, независимо от того, передаете ли вы данные через ExecuteScalar или ExecuteReader, например.

Вы не должны читать исходный код, чтобы прийти к такому выводу. Фактически, способ, которым управляют, подчиняется инкапсуляции, а вызывающие классы не должны принимать решения на основе точной реализации команды.

Вместо этого я считаю, что база данных представляет собой дефицитный ресурс, который следует оптимально использовать с точки зрения пропускной способности данных и соответствующих мер. Это включает указание в базу данных, что требуется только одна строка, и с ней нужно сделать. Пусть более низкие уровни, такие как реализация команд и сама база данных, показывают, как использовать эту информацию для максимальной производительности.

+0

. Если мне нужна одна запись/значение, я пишу запрос, который возвращает одну запись/значение. Поэтому обычно вместо использования «TOP 1 ... ORDER BY» вы должны использовать условие «WHERE», f.e. 'WHERE ID = @ ID'. –

+0

@TimSchmelter Меня тоже. Вопрос интересный. Я никогда не использовал 'ExecuteScalar', чтобы изолировать только одно поле от одной записи. –

+0

Спасибо большое, просто хотел получить больше очков. Я всегда буду использовать 'top 1' (напишу расширение, чтобы не забыть верх 1). – Serg046

2

ExecuteScalar извлекает первое значение столбца первой строки. Таким образом, это не будет иметь значения, если вы добавите TOP 1 к вашему запросу или нет. Тем не менее, рекомендуется добавить TOP 1, если вы ожидаете повторяющихся значений, и вам нужно это одно значение (ради скорости). Одним из таких правдоподобных сценариев является то, что вы повторно используете какой-либо скрипт, который возвращает набор или строки, содержащие информацию о клиенте конкретного клиента, при условии, что ваш первый столбец является идентификатором CustomerID или любым первичным ключом.

Смежные вопросы