Ms sql top: TOP (Transact-SQL) — SQL Server

SQL Server. Используйте TOP вместо SET ROWCOUNT

Перевод статьи — Use TOP instead of SET ROWCOUNT

Оба TOP and SET ROWCOUNT метода ограничения вывода строк имеют право на существование, но они сильно отличаются. TOP ограничивает одну инструкцию T-SQL, в то время как SET ROWCOUNT ограничивает все инструкции в текущем подключении.

Если у вас несколько запросов, в каждом из которых вы хотите вернуть только по 10 строк, то кажется, что лучше использовать SET ROWCOUNT:

Transact-SQL

SET ROWCOUNT 10 SELECT * FROM HumanResources.Department SELECT * FROM HumanResources.Employee SELECT * FROM HumanResources.EmployeeDepartmentHistory SELECT * FROM HumanResources.EmployeePayHistory SELECT * FROM HumanResources.JobCandidate SELECT * FROM HumanResources.Shift SET ROWCOUNT 0

1

2

3

4

5

6

7

8

9

10

SET ROWCOUNT 10

SELECT * FROM HumanResources. Department

SELECT * FROM HumanResources.Employee

SELECT * FROM HumanResources.EmployeeDepartmentHistory

SELECT * FROM HumanResources.EmployeePayHistory

SELECT * FROM HumanResources.JobCandidate

SELECT * FROM HumanResources.Shift

SET ROWCOUNT 0

против

Transact-SQL

SELECT TOP 10 * FROM HumanResources.Department SELECT TOP 10 * FROM HumanResources.Employee SELECT TOP 10 * FROM HumanResources.EmployeeDepartmentHistory SELECT TOP 10 * FROM HumanResources.EmployeePayHistory SELECT TOP 10 * FROM HumanResources.JobCandidate SELECT TOP 10 * FROM HumanResources.Shift

1

2

3

4

5

6

SELECT TOP 10 * FROM HumanResources.Department

SELECT TOP 10 * FROM HumanResources.Employee

SELECT TOP 10 * FROM HumanResources.EmployeeDepartmentHistory

SELECT TOP 10 * FROM HumanResources. EmployeePayHistory

SELECT TOP 10 * FROM HumanResources.JobCandidate

SELECT TOP 10 * FROM HumanResources.Shift

Так почему же я рекомендую использовать TOP вместо SET ROWCOUNT? В первую очередь по той причине, что TOP более предсказуемый. SET ROWCOUNT ограничивает ВСЕ запросы, включая триггеры.

Вот пример с триггером на тестовой БД AdventureWorks2008. Я создаю триггер, который удаляет данные из связанных таблиц.

Transact-SQL

— Create temporary tables to test with to avoid the existing foreign keys — Create a temp SalesOrderHeader table SELECT TOP 20 * INTO TempSalesOrderHeader FROM Sales.SalesOrderHeader — Create a temp SalesOrderDetail table SELECT * INTO TempSalesOrderDetail FROM Sales.SalesOrderDetail WHERE SalesOrderId IN (SELECT SalesOrderId FROM TempSalesOrderHeader) GO — Create Trigger CREATE TRIGGER dbo.

tr_dl_SalesOrderDetail ON TempSalesOrderHeader AFTER DELETE AS BEGIN DELETE FROM TempSalesOrderDetail FROM TempSalesOrderDetail JOIN deleted ON TempSalesOrderDetail.SalesOrderId = deleted.SalesOrderId END GO

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

— Create temporary tables to test with to avoid the existing foreign keys

— Create a temp SalesOrderHeader table

SELECT TOP 20 * INTO TempSalesOrderHeader FROM Sales.SalesOrderHeader

 

— Create a temp SalesOrderDetail table

SELECT * INTO TempSalesOrderDetail

FROM Sales.SalesOrderDetail

WHERE SalesOrderId IN (SELECT SalesOrderId FROM TempSalesOrderHeader)

GO

 

— Create Trigger

CREATE TRIGGER dbo. tr_dl_SalesOrderDetail

ON TempSalesOrderHeader

