簡體   English   中英

SQL Server中具有XML數據的nvarchar數據類型的索引

[英]Index on nvarchar datatype with XML data in SQL Server

我有一個具有這種結構的表:

CREATE TABLE [dbo].[GasTests]
(
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [GasReceptionId] [bigint] NOT NULL,
    [LineId] [bigint] NOT NULL,
    [LabelCode] [nvarchar](max) NULL,
    [StartTestDatetime] [datetime] NULL,
    [EndTestDatetime] [datetime] NULL,
    [ResultTest] [nvarchar](max) NULL,

    CONSTRAINT [PK_dbo.GasTests] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
)

在resulttest中,我存儲這樣的xml數據類型:

<?xml version="1.0" encoding="utf-16"?>
<GasResultTestParameterView xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ReceptionId>86</ReceptionId>
  <ISIRI_9426_C1>on</ISIRI_9426_C1>
  <ISIRI_9426_C2>on</ISIRI_9426_C2>
  <ISIRI_9426_C3>on</ISIRI_9426_C3>
  <ISIRI_9426_C4>on</ISIRI_9426_C4>
  <ISIRI_9426_C5>on</ISIRI_9426_C5>
  <ISIRI_9426_C6>on</ISIRI_9426_C6>
  <ISIRI_9426_C7>on</ISIRI_9426_C7>
  <ISIRI_9426_C8>on</ISIRI_9426_C8>
  <ISIRI_9426_C9>on</ISIRI_9426_C9>
  <ISIRI_9426_C10>on</ISIRI_9426_C10>
  <ISIRI_9426_C11>on</ISIRI_9426_C11>
  <ISIRI_9426_C12>on</ISIRI_9426_C12>
  <ISIRI_9426_C13>on</ISIRI_9426_C13>
  <ISIRI_9426_C14>on</ISIRI_9426_C14>
  <ISIRI_9426_C15>on</ISIRI_9426_C15>
  <ISIRI_9426_C16>on</ISIRI_9426_C16>
  <ISIRI_9426_C17>on</ISIRI_9426_C17>
  <ISIRI_9426_C18>on</ISIRI_9426_C18>
  <ISIRI_9426_C19>on</ISIRI_9426_C19>
  <ISIRI_9426_C20>on</ISIRI_9426_C20>
  <ISIRI_9426_C21>on</ISIRI_9426_C21>
  <ISIRI_9426_C22>on</ISIRI_9426_C22>
  <ISIRI_9426_C23>on</ISIRI_9426_C23>
  <ISIRI_9426_C24>on</ISIRI_9426_C24>
  <ISIRI_9426_C25>on</ISIRI_9426_C25>
  <ISIRI_9426_C26>on</ISIRI_9426_C26>
  <ISIRI_9426_C27>on</ISIRI_9426_C27>
  <ISIRI_9426_C28>on</ISIRI_9426_C28>
  <ISIRI_9426_C29>on</ISIRI_9426_C29>
  <ISIRI_9426_C30>on</ISIRI_9426_C30>
  <ISIRI_9747_K1>on</ISIRI_9747_K1>
  <ISIRI_9747_K2>on</ISIRI_9747_K2>
  <ISIRI_9747_K3>on</ISIRI_9747_K3>
  <ISIRI_9747_K4>on</ISIRI_9747_K4>
  <ISIRI_9747_K5>on</ISIRI_9747_K5>
  <ISIRI_9747_K6>on</ISIRI_9747_K6>
  <ISIRI_9747_K7>on</ISIRI_9747_K7>
  <ISIRI_9747_K8>on</ISIRI_9747_K8>
  <ISIRI_9747_K9>on</ISIRI_9747_K9>
  <ISIRI_9747_K10>on</ISIRI_9747_K10>
  <ISIRI_9747_K11>on</ISIRI_9747_K11>
  <ISIRI_9747_K12>on</ISIRI_9747_K12>
  <ISIRI_9747_K13>on</ISIRI_9747_K13>
  <ISIRI_9747_K14>on</ISIRI_9747_K14>
  <ISIRI_9747_K15>on</ISIRI_9747_K15>
  <ISIRI_9747_K16>on</ISIRI_9747_K16>
  <ISIRI_9747_K17>on</ISIRI_9747_K17>
  <ISIRI_9747_K18>on</ISIRI_9747_K18>
  <ISIRI_9747_K19>on</ISIRI_9747_K19>
  <ISIRI_9747_K20>on</ISIRI_9747_K20>
  <ISIRI_9747_K21>on</ISIRI_9747_K21>
  <ISIRI_9747_K22>on</ISIRI_9747_K22>
  <ISIRI_9747_K23>on</ISIRI_9747_K23>
  <ISIRI_9747_K24>on</ISIRI_9747_K24>
  <ISIRI_9747_K25>on</ISIRI_9747_K25>
  <ISIRI_9747_K26>on</ISIRI_9747_K26>
  <ISIRI_9747_K27>on</ISIRI_9747_K27>
  <ISIRI_9747_K28>on</ISIRI_9747_K28>
  <ISIRI_9747_K29>on</ISIRI_9747_K29>
  <ISIRI_9747_K30>on</ISIRI_9747_K30>
  <ISIRI_9747_K31>on</ISIRI_9747_K31>
  <ISIRI_9747_K32>on</ISIRI_9747_K32>
  <ISIRI_9747_K33>on</ISIRI_9747_K33>
  <ISIRI_9747_K34>on</ISIRI_9747_K34>
  <ISIRI_9747_K35>on</ISIRI_9747_K35>
  <ISIRI_9747_K36>on</ISIRI_9747_K36>
  <ISIRI_9747_K37>on</ISIRI_9747_K37>
  <ISIRI_9747_K38>on</ISIRI_9747_K38>
  <ISIRI_9747_K39>on</ISIRI_9747_K39>
  <ISIRI_9747_K40>on</ISIRI_9747_K40>
  <ISIRI_9747_K41>on</ISIRI_9747_K41>
  <ISIRI_9747_K42>on</ISIRI_9747_K42>
  <ISIRI_9747_K43>on</ISIRI_9747_K43>
  <ISIRI_9747_K44>on</ISIRI_9747_K44>
  <ISIRI_9747_K45>on</ISIRI_9747_K45>
  <ISIRI_9747_K46>on</ISIRI_9747_K46>
  <TapCompany>LANDIRENZO</TapCompany>
  <TapSerialNumber>039837</TapSerialNumber>
  <RegulatorCompany>OMVL</RegulatorCompany>
  <RegulatorSerialNumber>039837</RegulatorSerialNumber>
  <CapsuleCompany>JINDUN</CapsuleCompany>
  <CapsuleSerialNumber>1004986</CapsuleSerialNumber>
  <CapsuleType>2</CapsuleType>
  <CapsuleBuiltDate>1391</CapsuleBuiltDate>
  <CapsuleExpireDate>1402</CapsuleExpireDate>
  <GasSystemGeneration>2</GasSystemGeneration>
  <Remark>تایید</Remark>
  <PassedISIRI9747>on</PassedISIRI9747>
  <PassedISIRI9426>on</PassedISIRI9426>
  <PassedISIRI6792>noneed</PassedISIRI6792>
