Увеличивает ли добавление «TOP 1» в SQL-оператор производительность? - PullRequest
4 голосов
/ 12 февраля 2010

В запросе SQL добавляет "TOP 1" к

SELECT TOP 1 [values] FROM [TABLE] where [TABLE].Value = "ABC" 

дайте мне повышение производительности, когда я знаю, что есть только одна из этих записей? В частности, я имею в виду LinqToSql и разницу между методами .Single(...) и .First(...), где .First(...) добавляет TOP 1 к сгенерированному sql.

LinqToSql уже чувствует себя медленным, поэтому я просто пытаюсь придумать, как сделать это быстрее.

EDIT: [TABLE].Value может быть внешним ключом в некоторых случаях.

Ответы [ 7 ]

5 голосов
/ 12 февраля 2010

Выбор TOP 1 должен завершиться, как только будет найден первый результат, так что да, это может быть намного быстрее в зависимости от вашего запроса. С другой стороны, вы действительно хотите рассмотреть семантику и потенциальное значение необнаруженных несоответствий в данных. Single () действительно наиболее уместен, если на самом деле есть только одно совпадение. Если у вас более одного совпадения и вы используете Single (), вы получите исключение и узнаете об ошибке в ваших данных или в вашем коде. В вашем случае я бы использовал Single (). Чтобы сделать запрос быстрее, я хотел бы добавить индекс для столбцов, которые я использую в качестве дискриминатора.

2 голосов
/ 12 февраля 2010

Добавление предложения "TOP" может помочь в некоторых случаях - если SQL Server ожидает запрос, может вернуть очень большое количество результатов, это может заблокировать таблицу в ожидании. Если вы знаете, что этого не произойдет, и можете ограничиться с помощью TOP, это не добавит накладных расходов.

2 голосов
/ 12 февраля 2010

Почему бы просто не добавить индекс UNIQUE в столбец?

2 голосов
/ 12 февраля 2010

Мой опыт работы с SQL-серверами говорит мне, что это делает ваш запрос намного быстрее.

0 голосов
/ 12 февраля 2010

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

0 голосов
/ 12 февраля 2010

Single и First используются по-разному.

Single предназначено для описываемой вами ситуации.Вы всегда хотите, чтобы ваш код "рано проваливался".

Если вы делаете запросы на основе вашего первичного ключа или уникального индекса, оптимизатор запросов все равно удалит предложение "TOP ... N".

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

0 голосов
/ 12 февраля 2010

Нет, это потенциально замедлит ваши запросы, потому что, возможно, сначала придется выполнить сортировку.

...