Questa domanda è simile all'ottimizzazione della ricerca dell'intervallo IP? ma quello è limitato a SQL Server 2000.
Supponiamo che io abbia 10 milioni di intervalli temporaneamente memorizzati in una tabella strutturata e popolata come di seguito.
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
Devo conoscere tutti gli intervalli che contengono il valore 50,000,000
. Provo la seguente domanda
SELECT *
FROM MyTable
WHERE 50000000 BETWEEN RangeFrom AND RangeTo
SQL Server mostra che c'erano 10.951 letture logiche e quasi 5 milioni di righe sono state lette per restituire le 12 corrispondenti.
Posso migliorare questa prestazione? Qualsiasi ristrutturazione della tabella o indici aggiuntivi va bene.
contains
query e mentre lavorano bene per ridurre la quantità di dati letti sembrano aggiungere altro spese generali che contrasta questo.