Esta pregunta es similar a la optimización de la búsqueda de rango de IP? pero ese está restringido a SQL Server 2000.
Supongamos que tengo 10 millones de rangos almacenados provisionalmente en una tabla estructurada y poblada como se muestra a continuación.
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
Necesito saber todos los rangos que contienen el valor 50,000,000
. Intento la siguiente consulta
SELECT *
FROM MyTable
WHERE 50000000 BETWEEN RangeFrom AND RangeTo
SQL Server muestra que hubo 10,951 lecturas lógicas y se leyeron casi 5 millones de filas para devolver las 12 coincidentes.
¿Puedo mejorar este rendimiento? Cualquier reestructuración de la tabla o índices adicionales está bien.
contains
consultas y, aunque funcionan bien para reducir la cantidad de datos leídos, parecen agregar otros sobrecarga que contrarresta esto.