この質問は、IP範囲検索の最適化に似ていますか?ただし、その1つはSQL Server 2000に制限されています。
次のように構造化され、入力されたテーブルに1,000万個の範囲が暫定的に保存されているとします。
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
値を含むすべての範囲を知る必要があります50,000,000
。私は次のクエリを試します
SELECT *
FROM MyTable
WHERE 50000000 BETWEEN RangeFrom AND RangeTo
SQL Serverは、10,951の論理読み取りがあり、12の一致する行を返すために約500万行が読み取られたことを示しています。
このパフォーマンスを改善できますか?テーブルまたは追加のインデックスの再構築は問題ありません。
contains
クエリをサポートし、他のデータを追加するように見えるデータ量を減らすのに役立つ空間インデックスが役立つことを願っています。これに対抗するオーバーヘッド。