AFTER DELETE AS

BEGIN

    DELETE FROM TempSalesOrderDetail

    FROM TempSalesOrderDetail

    JOIN deleted

        ON TempSalesOrderDetail.SalesOrderId =

            deleted.SalesOrderId

END

GO

Transact-SQL

— Run my delete using SET ROWCOUNT SET ROWCOUNT 10 DELETE FROM TempSalesOrderHeader SET ROWCOUNT 0 GO

1

2

3

4

5

6

7

— Run my delete using SET ROWCOUNT

SET ROWCOUNT 10

DELETE FROM TempSalesOrderHeader

SET ROWCOUNT 0

GO

Transact-SQL

— Show orphaned OrderDetail rows SELECT * FROM TempSalesOrderDetail WHERE SalesOrderId NOT IN (SELECT SalesOrderId FROM TempSalesOrderHeader) GO

— Show orphaned OrderDetail rows

SELECT *

FROM TempSalesOrderDetail

WHERE SalesOrderId NOT IN (SELECT SalesOrderId FROM TempSalesOrderHeader)

GO

Transact-SQL

— Cleanup code DROP TABLE TempSalesOrderHeader DROP TABLE TempSalesOrderDetail

— Cleanup code

DROP TABLE TempSalesOrderHeader

DROP TABLE TempSalesOrderDetail

Благодаря SET ROWCOUNT из таблицы TempSalesOrderHeader было удалено только 10 строк, как и ожидалось. Но из таблицы TempSalesOrderDetail было так же удалено 10 строк, что противоречит нашей логике. Если бы я использовал TOP, были бы удалены все 109 строк из TempSalesOrderDetail. Будьте осторожны!

Сейчас, в BOL есть предупреждение, что SET ROWCOUNT не будет поддерживаться для команд DELETE, INSERT и UPDATE. Если вы используете SET ROWCOUNT

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

Оптимизация

Ещё хотелось бы поделиться вырезкой из BOL:

Для ограничения числа возвращаемых строк пользуйтесь TOP (или OFFSET и FETCH), а не SET ROWCOUNT. Эти методы предпочтительнее, чем SET ROWCOUNT, по следующим причинам:

  • Как часть инструкции SELECT, оптимизатор запросов может принимать значение выражение в предложениях TOP или FETCH во время оптимизации запроса. Поскольку SET ROWCOUNT используется вне инструкции, выполняющей запрос, его значение не может быть учтено при создании плана запроса.

Это означает, что оптимайзер может выбрать план для 100 миллионов строк, вместо того, чтобы построить оптимальный для 100, что может существенно изменить время его выполнения.

Личный опыт

Если быть честным, я часто использовал SET ROWCOUNT в своей практике, но после изучения вопроса, я стал делать это реже.

Запись опубликована в рубрике Оптимизация с метками performance. Добавьте в закладки постоянную ссылку.

Выбрать топ в MS SQL Server

    Написать статью

  • Написать интервью Опыт
  • SQL | Соединение (внутреннее, левое, правое и полное соединение)
  • Свойства ACID в СУБД
  • SQL-запрос, чтобы найти вторую по величине зарплату?
  • SQL | Оператор WITH
  • Нормальные формы в СУБД
  • Триггер SQL | Студенческая база данных
  • Введение в СУБД (система управления базами данных) | Набор 1
  • Знакомство с моделью ER
  • Знакомство с B-Tree
  • SQL | GROUP BY
  • Часто задаваемые вопросы на собеседовании по СУБД
  • SQL | Представления
  • Разница между первичным и внешним ключом
  • CTE в SQL
  • Разница между кластеризованным и некластеризованным индексом
  • Разница между DDL и DML в СУБД
  • Индексирование в базах данных | Набор 1
  • Предварительная обработка данных в интеллектуальном анализе данных
  • SQL — ORDER BY
  • Разница между DELETE, DROP и TRUNCATE
  • Типы ключей в реляционной модели (кандидат, супер, первичный, альтернативный и внешний)
  • Вопросы для собеседования по SQL
  • Разница между первичным и уникальным ключом
  • Разница между SQL и NoSQL
  • Язык структурированных запросов (SQL)
  • Третья нормальная форма (3NF)
  • Разница между DELETE и TRUNCATE

    6 Введение в Многоуровневая архитектура в СУБД | Набор 2

  • Вторая нормальная форма (2NF)
  • SQL | ВСТАВИТЬ В Заявление

