Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получение записей интервала  [new]
warren82
Member

Откуда:
Сообщений: 39
Добрый день!

Есть таблица с несколькими ключами (уникальный индекс по этим полям).

1. Как быстро получить Top 1000 ключей записей, начиная от некоторой записи?
2. Как быстро получить данные интервала?

По сути, 1 это получение верхней границы интервала в 1000 записей, начиная от нижней границы (если SELECT TOP 1000... обернуть в SELECT TOP 1() ORDER BY ...DESC).

Например, есть таблица Table1(Key1, Key2, Key3, Val1, Val2). Есть "границы" интервала:
(Key1=100, Key2='qwerty', Key3=124)
(Key1=100, Key2='asdfgh', Key3=356)

Сейчас запросы такие (работают очень нешустро):

1.
SELECT TOP 1000
Key1, Key2, Key3
FROM Table1
WHERE (Key1 > 100 OR Key1 = 100 AND (Key2 > 'qwerty' OR Key2 = 'qwerty' AND (Key3 > 124)))
ORDER BY Key1, Key2, Key3


2.
SELECT
Key1, Key2, Key3, Val1, Val2
FROM Table1
WHERE (Key1 > 100 OR Key1 = 100 AND (Key2 > 'qwerty' OR Key2 = 'qwerty' AND (Key3 > 124)))
      AND NOT (Key1 > 100 OR Key1 = 100 AND (Key2 > 'asdfgh' OR Key2 = 'asdfgh' AND (Key3 > 356)))
ORDER BY Key1, Key2, Key3
17 ноя 21, 12:49    [22396922]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
aleks222
Member

Откуда:
Сообщений: 1839
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-ver15

Только не надо ожидать чудес.
17 ноя 21, 13:02    [22396929]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
Oleg_SQL
Member

Откуда: от туда
Сообщений: 241
warren82,

а с UNION не быстрее будет (избавившись от OR)

Сообщение было отредактировано: 17 ноя 21, 13:31
17 ноя 21, 13:31    [22396963]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
komrad
Member

Откуда:
Сообщений: 5906
warren82

Сейчас запросы такие (работают очень нешустро)


покажите скрипт таблицы и всех индексов
+ указать размер таблицы

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

Сообщение было отредактировано: 17 ноя 21, 13:49
17 ноя 21, 13:48    [22396974]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
warren82,

распишите все случаи OR в виде отдельных запросов.
17 ноя 21, 14:11    [22396990]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
warren82
Member

Откуда:
Сообщений: 39
aleks222,

Вы имеете в виду OFFSET-FETCH?

Меня скорее беспокоит второй запрос (от начальной границы до конечной). Здесь я не могу взять те же 1000 записей, потому что между 1 и 2 запросом записи в интервале могут удалиться/добавиться.
17 ноя 21, 16:27    [22397083]     Ответить | Цитировать Сообщить модератору
 Re: Получение записей интервала  [new]
andy st
Member

Откуда:
Сообщений: 899
warren82,
а весь этот глум с and, or и not на between не заменить?
чтобы 2 запроса были согласованы по данным можно их делать в SNAPSHOT и двумя рекордсетами в одном батче/процедуре. и в одной транзакции

Сообщение было отредактировано: 17 ноя 21, 16:52
17 ноя 21, 16:46    [22397101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить