Mam tabelę SQL i chciałbym wybrać wiele wierszy według identyfikatora. Na przykład chciałbym uzyskać wiersz z identyfikatorami 1, 5 i 9 z mojej tabeli.Wybieranie wielu wierszy według identyfikatora, czy istnieje szybszy sposób niż WHERE IN
robiłem to z czym w rachunku podobny do poniżej:
SELECT [Id]
FROM [MyTable]
WHERE [Id] IN (1,5,9)
Jednak jest to dość powolne dla dużej liczby elementów w „IN” klauzuli
Poniżej znajdują się dane dotyczące wydajności od wybierania wierszy z użyciem miejsca z tabeli z 1 000 000 wierszy:
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
Czy jest to szybszy sposób niż użycie GDZIE IN w tym celu.
Nie możemy dokonać sprzężenia, ponieważ jest między odłączonymi systemami.
Słyszałem, że in memory temp table joined to the data in MYSQL may be faster, ale z moich badań MSSQL nie ma opcji w pamięci tabeli, a nawet nie byłoby to podatne na dokładnie taki sam skan indeksu na wstawieniu do tabeli temp, ponieważ WHERE IN ma ?
EDIT:
Ten stół ma identyfikator jako PK tak ma indeks domyślny 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]
Plan Wykonanie
Oto GIST dla aplikacja konsolowa, która generuje te wyniki wydajności: https://gist.github.com/lukemcgregor/5914774
EDIT 2 Utworzono funkcję, która tworzy tabelę tymczasową z oddzielonego przecinkiem ciągu znaków, a następnie łączy się z tą tabelą. Jest szybciej, ale myślę, że głównie z powodu problemu z parsowania kwerendy z którym w
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
Macie indeks na Id prawo? –
Jak sugeruje Dale M., indeks na Id jest właściwie pierwszą rzeczą, której potrzebujesz. Po drugie, spójrz na plan kwerend i sprawdź, czy dotyka on tylko indeksu, a nie tabeli bazowej lub, co gorsza, skanowania tabeli w tabeli podstawowej. –
Podaję dwa powyższe komentarze, jednak trudno powiedzieć, co próbujesz zrobić. Może, jeśli podasz szerszy obraz, ludzie będą mogli przedstawić bardziej szczegółowe sugestie. –