为了在那里给出答案,我做了以下测试场景。
首先我创建一个测试表并用 100.000 行填充它。一个随机数(0 到 1000)应该为每个随机数产生 ~100 行。这个数字被放入一个 varchar col 并作为一个值放入您的 XML。
然后我做一个像 OP 那样的调用,需要它使用 .exist() 和 .nodes() ,第二个有一个小优势,但都需要 5 到 6 秒。事实上,我调用了两次:第二次以交换的顺序和稍微改变的搜索参数和“//item”而不是完整路径来避免通过缓存结果或计划产生误报。
现在 - 真正让我感到惊讶的是什么!-在.nodes用完整路径是比以前(9秒)慢得多,但.exist()下降到半秒,用全路径甚至下降到约0.10秒。(同时.nodes()具有短的路径比较好,但仍远远落后于.exist())
我自己的测试简而言之:XML 索引可以极大地破坏数据库。它们可以极大地加快速度(s.edit 2),但也可以减慢您的查询速度。我想了解它们是如何工作的...什么时候应该创建一个 XML 索引?为什么.nodes()有索引比没有索引更糟糕?如何避免负面影响?
CREATE TABLE #testTbl(ID INT IDENTITY PRIMARY KEY, SomeData VARCHAR(100),XmlColumn XML);
GO
DECLARE @RndNumber VARCHAR(100)=(SELECT CAST(CAST(RAND()*1000 AS INT) AS VARCHAR(100)));
INSERT INTO #testTbl VALUES('Data_' + …Run Code Online (Sandbox Code Playgroud)