加入价值范围的最优绩效

Reg*_*ser 7 sql t-sql sql-server query-optimization

我有一个非常大的表,包含IP地址的整数表示,第二个表包含IP地址的整数表示的起始和结束范围.第二个表用于按照几个stackoverflow文章返回国家/地区.虽然这会返回所需的结果,但性能相当差.加入一个范围是否有更高性能的替代方案?下面是一组示例代码,显示了当前连接的工作方式:

CREATE TABLE #BaseTable
    ( SomeIntegerValue INT PRIMARY KEY);

INSERT INTO #BaseTable (SomeIntegerValue)
SELECT SomeIntegerValue
FROM (VALUES
    (123), (456), (789)) Data (SomeIntegerValue);

CREATE TABLE #RangeLookupTable
    ( RangeStartValue INT PRIMARY KEY
    , RangeEndValue INT NOT NULL);

INSERT INTO #RangeLookupTable (RangeStartValue, RangeEndValue)
SELECT RangeStartValue, RangeEndValue
FROM (VALUES
      (0, 100), (101, 200), (201, 300)
    , (301, 400), (401, 500), (501, 600)
    , (701, 800), (901, 1000)) Data (RangeStartValue, RangeEndValue);

SELECT *
FROM #BaseTable bt
JOIN #RangeLookupTable rlt
    ON bt.SomeIntegerValue BETWEEN rlt.RangeStartValue AND rlt.RangeEndValue
Run Code Online (Sandbox Code Playgroud)

Nic*_*sen 0

这几乎肯定是索引问题。您当前在(主键)上有一个索引RangeStartValue,但在 上没有索引RangeEndValue,因此在缩小第一列的范围后,它可能必须对第二列进行完整扫描。尝试对 进行索引RangeEndValue,看看这会如何影响它。

我不太熟悉该BETWEEN子句的性能质量,但您可以通过使用不等式检查编写比较的双方来保证这不会成为问题。


另外,在此测试脚本中,您将选择基表中的每一行,我想您没有在生产数据库中执行此操作?