TOP против SET ROWCOUNT

Есть ли разница в производительности между TOP и SET ROWCOUNT или они просто выполняются одинаково?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
13
0
12 761
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, функционально они одно и то же. Насколько мне известно, между ними нет существенной разницы в производительности.

Следует отметить, что после того, как у вас будет set rowcount, он будет сохраняться в течение всего срока подключения, поэтому не забудьте сбросить его на 0, как только вы закончите с ним.


РЕДАКТИРОВАТЬ (опубликовать комментарий Мартина)

SET ROWCOUNT предназначен только для текущей процедуры. Сюда входят процедуры, вызываемые текущей процедурой. Он также включает динамический SQL, выполняемый через EXEC или SP_EXECUTESQL, поскольку они считаются «дочерними» областями.

Обратите внимание, что SET ROWCOUNT входит в сферу действия BEGIN/END, но выходит за рамки этого.

create proc test1
as
begin
    begin
    set rowcount 100
    end
    exec ('select top 101 * from master..spt_values')
end
GO

exec test1
select top 102 * from master..spt_values

Результат = 100 строк, затем 102 строки

stackoverflow.com/questions/863714/sql-rowcount-vs-top - имеет несколько других отличий, перечисленных между этими двумя, на случай, если кому-то интересно.
VoodooChild 17.06.2010 20:05

Не думаю, что последняя строчка верна. Смотрите мой ответ здесь stackoverflow.com/questions/5383761/…

Martin Smith 22.03.2011 00:37

@ Ричард: Я всегда думал, что BEGIN...END - это просто составное утверждение. Никогда не считал, что это тоже определение объема. Возможно, «глобальный» BEGIN...END - это особый случай, когда он используется для явного указания начала и конца тела программного объекта. Но даже тогда, я бы сказал, он просто визуализирует область действия объекта программирования, а не определяет ее собственную.

Andriy M 22.03.2011 02:59

Каждый раз, когда вы выполняете динамический SQL, вы создаете новый пакет, работающий на собственном соединении. Это не очень хороший пример, и Set RowCount будет работать, даже если заключен в Begin и End.

MikeTeeVee 25.03.2013 19:53

Еще одно замечание о производительности, согласно BOL:

As a part of a SELECT statement, the query optimizer can consider the value of expression in the TOP or FETCH clauses during query optimization. Because SET ROWCOUNT is used outside a statement that executes a query, its value cannot be considered in a query plan.

Статья о BOL

Это означает, что на самом деле в них может быть разница в производительности.

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