คำถามนี้คล้ายกับการเพิ่มประสิทธิภาพการค้นหาช่วง IP หรือไม่ แต่อันนั้นถูก จำกัด ไว้ที่ SQL Server 2000
สมมติว่าฉันมี 10 ล้านช่วงที่จัดเก็บไว้ชั่วคราวในตารางที่มีโครงสร้างและมีประชากรดังนี้
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 ครั้งและอ่านได้เกือบ 5 ล้านแถวเพื่อส่งคืนการจับคู่ 12 รายการ
ฉันสามารถปรับปรุงประสิทธิภาพนี้ได้ไหม การปรับโครงสร้างของตารางหรือดัชนีเพิ่มเติมใด ๆ นั้นเป็นเรื่องปกติ
contains
สืบค้นและในขณะที่พวกเขาทำงานได้ดีในการลดปริมาณข้อมูลที่อ่าน ค่าใช้จ่ายที่ต่อต้านสิ่งนี้