Улучшить статью

Сохранить статью

  • Последнее обновление: 09июль, 2020

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Необходимое условие — выберите в MS SQL Server
    Предположим, что пользователь хочет извлечь лучших студентов из всего учебного заведения, но для извлечения данных ему необходимо использовать несколько сложных запросов. Чтобы избежать сложности, пользователь может использовать «Выбрать верх».
    «Выбрать начало» извлекает ограниченное количество строк. Это приводит к получению точных данных при меньших затратах времени.

    Синтаксис –

     select top (выражение) [проценты] [со связями]
    из имя_таблицы
    порядок по имени столбца 

    Анализ синтаксиса —

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

    Предложение order by используется для упорядочения данных в хронологическом порядке. Обязательно использовать это предложение в синтаксисе, иначе это приведет к ошибке.

    Пример —
    Если пользователь хочет извлечь 5 лучших студентов учебного заведения, запрос записывается как —

    выбрать топ 5 имя rollnumber gpa
    от студента
    заказать по имени АСЦ
     

    Output –

    Roll number Name GPA
    114 Aisha 9.5
    116 Apoorva 9.4
    119 Mina 8.7
    114 Rita 8.1
    118 Veena 7.7

    Таким образом можно извлечь нужные данные. У ученика последней строки средний балл 7,7, и если есть еще несколько учеников с одинаковыми номерами, запрос должен быть записан как —

    .
    выберите топ 8 с галстуками
    имя ролл-номер gpa
    от студента
    заказать по имени АСЦ
     

    Output –

    Roll number Name GPA
    114 Aisha 9. 5
    116 Apoorva 9.4
    119 Mina 8.7
    114 Rita 8.1
    118 Veena 7.7
    110 Vinitha 7.7
    101 Yamini 7.7
    107 Zubaida 7.7

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

    Статьи по теме

    Что нового

    Мы используем файлы cookie, чтобы обеспечить вам максимальное удобство просмотра нашего веб-сайта. Используя наш сайт, вы подтверждаете, что вы прочитали и поняли наши Политика в отношении файлов cookie и Политика конфиденциальности

    сервер sql — T-SQL ВЫБЕРИТЕ ВЕРХНЮЮ 1

    спросил

    Изменено 8 лет, 3 месяца назад

    Просмотрено 14 тысяч раз

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

     выбрать TOP 1 u.ID
    от [dbo].[Пользователь] u
    где u.ID <> '5dc89076-e554-42f2-a9ae-787b20f6f56b' И u.gender != 'мужской'
    кроме
    выберите [dbo].[Like].likes
    от [dbo].[Нравится]
    где [dbo].[Like].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
    кроме
    выберите [dbo].[Не нравится].не нравится
    от [dbo].[Не нравится]
    где [dbo].[Не нравится].[пользователь] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
     

    Этот запрос ничего не возвращает

     выберите u.ID
    от [dbo].[Пользователь] u
    где u.ID <> '5dc89076-e554-42f2-a9ae-787b20f6f56b' И u.gender != 'мужской'
    кроме
    выберите [dbo].[Like].likes
    от [dbo].[Нравится]
    где [dbo].[Like].[user] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
    кроме
    выберите [dbo].[Не нравится].не нравится
    от [dbo].[Не нравится]
    где [dbo].[Не нравится].[пользователь] = '5dc89076-e554-42f2-a9ae-787b20f6f56b'
     

    Этот запрос возвращает идентификатор: 9EF5B83E-319A-4E2F-88A1-E67227DBFDCE

    • sql
    • sql-server
    • tsql

    3

     выберите TOP 1 u.
    Оставить комментарий

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *