Udostępnij przez


Property Promotion

Jeśli kwerendy są wykonywane głównie na niewielką liczbę wartości elementów i atrybut, można promować te ilości na relacyjnych kolumny.Jest to przydatne podczas generowania kwerend na niewielką część danych XML w czasie, gdy pobierana jest cała wystąpienie XML.Tworzenie indeksu XML kolumna XML nie jest wymagane.Zamiast tego promowanych kolumna mogą być indeksowane.Do używania promowanych kolumna muszą być zapisane kwerendy.Oznacza to optymalizator kwerendy nie docelowe ponownie kwerendy kolumna XML do kolumna podwyższony.

Podwyższony kolumny może być kolumna obliczana w tej samej tabela lub może być osobne, obsługiwane przez użytkownika kolumny w tabela.Jest to wystarczające w przypadku, gdy promowanych pojedynczych wartości z każdego wystąpienie XML.Jednak w przypadku wielowartościowych właściwość trzeba tworzyć osobnej tabela dla właściwość, zgodnie z opisem w poniższej sekcji.

Obliczona na podstawie kolumna na typ danych xml

Kolumna obliczana mogą być tworzone przy użyciu wywołuje funkcja zdefiniowaną przez użytkownika XML metody typu danych. Typ kolumna obliczana może być dowolnego typu SQL, w tym XML.Jest to zilustrowane w poniższym przykładzie.

Przykład: kolumna obliczana Oparte na danych typu metoda xml

Tworzenie funkcja zdefiniowanej przez użytkownika dla księgi numer ISBN:

CREATE FUNCTION udf_get_book_ISBN (@xData xml)
RETURNS varchar(20)
BEGIN
   DECLARE @ISBN   varchar(20)
   SELECT @ISBN = @xData.value('/book[1]/@ISBN', 'varchar(20)')
   RETURN @ISBN 
END

Dodawanie kolumna obliczana tabela ISBN:

ALTER TABLE      T
ADD   ISBN AS dbo.udf_get_book_ISBN(xCol)

Kolumna obliczana mogą być indeksowane w zwykły sposób.

Przykład: Kwerendy dotyczące obliczono kolumna na podstawie danych typu metody danych xml

Aby uzyskać <book> którego ISBN to 0-7356-1588-2:

SELECT xCol
FROM   T
WHERE  xCol.exist('/book/@ISBN[. = "0-7356-1588-2"]') = 1

Ponownie zapisywane, tak kwerendy w kolumnie XML może być aby przechowywały użyć kolumna obliczana w następujący sposób:

SELECT xCol
FROM   T
WHERE  ISBN = '0-7356-1588-2'

Można utworzyć funkcja zdefiniowaną przez użytkownika do zwracania XML typ danych, to kolumna obliczana przy użyciu funkcja zdefiniowanej przez użytkownika.Jednak nie można utworzyć indeksu XML na kolumna obliczanej, XML.

Tworzenie właściwość tabel

Możesz promować wielowartościowych właściwości z danych XML do jednej lub kilku tabel, tworzenie indeksów w tych tabelach i ponownie kierować kwerendy z nich korzystać.Typowy scenariusz jest jeden, w której niewielka liczba właściwości obejmuje większość operacje są przeprowadzane kwerendy.Można wykonać następujące czynności:

  • Utwórz jedną lub więcej tabel do przechowywania wielowartościowych właściwości.Może się okazać, że do przechowywania jedną właściwość na tabeli i zduplikowany klucz podstawowy tabela bazowa w tabelach właściwości do tyłu łączącą z tabela bazowa.

  • Jeśli chcesz zachować względna kolejność właściwości, należy wprowadzić osobny kolumna względne zlecenia.

  • Tworzenie wyzwalaczy na kolumnie XML, aby zachować tabele właściwość.W ramach wyzwalacze wykonaj jedną z następujących czynności:

    • Użycie XML należy wpisać metody, takie jak danychnodes() and Value(), na wstawianie i usuwanie wierszy w tabelach właściwość.

    • Tworzenie, przesyłanie strumieniowe wycenione tabela funkcji aparatu plików wykonywalnych języka wspólnego (CLR) do wstawiania i usuwania wierszy w tabelach właściwość.

    • Zapisywać kwerendy SQL dostępu do tabel właściwość oraz XML dostępu XML, kolumna w tabela bazowa, za pomocą sprzężeń między tabelami przy użyciu ich klucz podstawowy.

Przykład: Utwórz właściwość tabela

Ilustracji założono, że, który chcesz podwyższyć imię autorów.Ksiąg ma jednego lub kilku autorów, tak że imię jest wielowartościowych właściwość.Każda nazwa pierwszego są przechowywane w osobnym wierszu tabela właściwość.Klucz podstawowy tabela bazowa jest zduplikowany w tabeli właściwość dla łączyć zwrotnego.

create table tblPropAuthor (propPK int, propAuthor varchar(max))

Przykład: Tworzenie funkcja zdefiniowanej przez użytkownika, aby wygenerować zestawu zestaw wierszy z XML wystąpienie

Następujące funkcja zwracająca tabelę, udf_XML2Table, akceptuje wartości klucz podstawowy i instancję XML.Pobiera imię wszystkich autorów <book> elementy i zwraca zestaw wierszy z parami kluczy, podstawowy, imię.

create function udf_XML2Table (@pk int, @xCol xml)
returns @ret_Table table (propPK int, propAuthor varchar(max))
with schemabinding
as
begin
      insert into @ret_Table 
      select @pk, nref.value('.', 'varchar(max)')
      from   @xCol.nodes('/book/author/first-name') R(nref)
      return
end

Przykład: Tworzenie wyzwalaczy na wypełnianie właściwość tabela

Wyzwalacza wstawienia wstawia wiersze w tabela właściwość:

create trigger trg_docs_INS on T for insert
as
      declare @wantedXML xml
      declare @FK int
      select @wantedXML = xCol from inserted
      select @FK = PK from inserted

   insert into tblPropAuthor
   select * from dbo.udf_XML2Table(@FK, @wantedXML)

Wyzwalacz usuwania usuwa wiersze z tabela właściwość, w oparciu o wartość klucz podstawowy usunięte wiersze:

create trigger trg_docs_DEL on T for delete
as
   declare @FK int
   select @FK = PK from deleted
   delete tblPropAuthor where propPK = @FK

Powoduje usunięcie istniejących wierszy w tabela właściwość odpowiadające zaktualizowane wystąpienie XML i wstawia nowych wierszy do tabela właściwość wyzwalaczy aktualizacji:

create trigger trg_docs_UPD
on T
for update
as
if update(xCol) or update(pk)
begin
      declare @FK int
      declare @wantedXML xml
      select @FK = PK from deleted
      delete tblPropAuthor where propPK = @FK

   select @wantedXML = xCol from inserted
   select @FK = pk from inserted

   insert into tblPropAuthor 
      select * from dbo.udf_XML2Table(@FK, @wantedXML)
end

Przykład: Znajdowanie wystąpień XML, których autorzy z tym samym imię

Kwerendy mogą być tworzone kolumna XML.Można również może wyszukiwać w tabeli Właściwość imię "David" i wykonywać łączyć zwrotnego z tabela bazowa do zwracania wystąpienie XML.Na przykład:

SELECT xCol 
FROM     T JOIN tblPropAuthor ON T.pk = tblPropAuthor.propPK
WHERE    tblPropAuthor.propAuthor = 'David'

Przykład: Rozwiązanie przy użyciu środowiska CLR Streaming funkcja zwracająca tabelę

To rozwiązanie składa się z następujących czynności:

  1. Umożliwia zdefiniowanie klasy CLR SqlReaderBase, który implementuje ISqlReader i generuje dane wyjściowe strumieniowego przesyłania, wartości w tabela przy zastosowaniu wyrażenie ścieżka w wystąpieniu XML.

  2. Tworzenie wirtualny plik dziennika i zdefiniowanej przez użytkownika funkcja języka Transact-SQL, uruchomić klasy środowiska CLR.

  3. Umożliwia określenie wstawiania, aktualizacji i usuwania wyzwalaczy przy użyciu funkcja zdefiniowanej przez użytkownika do tabel właściwość zachowania.

Aby to zrobić, należy najpierw utworzyć strumieniowych funkcja środowiska CLR.The xml data type is exposed as a managed class SqlXml in ADO.NET and supports the CreateReader() metoda that returns an XmlReader.

Uwaga

Przykładowy kod w tej sekcji używa XPathDocument i Element XPathNavigator.Te wymusza załadować wszystkich dokumentów XML do pamięci.Podobne kod jest używany w aplikacji do przetwarzania kilku dużych dokumentów XML, kod ten nie jest skalowalne.Zamiast tego należy zachować mały alokacji pamięci i za pomocą interfejsów strumieniowych, o ile to możliwe.Aby uzyskać więcej informacji na temat wydajności Zobacz Architektura integracja CLR.

public class c_streaming_xml_tvf {
   public static ISqlReader streaming_xml_tvf 
(SqlXml xmlDoc, string pathExpression) {
      return (new TestSqlReaderBase (xmlDoc, pathExpression));
   }
}

// Class that implements ISqlReader
public class TestSqlReaderBase : ISqlReader {
XPathNodeIterator m_iterator;         
   public SqlChars FirstName;
// Metadata for current resultset
private SqlMetaData[] m_rgSqlMetaData;      

   public TestSqlReaderBase (SqlXml xmlDoc, string pathExpression) {   
      // Variables for XPath navigation
      XPathDocument xDoc;
      XPathNavigator xNav;
      XPathExpression xPath;
   
      // Set sql metadata
      m_rgSqlMetaData = new SqlMetaData[1];
      m_rgSqlMetaData[0] = new SqlMetaData ("FirstName",  
SqlDbType.NVarChar,50);   
   
      //Set up the Navigator
      if (!xmlDoc.IsNull)
          xDoc = new XPathDocument (xmlDoc.CreateReader());
      else
          xDoc = new XPathDocument ();
      xNav = xDoc.CreateNavigator();
      xPath = xNav.Compile (pathExpression);
      m_iterator = xNav.Select(xPath);
   }
   public bool Read() {
      bool moreRows = true;
      if (moreRows = m_iterator.MoveNext())
         FirstName = new SqlChars (m_iterator.Current.Value);
      return moreRows;
   }
}

Następnie należy utworzyć zespół i Transact-SQL funkcji zdefiniowanej przez użytkownika SQL_streaming_xml_tvf (niewidoczne), który odnosi się do funkcja środowiska CLR streaming_xml_tvf. funkcja zdefiniowanej przez użytkownika jest używane do definiowania wartości tabela funkcja CLR_udf_XML2Table, w celu wygenerowania zestaw wierszy:

create function CLR_udf_XML2Table (@pk int, @xCol xml)
returns @ret_Table table (FK int, FirstName varchar(max))
with schemabinding
as
begin
      insert into @ret_Table 
   select @pk, FirstName 
   FROM   SQL_streaming_xml_tvf (@xCol, '/book/author/first-name')
      return
end

Wreszcie, definiowanie wyzwalacze jak pokazano w przykładzie, „ Tworzenie wyzwalaczy, aby wypełnić tabela właściwość", ale zamienić udf_XML2Table funkcja CLR_udf_XML2Table.W poniższym przykładzie pokazano wyzwalacza wstawienia:

create trigger CLR_trg_docs_INS on T for insert
as
   declare @wantedXML xml
   declare @FK int
   select @wantedXML = xCol from inserted
   select @FK = PK from inserted

   insert into tblPropAuthor
      select *
   from    dbo.CLR_udf_XML2Table(@FK, @wantedXML)

Usuwanie wyzwalacza jest taka sama, jak w wersja innej niż środowiska CLR.Jednak wyzwalacza aktualizacji tylko zastępuje udf_XML2Table() funkcja CLR_udf_XML2Table().