Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
SELECT @@VERSION
Microsoft SQL Server 2005 - 9.00.5000.00 (X64)   Dec 10 2010 10:38:40   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 


Есть таблица

CREATE TABLE [inv].[DetailsXMLTest](
	[DetailId] [bigint] NOT NULL,
	[ValueXML] [xml] NULL,
 CONSTRAINT [PK_DetailsXMLTest] PRIMARY KEY CLUSTERED 
(
	[DetailId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


XML вида:
<root>
  <MakeId>413</MakeId>
  <DetailNum>000000000183</DetailNum>
  <DetailWeight>0</DetailWeight>
  <NewDetailId>0</NewDetailId>
  <DetailWeightNetto>0</DetailWeightNetto>
  <bitApply>0</bitApply>
  <DeliveryCategory>3</DeliveryCategory>
  <DetailDeliveryCategoryId>3</DetailDeliveryCategoryId>
</root>


Задача найти DetailId в таблице [inv].[DetailsXMLTest], у которой в XML есть нод DetailNum с заданным значением. Задачу решает следующий запрос:
SELECT DetailId
FROM   inv.DetailsXMLTest
WHERE  ValueXML.value('(//root/DetailNum/.)[1]','varchar(50)') = '000000000183'

В таблице 10 млн. строк, ищет очень медленно.
Создаю все возможные XML-индексы для таблицы:
CREATE PRIMARY XML INDEX XML_DetailsXMLTest_ValueXML ON inv.DetailsXMLTest(ValueXML)
CREATE XML INDEX XML_Value_DetailsXMLTest_ValueXML ON inv.DetailsXMLTest(ValueXML) USING XML INDEX XML_DetailsXMLTest_ValueXML FOR PATH
CREATE XML INDEX XML_Value1_DetailsXMLTest_ValueXML ON inv.DetailsXMLTest(ValueXML) USING XML INDEX XML_DetailsXMLTest_ValueXML FOR VALUE
CREATE XML INDEX XML_Value2_DetailsXMLTest_ValueXML ON inv.DetailsXMLTest(ValueXML) USING XML INDEX XML_DetailsXMLTest_ValueXML FOR PROPERTY


Получаю следующий план запроса:
DetailId
--------------------
54800957

(1 row(s) affected)

Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                                                                                                         DefinedValues                                                                                                                                                                                                                                  EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                     Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
1                    1                    SELECT DetailId
FROM   inv.DetailsXMLTest
WHERE  ValueXML.value('(//root/DetailNum/.)[1]','varchar(50)') = '000000000183'                                                                                                                                      1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                                                                                             NULL                                                                                                                                                                                                                                           5623,413      NULL          NULL          NULL        116,4809         NULL                                                                                                                                                           NULL     SELECT                                                           0        NULL
1                    1                      |--Filter(WHERE:([Expr1020]='000000000183'))                                                                                                                                                                                                                   1           2           1           Filter                         Filter                         WHERE:([Expr1020]='000000000183')                                                                                                                                                                                                                                NULL                                                                                                                                                                                                                                           5623,413      0             0,048         15          116,4809         [EmExTemp].[inv].[DetailsXMLTest].[DetailId]                                                                                                                   NULL     PLAN_ROW                                                         0        1
100000               1                           |--Nested Loops(Inner Join, OUTER REFERENCES:([EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML]))                                                                                                                1           3           2           Nested Loops                   Inner Join                     OUTER REFERENCES:([EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML])                                                                                                                                                    NULL                                                                                                                                                                                                                                           100000        0             0,418         44          116,4329         [EmExTemp].[inv].[DetailsXMLTest].[DetailId], [Expr1020]                                                                                                       NULL     PLAN_ROW                                                         0        1
100000               1                                |--Clustered Index Scan(OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest]))                                                                                                                                                              1           4           3           Clustered Index Scan           Clustered Index Scan           OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest])                                                                                                                                                                                                   [EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML]                                                                                                                                                     100000        3,531273      0,110157      4043        3,64143          [EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML]                                                                     NULL     PLAN_ROW                                                         0        1
100000               100000                           |--Stream Aggregate(DEFINE:([Expr1020]=MIN(CASE WHEN [EmExTemp].[inv].[DetailsXMLTest].[ValueXML] IS NULL THEN NULL ELSE CASE WHEN datalength([Expr1017])>=(128) THEN CONVERT_IMPLICIT(varchar(50),[Expr1018],0) ELSE CONVERT_IMPLICIT(varchar(50),[ 1           5           3           Stream Aggregate               Aggregate                      NULL                                                                                                                                                                                                                                                             [Expr1020]=MIN(CASE WHEN [EmExTemp].[inv].[DetailsXMLTest].[ValueXML] IS NULL THEN NULL ELSE CASE WHEN datalength([Expr1017])>=(128) THEN CONVERT_IMPLICIT(varchar(50),[Expr1018],0) ELSE CONVERT_IMPLICIT(varchar(50),[Expr1017],0) END END)  1             0             1,347865E-06  36          112,3735         [Expr1020]                                                                                                                                                     NULL     PLAN_ROW                                                         0        100000
100000               100000                                |--UDX(([Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin], [Expr1009], [DetailNum:1].[pk1], [DetailNum:1].[id], [Desc:2].[id]))                                                          1           6           5           UDX                            UDX                            XQUERY DATA[Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin], [Expr1009], [DetailNum:1].[pk1], [DetailNum:1].[id], [Desc:2].[id]                                                                          [Expr1015][Expr1016][Expr1017][Expr1018][Expr1019]                                                                                                                                                                                             1,413108      0             1,413108E-06  5077        112,2387         [Expr1017], [Expr1018]                                                                                                                                         NULL     PLAN_ROW                                                         0        100000
200000               100000                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([DetailNum:1].[id], [Expr1021]))                                                                                                                                                             1           7           6           Nested Loops                   Inner Join                     OUTER REFERENCES:([DetailNum:1].[id], [Expr1021])                                                                                                                                                                                                                NULL                                                                                                                                                                                                                                           1,766386      0             7,383492E-06  12546       112,0974         [DetailNum:1].[id], [DetailNum:1].[pk1], [Expr1009], [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]  NULL     PLAN_ROW                                                         0        100000
100000               100000                                          |--Top(TOP EXPRESSION:((1)))                                                                                                                                                                                                          1           8           7           Top                            Top                            TOP EXPRESSION:((1))                                                                                                                                                                                                                                             NULL                                                                                                                                                                                                                                           1             0             1E-07         924         57,54039         [DetailNum:1].[id], [DetailNum:1].[pk1], [Expr1009], [Expr1021]                                                                                                NULL     PLAN_ROW                                                         0        100000
0                    0                                               |    |--Compute Scalar(DEFINE:([Expr1009]=0x58))                                                                                                                                                                                      1           9           8           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1009]=0x58)                                                                                                                                                                                                                                         [Expr1009]=0x58                                                                                                                                                                                                                                1             0             1E-07         924         57,5304          [DetailNum:1].[id], [DetailNum:1].[pk1], [Expr1009], [Expr1021]                                                                                                NULL     PLAN_ROW                                                         0        100000
0                    0                                               |         |--Compute Scalar(DEFINE:([Expr1021]=getdescendantlimit([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[id] as [DetailNum:1].[id])))                                                                                    1           10          9           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1021]=getdescendantlimit([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[id] as [DetailNum:1].[id]))                                                                                                                                            [Expr1021]=getdescendantlimit([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[id] as [DetailNum:1].[id])                                                                                                                                   1             0             1E-07         472         57,52039         [DetailNum:1].[id], [DetailNum:1].[pk1], [Expr1021]                                                                                                            NULL     PLAN_ROW                                                         0        100000
100000               100000                                          |              |--Clustered Index Seek(OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [DetailNum:1]), SEEK:([DetailNum:1].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId]),  WHERE:([ 1           11          10          Clustered Index Seek           Clustered Index Seek           OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [DetailNum:1]), SEEK:([DetailNum:1].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId]),  WHERE:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[hid] as [Detail [DetailNum:1].[id], [DetailNum:1].[hid], [DetailNum:1].[pk1]                                                                                                                                                                                   1             0,003125      0,0001785892  26          55,78326         [DetailNum:1].[id], [DetailNum:1].[hid], [DetailNum:1].[pk1]                                                                                                   NULL     PLAN_ROW                                                         0        100000
200000               100000                                          |--Clustered Index Seek(OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [Desc:2]), SEEK:([Desc:2].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [Desc:2].[id] >= [EmExTemp].[sys 1           19          7           Clustered Index Seek           Clustered Index Seek           OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [Desc:2]), SEEK:([Desc:2].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [Desc:2].[id] >= [EmExTemp].[sys].[xml_index_nodes_362484370_32000].[id] as [Detail [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]                                                                                                                                       1,766386      0,003125      0,000158943   12082       53,81865         [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]                                                       NULL     PLAN_ROW                                                         0        100000

(12 row(s) affected)



(1 row(s) affected)

Непонятно откуда там "Clustered Index Scan(OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest]))", из-за этого запрос очень сильно тормозит.
Такое ощущение, что я неправильно использую XML-индексы.
20 апр 12, 17:25    [12447524]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
iljy
Member

Откуда:
Сообщений: 8711
Oblom,

SELECT DetailId
FROM   inv.DetailsXMLTest
WHERE  ValueXML.exist('//root/DetailNum[.="000000000183"]') = 1
20 апр 12, 17:44    [12447685]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
iljy
Oblom,

SELECT DetailId
FROM   inv.DetailsXMLTest
WHERE  ValueXML.exist('//root/DetailNum[.="000000000183"]') = 1


получившийся план:
DetailId
--------------------
54800957

(1 row(s) affected)

Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                                                                                                         DefinedValues                                                                                             EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                            Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- --------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
1                    1                    SELECT DetailId
FROM   inv.DetailsXMLTest
WHERE  ValueXML.exist('//root/DetailNum[.="000000000183"]') = 1                                                                                                                                                      1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                                                                                             NULL                                                                                                      84938,93      NULL          NULL          NULL        83,1982          NULL                                                                                                                  NULL     SELECT                                                           0        NULL
1                    1                      |--Nested Loops(Left Semi Join, OUTER REFERENCES:([EmExTemp].[inv].[DetailsXMLTest].[DetailId]))                                                                                                                                                               1           2           1           Nested Loops                   Left Semi Join                 OUTER REFERENCES:([EmExTemp].[inv].[DetailsXMLTest].[DetailId])                                                                                                                                                                                                  NULL                                                                                                      84938,93      0             0,3944941     15          83,1982          [EmExTemp].[inv].[DetailsXMLTest].[DetailId]                                                                          NULL     PLAN_ROW                                                         0        1
100000               1                           |--Filter(WHERE:([EmExTemp].[inv].[DetailsXMLTest].[ValueXML] IS NOT NULL))                                                                                                                                                                               1           3           2           Filter                         Filter                         WHERE:([EmExTemp].[inv].[DetailsXMLTest].[ValueXML] IS NOT NULL)                                                                                                                                                                                                 NULL                                                                                                      94376,59      0             0,048         15          3,68943          [EmExTemp].[inv].[DetailsXMLTest].[DetailId]                                                                          NULL     PLAN_ROW                                                         0        1
100000               1                           |    |--Clustered Index Scan(OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest]))                                                                                                                                                              1           4           3           Clustered Index Scan           Clustered Index Scan           OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest])                                                                                                                                                                                                   [EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML]                100000        3,531273      0,110157      4043        3,64143          [EmExTemp].[inv].[DetailsXMLTest].[DetailId], [EmExTemp].[inv].[DetailsXMLTest].[ValueXML]                            NULL     PLAN_ROW                                                         0        1
1                    100000                      |--Nested Loops(Left Semi Join, OUTER REFERENCES:([DetailNum:1].[id], [DetailNum:1].[pk1]))                                                                                                                                                               1           6           2           Nested Loops                   Left Semi Join                 OUTER REFERENCES:([DetailNum:1].[id], [DetailNum:1].[pk1])                                                                                                                                                                                                       NULL                                                                                                      1             0             4,18E-06      9           79,11428         NULL                                                                                                                  NULL     PLAN_ROW                                                         0        94376,59
100000               100000                           |--Index Seek(OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_Value2_DetailsXMLTest_ValueXML] AS [DetailNum:1]), SEEK:([DetailNum:1].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [DetailNum:1].[hid] >= '&#194;€&#192;&#255;' AND [Deta 1           7           6           Index Seek                     Index Seek                     OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_Value2_DetailsXMLTest_ValueXML] AS [DetailNum:1]), SEEK:([DetailNum:1].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [DetailNum:1].[hid] >= '&#194;€&#192;&#255;' AND [DetailNum:1].[hid] < '&#194;€&#192;&#129;),   [DetailNum:1].[id], [DetailNum:1].[hid], [DetailNum:1].[pk1]                                              1             0,003125      0,0001581     26          38,48926         [DetailNum:1].[id], [DetailNum:1].[hid], [DetailNum:1].[pk1]                                                          NULL     PLAN_ROW                                                         0        94376,59
1                    100000                           |--Filter(WHERE:([Expr1016]=000000000183))                                                                                                                                                                                                           1           8           6           Filter                         Filter                         WHERE:([Expr1016]=000000000183)                                                                                                                                                                                                                                  NULL                                                                                                      1             0             6,782921E-07  9           40,14747         NULL                                                                                                                  NULL     PLAN_ROW                                                         0        94376,59
100000               100000                                |--UDX(([Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin], [Expr1008], [DetailNum:1].[pk1], [Desc:2].[id]))                                                                              1           9           8           UDX                            UDX                            XQUERY DATA[Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin], [Expr1008], [DetailNum:1].[pk1], [Desc:2].[id]                                                                                              [Expr1014][Expr1015][Expr1016][Expr1017][Expr1018]                                                        1,090295      0             1,413108E-06  4019        40,09808         [Expr1016]                                                                                                            NULL     PLAN_ROW                                                         0        94376,59
0                    0                                          |--Compute Scalar(DEFINE:([Expr1008]=0x58))                                                                                                                                                                                                1           10          9           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1008]=0x58)                                                                                                                                                                                                                                         [Expr1008]=0x58                                                                                           1,090295      0             1,766386E-07  12534       38,33016         [Expr1008], [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]  NULL     PLAN_ROW                                                         0        94376,59
200000               100000                                          |--Clustered Index Seek(OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [Desc:2]), SEEK:([Desc:2].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [Desc:2].[id] >= [EmExTemp].[sys 1           11          10          Clustered Index Seek           Clustered Index Seek           OBJECT:([EmExTemp].[sys].[xml_index_nodes_362484370_32000].[XML_DetailsXMLTest_ValueXML] AS [Desc:2]), SEEK:([Desc:2].[pk1]=[EmExTemp].[inv].[DetailsXMLTest].[DetailId] AND [Desc:2].[id] >= [EmExTemp].[sys].[xml_index_nodes_362484370_32000].[id] as [Detail [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]  1,090295      0,003125      0,000158943   12082       38,31987         [Desc:2].[id], [Desc:2].[nid], [Desc:2].[tid], [Desc:2].[value], [Desc:2].[lvalue], [Desc:2].[lvaluebin]              NULL     PLAN_ROW                                                         0        94376,59

(10 row(s) affected)



(1 row(s) affected)


всё тот же Clustered Index Scan(OBJECT:([EmExTemp].[inv].[DetailsXMLTest].[PK_DetailsXMLTest])), и соответственно та же скорость выполнения.
Я думал, что XML-индекс позволяет искать аналогично обычному, не сканируя при этом всю таблицу.
20 апр 12, 17:51    [12447745]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
up
23 апр 12, 08:56    [12454886]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Oblom,

решил навешиванием полнотекстового поиска на XML-поле
23 апр 12, 10:04    [12455131]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Oblom,

А как насчёт сделать ребилд для всех индексов?
И статистику пересобрать (если у какого-нибудь индекса STATISTICS_NORECOMPUTE = ON).
23 апр 12, 10:09    [12455140]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Jovanny
Oblom,

А как насчёт сделать ребилд для всех индексов?
И статистику пересобрать (если у какого-нибудь индекса STATISTICS_NORECOMPUTE = ON).


А команда CREATE INDEX за ребилд канает? :)
Это тестовая таблица с тестовыми данными, на которой я создал индекс сразу после её заполнения, после чего сразу запустил запрос и получил приведенные выше результаты.
Эту таблицу никто кроме меня не юзает, я её юзаю только на SELECT.
Мне кажется маловероятным, что статистика по индексу могла устареть.
23 апр 12, 10:53    [12455357]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Oblom,

Прикольно. А если попробовать с хинтами? Типа

SELECT DetailId
FROM   inv.DetailsXMLTest WITH (INDEX(XML_Value1_DetailsXMLTest_ValueXML))
WHERE  ValueXML.exist('//root/DetailNum[.="000000000183"]') = 1
23 апр 12, 11:37    [12455653]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Jovanny
Oblom,

Прикольно. А если попробовать с хинтами? Типа

SELECT DetailId
FROM   inv.DetailsXMLTest WITH (INDEX(XML_Value1_DetailsXMLTest_ValueXML))
WHERE  ValueXML.exist('//root/DetailNum[.="000000000183"]') = 1


Так самое смешное, что судя по вышеприведенному плану XML-индексы используются, только при этом они не убирают скан кластерного индекса. Хотя по документации создание XML-индекса возможно только при наличии обычного кластерного, что подразумевает, что любой XML-индекс содержит в себе обычный кластерный.
Но если судить по плану, то запрос сканирует построчно таблицу, а уже для каждой строки включается XML-индекс для поиска в самом XML.
23 апр 12, 11:58    [12455825]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Сдаётся мне, что XML индексы дают выигрыш только при работе с большими размерами XML, т.е. скан по кластерному индексу, а внутри документа уже XML индекс.

Я раньше пытался их использовать, но никакого повышения производительности не получил.
23 апр 12, 12:48    [12456194]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Jovanny
Сдаётся мне, что XML индексы дают выигрыш только при работе с большими размерами XML, т.е. скан по кластерному индексу, а внутри документа уже XML индекс.

Я раньше пытался их использовать, но никакого повышения производительности не получил.


А полнотекстовый поиск по XML ищет быстро, но не всё. Куда ни кинь, всюду клин :(
23 апр 12, 13:51    [12456629]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Есть ещё один выход: создать вычисляемое поле на основе пользовательской функции, которая извлекает из xml нужное значение, а потом индекс на основе этого поля.
23 апр 12, 14:33    [12456979]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Что-то типа такого:
CREATE FUNCTION inv.getDetailNum
(
	@ValueXML xml
)
RETURNS varchar(50)
WITH SCHEMABINDING
AS
BEGIN
	RETURN @ValueXML.value('(//root/DetailNum/.)[1]','varchar(50)');
END

и таблица соответственно
CREATE TABLE [inv].[DetailsXMLTest](
	[DetailId] [bigint] NOT NULL,
	[ValueXML] [xml] NULL,
        [DetailNum] AS inv.getDetailNum([ValueXML])
 CONSTRAINT [PK_DetailsXMLTest] PRIMARY KEY CLUSTERED 
(
	[DetailId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
23 апр 12, 14:40    [12457044]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Jovanny,

Это, конечно, вариант.
Но я как раз и пытался уйти от модели Key - Value к XML, и проверить, с чем удобнее, а главное быстрее работать на больших данных. А вычисляемое поле снова нас возвращает к модели Key - Value, что, собственно, и требовалось доказать :)

Большое спасибо за помощь!
23 апр 12, 17:45    [12458695]     Ответить | Цитировать Сообщить модератору
 Re: XML индекс  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
Oblom
Но я как раз и пытался уйти от модели Key - Value к XML, и проверить, с чем удобнее, а главное быстрее работать на больших данных.
По моему, это понятно и без проверок :-)

Ещё быстрее и удобнее просто реляционная модель, но конечно бывают исключения, можно использовать и Key - Value. А XML только для внешнего обмена.
23 апр 12, 18:56    [12458998]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить