Diese Frage ähnelt der Optimierung der IP-Bereichssuche? dieser ist jedoch auf SQL Server 2000 beschränkt.
Angenommen, ich habe 10 Millionen Bereiche vorläufig in einer Tabelle gespeichert, die wie folgt strukturiert und ausgefüllt ist.
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
Ich muss alle Bereiche kennen, die den Wert enthalten 50,000,000
. Ich versuche die folgende Abfrage
SELECT *
FROM MyTable
WHERE 50000000 BETWEEN RangeFrom AND RangeTo
SQL Server zeigt, dass es 10.951 logische Lesevorgänge gab und fast 5 Millionen Zeilen gelesen wurden, um die 12 übereinstimmenden zurückzugeben.
Kann ich diese Leistung verbessern? Eine Umstrukturierung der Tabelle oder zusätzlicher Indizes ist in Ordnung.
contains
Abfragen unterstützen und obwohl sie gut daran arbeiten, die gelesene Datenmenge zu reduzieren, scheinen sie andere hinzuzufügen Aufwand, der dem entgegenwirkt.