To pytanie jest podobne do optymalizacji wyszukiwania zakresu adresów IP? ale ten jest ograniczony do SQL Server 2000.
Załóżmy, że mam 10 milionów zakresów tymczasowo zapisanych w tabeli o strukturze i wypełnionej jak poniżej.
CREATE TABLE MyTable
(
Id INT IDENTITY PRIMARY KEY,
RangeFrom INT NOT NULL,
RangeTo INT NOT NULL,
CHECK (RangeTo > RangeFrom),
INDEX IX1 (RangeFrom,RangeTo),
INDEX IX2 (RangeTo,RangeFrom)
);
WITH RandomNumbers
AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num
FROM sys.all_objects o1,
sys.all_objects o2,
sys.all_objects o3,
sys.all_objects o4)
INSERT INTO MyTable
(RangeFrom,
RangeTo)
SELECT Num,
Num + 1 + CRYPT_GEN_RANDOM(1)
FROM RandomNumbers
Muszę znać wszystkie zakresy zawierające wartość 50,000,000
. Próbuję następujące zapytanie
SELECT *
FROM MyTable
WHERE 50000000 BETWEEN RangeFrom AND RangeTo
SQL Server pokazuje, że było 10 951 odczytów logicznych i odczytano prawie 5 milionów wierszy, aby zwrócić 12 pasujących.
Czy mogę poprawić tę wydajność? Każda restrukturyzacja tabeli lub dodatkowych indeksów jest w porządku.
contains
zapytania i chociaż działają dobrze w zmniejszaniu ilości odczytanych danych, wydaje się, że dodają inne koszty ogólne, które to przeciwdziałają.