</GasResultTestParameterView>

我需要大量基於xml結果的報告。 但是,當我想在XML中搜索項目時,會花費很多時間。 如何使表和xml更快?

如果將Resulttest定義XML ,則可以從XML中獲取各個位並將其存儲為表 (作為計算列)

以XML格式存儲有兩個主要好處:

  • 與將其存儲為純文本相比,存儲更有效-XML將在內部“切碎”並存儲為令牌。 這樣可以減少存儲空間,並且可以更快地訪問XML。
  • 使用XML列可讓您在其上使用XQuery函數來處理XML結構

首先,定義一個這樣的標量函數(假設您想“ TapCompanyTapCompany值):

CREATE FUNCTION dbo.GetTapCompany(@Input XML)
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @Result VARCHAR(100)

    SELECT @Result = @Input.value('(/GasResultTestParameterView/TapCompany)[1]', 'VARCHAR(100)')

    RETURN @Result
END

此函數將XML值(來自表行)作為輸入,進入XML並獲取TapCompany值,然后將其返回。

然后,將其作為列添加到數據庫表中:

ALTER TABLE dbo.GasTests
ADD TapCompany AS dbo.GetTapCompany(Resulttest);

現在,您應該能夠從表中進行選擇,並獲得TapCompany的值以及其他表的值:

SELECT 
    Id,
    GasReceptionId,
    LineId,
    LabelCode,
    TapCompany
FROM   
    dbo.GasTests

不幸的是,您不能使該列持久存在 -因此,每次從該表中選擇並包括該列時,都會調用提供該值的標量函數。 因此,我不確定您是否會看到任何性能改進-但我認為應該很容易檢查一下-使用您的真實數據-試試看!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM