У меня есть таблица SQL, и я бы хотел выбрать несколько строк по ID. Например, я хотел бы получить строку с идентификаторами 1, 5 и 9 из моей таблицы.
Я делал это с инструкцией WHERE IN, как показано ниже:
SELECT [Id]
FROM [MyTable]
WHERE [Id] IN (1,5,9)
Однако это довольно медленно для большого количества элементов в разделе "IN"
Ниже приведены некоторые данные о производительности из выбора строк, в которых используется таблица из 1 000 000 строк
Querying for 1 random keys (where in) took 0ms
Querying for 1000 random keys (where in) took 46ms
Querying for 2000 random keys (where in) took 94ms
Querying for 3000 random keys (where in) took 249ms
Querying for 4000 random keys (where in) took 316ms
Querying for 5000 random keys (where in) took 391ms
Querying for 6000 random keys (where in) took 466ms
Querying for 7000 random keys (where in) took 552ms
Querying for 8000 random keys (where in) took 644ms
Querying for 9000 random keys (where in) took 743ms
Querying for 10000 random keys (where in) took 853ms
Есть ли более быстрый способ, чем использовать WHERE IN для этого.
Мы не можем сделать соединение, поскольку это между отключенными системами.
Я слышал, что в памяти временная таблица, соединенная с данными в MYSQL, может быть быстрее, но из моего исследования MSSQL не имеет опции в таблице памяти и даже если бы он не был подвержен точно такой же сканированию индекса при вставке в таблицу temp, как у WHERE IN?
EDIT:
В этой таблице есть идентификатор как ПК, поэтому есть индекс PK по умолчанию, cf
CREATE TABLE [dbo].[Entities](
[Id] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_dbo.Entities] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
План выполнения
Вот GIST для консольного приложения, которое производит эти результаты производительности https://gist.github.com/lukemcgregor/5914774
РЕДАКТИРОВАТЬ 2 Я создал функцию, которая создает временную таблицу из разделенной запятой строки, а затем присоединяется к этой таблице. Это быстрее, но я думаю, что в основном из-за проблемы с разбором запроса с помощью
Querying for 1 random keys took 1ms
Querying for 1000 random keys took 34ms
Querying for 2000 random keys took 69ms
Querying for 3000 random keys took 111ms
Querying for 4000 random keys took 143ms
Querying for 5000 random keys took 182ms
Querying for 6000 random keys took 224ms
Querying for 7000 random keys took 271ms
Querying for 8000 random keys took 315ms
Querying for 9000 random keys took 361ms
Querying for 10000 random keys took 411ms