我有一个简单的查询和表,我想知道哪种索引对这种表和查询是有效的。
在我的表中,我有 3 列
CREATE TABLE mYTable(ipFrom BIGINT, ipto BIGINT, url NVARCHAR(255))
Run Code Online (Sandbox Code Playgroud)
我正在运行这个简单的查询。
SELECT url
FROM MyTable
WHERE ipto <= somevalue AND ipfrom >= somevalue
Run Code Online (Sandbox Code Playgroud)
我还在所有 3 列上创建了索引,这些列聚集在 ipFrom 上,其余 2 列上没有聚集。但是这个查询在 CPU 和读取方面给我带来了非常糟糕的性能。
有什么建议。
我实施的是我喜欢根据 IP 地址重定向用户。我存储了来自不同地区和州的多个 IP 范围,并根据用户的 IP 将用户重定向到适当的 URL。
是的,我认为我在两列中以错误的方式插入了数据(稍后会重命名列),但这里的重点是最小化 CPU。
当我查看那里的执行计划时,它会在 where 子句中转换数据,我不知道它为什么要在 where 子句中转换数据。有这样的事情
|--聚簇索引查找(OBJECT:([T].[TC]), SEEK:([T].[C] > Convert([@V])
我的问题与这个问题类似,但(我认为)有足够大的差异。我有一个基本范围,我想在一个表中找到所有其他范围与它和彼此冲突。或者更确切地说是形成范围的项目,但它并没有真正产生影响。
带星号的那一行是起始范围。范围 1,2 和 3 是应该扩展它的范围。结果范围应该是 X。
1 |
3 | ===1==== ====
5 | ==2== ====*==== ====
6 | ====3==== =====
--+-------------------------------------
| |<--------X-------->|
Run Code Online (Sandbox Code Playgroud)
我写过这个:
WITH cte
AS (
SELECT DATA1.ID, DATA1.STARTDATE, DATA1.ENDDATE
FROM DATA1
WHERE
DATA1.ID = @PARID AND
DATA1.STARTDATE > @STARTDATE AND
DATA1.ENDDATE < @ENDDATE
UNION ALL
SELECT DATA1.ID, DATA1.STARTDATE, DATA1.ENDDATE
FROM cte
INNER JOIN DATA1 ON (DATA1.ID = cte.ID)
WHERE
DATA1.ID = @PARID AND
(cte.STARTDATE < DATA1.ENDDATE AND cte.ENDDATE > DATA1.ENDDATE)
) …Run Code Online (Sandbox Code Playgroud)