У меня есть SQL-запрос с 50 параметрами, такими как этот.
DECLARE
@p0 int, @p1 int, @p2 int, (text omitted), @p49 int
SELECT
@p0=111227, @p1=146599, @p2=98917, (text omitted), @p49=125319
--
SELECT
[t0].[CustomerID], [t0].[Amount],
[t0].[OrderID], [t0].[InvoiceNumber]
FROM [dbo].[Orders] AS [t0]
WHERE ([t0].[CustomerID]) IN
(@p0, @p1, @p2, (text omitted), @p49)
Предполагаемый план выполнения показывает, что база данных соберет эти параметры, упорядочит их, а затем прочитает индекс Orders.CustomerID от наименьшего параметра к наибольшему , затем выполните поиск закладок для остальной части записи.
Проблема в том, что самый маленький и самый большой параметр может быть довольно далеко друг от друга, и это приведет к чтению, возможно, всего индекса.
Поскольку это выполняется в цикле со стороны клиента (каждый раз отправляется 50 параметров, для 1000 итераций ), это плохая ситуация. Как я могу сформулировать код на стороне запроса / клиента, чтобы получить мои данные без повторного сканирования индекса при одновременном уменьшении количества обращений?
Я думал о том, чтобы упорядочить параметры по 50 тыс., Чтобы были меньшие значения индекса. Есть причудливое смягчающее обстоятельство, которое мешает этому - я не могу использовать это решение. Чтобы смоделировать это обстоятельство, просто предположим, что у меня есть только 50 идентификаторов, доступных в любое время, и я не могу контролировать их относительное положение в глобальном списке.