TSQL-запрос с TOP 1 + ORDER BY или max / min + GROUP BY? - PullRequest
2 голосов
/ 11 июня 2011

Мне нужно получить запись значения и метки времени по макс. Метки времени.Комбинация значения и метки времени является первичным ключом.Кажется, что есть два способа получить максимальное / минимальное значение.Один пример запроса - с помощью TOP 1 + ORDER BY:

SELECT TOP 1
  value, timestamp
FROM myTable
WHERE value = @value
ORDER BY timestamp DESC

Другой пример - с помощью MAX () + GROUP BY:

SELECT value, max(timestamp)
FROM myTable
WHERE value = @value
GROUP BY value

Является ли второй вариант лучше первогоодин с точки зрения производительности?Я прочитал комментарий одного человека из "чтобы отсортировать n элементов по первому - O (n степень 2), второму O (n)", чтобы мой предыдущий вопрос .Как насчет случая, когда у меня есть индекс как для значения, так и для отметки времени?

Ответы [ 2 ]

3 голосов
/ 12 июня 2011

Если у вас нет составного индекса на (value, timestamp), тогда они будут плохими и, вероятно, одинаково плохими.

С индексом они, вероятно, будут такими же, благодаря Оптимизатору запросов.

Вы также можете быстро проверить себя, используя эти данные, чтобы увидеть используемые ресурсы:

SET STATISTICS IO ON
SET STATISTICS TIME ON

... но лучше всего использовать Графические планы выполнения

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

Примечание: у вас есть третий вариант

SELECT @value AS value, max(timestamp)
FROM myTable
WHERE value = @value

Это вернет NULL без строк , что немного отличает его от двух других

0 голосов
/ 13 июня 2011

Для тех, кто находит это в поиске и хочет знать о Postgres (не относится к OP), если столбец проиндексирован, планы будут идентичны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...