Aracılığıyla paylaş


xml veri türü ve sütunları (SQL Server)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bu makalede, SQL Server'daki xml veri türünün avantajları ve sınırlamaları açıklanır ve XML verilerinin nasıl depoileceğini seçmenize yardımcı olur.

İlişkisel veya XML veri modeli

Verileriniz bilinen bir şemayla yüksek oranda yapılandırılmışsa ilişkisel model büyük olasılıkla veri depolama için en iyi şekilde çalışır. SQL Server, ihtiyacınız olabilecek gerekli işlevleri ve araçları sağlar. Öte yandan, yapı yarı yapılandırılmış veya yapılandırılmamış ya da bilinmiyorsa, bu tür verileri modellemeyi göz önünde bulundurmanız gerekir.

Xml, yapısal ve anlamsal işaretleme kullanarak verilerin taşınabilirliğini sağlamak için platformdan bağımsız bir model istiyorsanız iyi bir seçimdir. Ayrıca, aşağıdaki özelliklerden bazıları karşılanırsa uygun bir seçenektir:

  • Verileriniz seyrek veya verilerin yapısını bilmiyorsanız veya verilerinizin yapısı gelecekte önemli ölçüde değişebilir.

  • Verileriniz varlıklar arasındaki başvurular yerine kapsama hiyerarşisini temsil eder ve özyinelemeli olabilir.

  • Düzen, verilerinizin doğasında yer alır.

  • Verileri sorgulamak veya yapısını temel alarak bölümlerini güncelleştirmek istiyorsunuz.

Bu koşullardan hiçbiri karşılanmazsa ilişkisel veri modelini kullanmanız gerekir. Örneğin, verileriniz XML biçimindeyse ancak uygulamanız yalnızca verileri depolamak ve almak için veritabanını kullanıyorsa tek ihtiyacınız olan [n]varchar(max) sütunudur. Verileri bir XML sütununda depolamanın ek avantajları vardır. Bu, motorun verilerin iyi biçimlendirilmiş veya geçerli olduğunu belirlemesini ve ayrıntılı sorgu ve XML verilerine yapılan güncellemeleri desteklemeyi içerir.

SQL Server'da XML verilerini depolama nedenleri

Dosya sistemindeki XML verilerinizi yönetmek yerine SQL Server'da yerel XML özelliklerini kullanmanın nedenlerinden bazıları şunlardır:

  • XML verilerinizi verimli ve işlemli bir şekilde paylaşmak, sorgulamak ve değiştirmek istiyorsunuz. Ayrıntılı veri erişimi uygulamanız için önemlidir. Örneğin, XML belgesi içindeki bölümlerden bazılarını ayıklamak veya belgenizin tamamını değiştirmeden yeni bir bölüm eklemek isteyebilirsiniz.

  • İlişkisel verileriniz ve XML verileriniz var ve uygulamanızdaki hem ilişkisel hem de XML verileri arasında birlikte çalışabilirlik istiyorsunuz.

  • Etki alanları arası uygulamalar için sorgu ve veri değişikliği için dil desteğine ihtiyacınız vardır.

  • Sunucunun verilerin iyi biçimlendirildiğinden emin olmasını ve ayrıca isteğe bağlı olarak verilerinizi XML şemalarına göre doğrulamasını istiyorsunuz.

  • Verimli sorgu işleme ve iyi ölçeklenebilirlik için XML verilerinin dizinini oluşturmak ve birinci sınıf sorgu iyileştirici kullanmak istiyorsunuz.

  • SOAP, ADO.NET ve OLE DB'nin XML verilerine erişmesini istiyorsunuz.

  • XML verilerinizi yönetmek için veritabanı sunucusunun yönetim işlevselliğini kullanmak istiyorsunuz. Örneğin, bu yedekleme, kurtarma ve çoğaltma olabilir.

Bu koşullardan hiçbiri karşılanmamışsa, verilerinizi [n]varchar(max) veya varbinary(max)) gibi XML olmayan, büyük bir nesne türü olarak depolamak daha iyi olabilir.

XML depolama seçenekleri

SQL Server'da XML için depolama seçenekleri aşağıdakileri içerir:

  • Xml veri türü olarak yerel depolama

    Veriler, verilerin XML içeriğini koruyan bir iç gösterimde depolanır. Bu iç gösterim kapsama hiyerarşisi, belge sırası ve öğe ile öznitelik değerleri hakkında bilgi içerir. Özellikle, XML verilerinin InfoSet içeriği korunur. InfoSet hakkında daha fazla bilgi için adresini ziyaret edin http://www.w3.org/TR/xml-infoset. InfoSet içeriği metin XML'sinin özdeş bir kopyası olmayabilir, çünkü şu bilgiler korunmaz: önemsiz boşluklar, öznitelik sırası, ad alanı ön ekleri ve XML bildirimi.

    Yazılan xml veri türü, XML şemalarına bağlı bir XML veri türü için, şema sonrası doğrulama InfoSet'i (PSVI) InfoSet'e tür bilgileri ekler ve iç gösterimde kodlanır. Bu, ayrıştırma hızını önemli ölçüde artırır. Daha fazla bilgi için W3C XML Şeması belirtimlerine http://www.w3.org/TR/xmlschema-1 ve http://www.w3.org/TR/xmlschema-2 konumlarından bakın.

  • XML ile ilişkisel depolama arasında eşleme

    Ek açıklamalı şema (AXSD) kullanılarak XML, bir veya daha fazla tablodaki sütunlara ayrılır. Bu, verilerin ilişkisel düzeyde uygunluk düzeyini korur. Sonuç olarak, hiyerarşik yapı korunur, ancak öğeler arasındaki sıra göz ardı edilir. Şema özyinelemeli olamaz.

  • Büyük nesne depolama, [n]varchar(max) ve varbinary(max)

    Verilerin özdeş bir kopyası depolanır. Bu, yasal belgeler gibi özel amaçlı uygulamalar için kullanışlıdır. Çoğu uygulama tam bir kopya gerektirmez ve XML içeriğinden (InfoSet uygunluğu) memnun olur.

Genel olarak, bu yaklaşımların bir bileşimini kullanmanız gerekebilir. Örneğin, XML verilerinizi bir xml veri türü sütununda depolamak ve bu sütundaki özellikleri ilişkisel sütunlara yükseltmek isteyebilirsiniz. Alternatif olarak, xml olmayan sütunlarda özyinelemeli olmayan bölümleri ve xml veri türü sütunlarında yalnızca özyinelemeli bölümleri depolamak için eşleme teknolojisini kullanmak isteyebilirsiniz.

XML teknolojisi seçimi

XML teknolojisinin yerel XML ve XML görünümü seçimi genellikle aşağıdaki faktörlere bağlıdır:

  • Depolama seçenekleri

    XML verileriniz büyük nesne depolama (örneğin, ürün el kitabı) için daha uygun olabilir veya ilişkisel sütunlarda (örneğin, XML'ye dönüştürülen bir satır öğesi) depolamaya daha uygun olabilir. Her depolama seçeneği, belgenin uygunluk düzeyini farklı bir ölçüde korur.

  • Sorgu özellikleri

    Sorgularınızın doğasına ve XML verilerinizi ne ölçüde sorguladığınıza bağlı olarak, bir depolama seçeneğini diğerinden daha uygun bulabilirsiniz. XML verilerinizin ayrıntılı sorgusu, örneğin XML düğümlerinde koşul değerlendirmesi, iki depolama seçeneğinde farklı derecelerde desteklenir.

  • XML verilerini dizinleme

    XML sorgu performansını hızlandırmak için XML verilerini dizine almak isteyebilirsiniz. Dizin oluşturma seçenekleri depolama seçeneklerine göre değişir; iş yükünüzü iyileştirmek için uygun seçimi yapmanız gerekir.

  • Veri değiştirme özellikleri

    Bazı iş yükleri, XML verilerinin ayrıntılı olarak değiştirilmesini içerir. Örneğin, belge içine yeni bir bölüm eklemeyi içerebilir, ancak Web içeriği gibi diğer iş yükleri bunu içermez. Veri değiştirme dili desteği uygulamanız için önemli olabilir.

  • Şema desteği

    XML verileriniz, XML şema belgesi olabilecek veya olmayan bir şemayla açıklanabilir. Şemaya bağlı XML desteği, XML teknolojisine bağlıdır.

Farklı seçimlerin farklı performans özellikleri de vardır.

Yerel XML depolama

XML verilerinizi sunucuda bir xml veri türü sütununda depolayabilirsiniz. Bu, aşağıdakiler geçerliyse uygun bir seçimdir:

  • XML verilerinizi sunucuda depolamanın ve aynı zamanda belge sırasını ve belge yapısını korumanın basit bir yolunu istiyorsunuz.

  • XML verileriniz için bir şemanız olabilir veya olmayabilir.

  • XML verilerinizi sorgulamak ve değiştirmek istiyorsunuz.

  • Daha hızlı sorgu işleme için XML verilerini dizine almak istiyorsunuz.

  • Uygulamanızın XML verilerinizi ve XML şemalarınızı yönetmek için sistem kataloğu görünümlerine ihtiyacı var.

Yerel XML depolama, bir yapı aralığına sahip XML belgeleriniz varsa veya ilişkisel yapılarla eşlenemeyecek kadar zor olan farklı veya karmaşık şemalara uyan XML belgeleriniz varsa kullanışlıdır.

Örnek: XML veri türünü kullanarak XML verilerini modelleme

Her konu için ayrı bir bölümden oluşan ve her bölümde birden çok bölümü olan XML biçiminde bir ürün el kitabını göz önünde bulundurun. Bir bölüm alt bölümler içerebilir. Sonuç olarak özyinelemeli <section> bir öğedir. Ürün kılavuzları büyük miktarda karışık içerik, diyagram ve teknik malzeme içerir; veriler yarı yapılandırılmıştır. Kullanıcılar, "dizin oluşturma" bölümündeki "kümelenmiş dizin" bölümünü arama ve teknik miktarları sorgulama gibi ilgi çekici konular için bağlamsal bir arama yapmak isteyebilir.

XML belgeleriniz için uygun bir depolama modeli, xml veri türü sütunudur. Bu, XML verilerinizin InfoSet içeriğini korur. XML sütununu dizine ekleme sorgu performansından yararlanır.

Örnek: XML verilerinin tam kopyalarını koruma

Çizim için, kamu düzenlemelerinin XML belgelerinizin tam metinsel kopyalarını saklamanızı gerektirdiğini varsayalım. Örneğin, bunlar imzalı belgeleri, yasal belgeleri veya hisse senedi işlem siparişlerini içerebilir. Belgelerinizi [n]varchar(max) sütununda depolamak isteyebilirsiniz.

Sorgulama için, çalışma zamanında verileri xml veri türüne dönüştürün ve üzerinde XQuery yürütün. Çalışma zamanı dönüştürme, özellikle belge büyük olduğunda maliyetli olabilir. Sık sık sorgularsanız, [n]varchar(max) sütunundan tam belge kopyalarını döndürürken, belgeleri yedekli olarak bir xml veri türü sütununda depolayabilir ve dizinleyebilirsiniz.

XML sütunu, [n]varchar(max) sütununa göre hesaplanan bir sütun olabilir. Ancak, hesaplanan bir sütunda veya bir XML sütununda XML dizini oluşturamazsınız, ayrıca [n]varchar(max) ya da varbinary(max) sütunlarına da XML dizini kurulamaz.

XML görünüm teknolojisi

XML şemalarınızla veritabanındaki tablolar arasında eşleme tanımlayarak, kalıcı verilerinizin XML görünümünü oluşturursunuz. XML toplu yükleme, XML görünümünü kullanarak temel tabloları doldurmak için kullanılabilir. XPath sürüm 1.0'i kullanarak XML görünümünü sorgulayabilirsiniz; sorgu, tablolardaki SQL sorgularına çevrilir. Benzer şekilde, güncelleştirmeler de bu tablolara yayılır.

Bu teknoloji aşağıdaki durumlarda kullanışlıdır:

  • Mevcut ilişkisel verileriniz üzerinde XML görünümlerini kullanan XML merkezli bir programlama modeline sahip olmak istiyorsunuz.

  • Xml verileriniz için bir dış iş ortağı tarafından sağlanmış olabilecek bir şemanız (XSD, XDR) var.

  • Sıra, verilerinizde önemli değildir veya sorgu tablosu verileriniz özyinelemeli değildir veya en yüksek özyineleme derinliği önceden bilinir.

  • XPath sürüm 1.0'ı kullanarak XML görünümü aracılığıyla verileri sorgulamak ve değiştirmek istiyorsunuz.

  • XML görünümünü kullanarak XML verilerini toplu olarak yüklemek ve bunları temel tablolarda ayrıştırmak istiyorsunuz.

Örnek olarak veri değişimi ve Web hizmetleri için XML olarak sunulan ilişkisel veriler ve sabit şemaya sahip XML verileri verilebilir. Daha fazla bilgi için.

Örnek: Ek açıklamalı XML şeması (AXSD) kullanarak verileri modelleme

Çizim için, XML olarak işlemek istediğiniz müşteriler, siparişler ve satır öğeleri gibi mevcut ilişkisel verileriniz olduğunu varsayalım. İlişkisel veriler üzerinde AXSD kullanarak XML görünümü tanımlayın. XML görünümü, XML verilerini tablolarınıza toplu olarak yüklemenize ve XML görünümünü kullanarak ilişkisel verileri sorgulamanıza ve güncelleştirmenize olanak tanır. BU model, SQL uygulamalarınız kesintisiz çalışırken XML işaretlemesi içeren verileri diğer uygulamalarla değiştirmek zorundaysanız kullanışlıdır.

Karma model

Genellikle ilişkisel ve xml veri türü sütunlarının birleşimi veri modelleme için uygundur. XML verilerinizdeki değerlerden bazıları ilişkisel sütunlarda, geri kalanı veya tamamı bir XML sütununda depolanabilir. Bu, ilişkisel sütunlarda oluşturulan dizinler ve kilitleme özellikleri üzerinde daha fazla denetiminiz olması açısından daha iyi bir performans sunabilir.

İlişkisel sütunlarda depolamak için gereken değerler iş yükünüze bağlıdır. Örneğin, yol ifadesini temel alan tüm XML değerlerini alırsanız, /Customer/@CustIdözniteliğin CustId değerini ilişkisel bir sütuna yükseltme ve dizin oluşturma daha hızlı sorgu performansı verebilir. Öte yandan, XML verileriniz kapsamlı ve yedekli olmayan bir şekilde ilişkisel sütunlar halinde ayrışmışsa, yeniden birleştirme maliyeti önemli olabilir.

Örneğin, yüksek oranda yapılandırılmış XML verileri için bir tablonun içeriği XML'ye dönüştürülmüştür; tüm değerleri ilişkisel sütunlara eşleyebilir ve büyük olasılıkla XML görünüm teknolojisini kullanabilirsiniz.

XML verilerinin ayrıntı düzeyi

XML sütununda depolanan XML verilerinin ayrıntı düzeyi, kilitleme için önemlidir ve daha az bir ölçüde güncelleştirmeler için de önemlidir. SQL Server hem XML hem de XML olmayan veriler için aynı kilitleme mekanizmasını kullanır. Bu nedenle, satır düzeyi kilitleme satırdaki tüm XML örneklerinin kilitlenmesine neden olur. Ayrıntı düzeyi büyük olduğunda, büyük XML örneklerini güncelleştirmeler için kilitlemek çok kullanıcılı bir senaryoda aktarım hızının düşmesine neden olur. Öte yandan, ciddi ayrıştırma nesne kapsülünün ortadan kalkmasına neden olur ve yeniden birleştirme maliyetlerini artırır.

İyi bir tasarım için veri modelleme gereksinimleri ile kilitleme ve güncelleştirme özellikleri arasındaki denge önemlidir. Ancak SQL Server'da, depolanan gerçek XML örneklerinin boyutu o kadar kritik değildir.

Örneğin, bir XML örneğine yönelik güncelleştirmeler, kısmi ikili büyük nesne (BLOB) için yeni destek ve mevcut depolanmış XML örneğinin güncelleştirilmiş sürümüyle karşılaştırıldığı kısmi dizin güncelleştirmeleri kullanılarak gerçekleştirilir. Kısmi ikili büyük nesne (BLOB) güncelleştirmesi, iki XML örneği arasında fark karşılaştırması gerçekleştirir ve yalnızca farkları güncelleştirir. Kısmi dizin güncelleştirmeleri yalnızca XML dizininde değiştirilmesi gereken satırları değiştirir.

Xml veri türünün sınırlamaları

XML veri türü için geçerli olan aşağıdaki genel sınırlamalara dikkat edin:

  • Xml veri türü örneklerinin depolanmış gösterimi 2 GB'ı aşamaz.

  • sql_variant örneğinin alt türü olarak kullanılamaz.

  • text veya ntext'e dönüştürmeyi veya cast etmeyi desteklemez. Bunun yerine varchar(max) veya nvarchar(max) kullanın.

  • Karşılaştırılamaz veya sıralanamaz. Bu, xml veri türünün GROUP BY deyiminde kullanılamayacağı anlamına gelir.

  • ISNULL, COALESCE ve DATALENGTH dışında skaler, yerleşik işlevler için parametre olarak kullanılamaz.

  • Dizinde anahtar sütunu olarak kullanılamaz. Ancak kümelenmiş dizine veri olarak eklenebilir veya kümelenmemiş dizin oluşturulduğunda INCLUDE anahtar sözcüğü kullanılarak açıkça kümelenmemiş dizine eklenebilir.

  • XML öğeleri en fazla 128 düzey iç içe yerleştirilebilir.

Ayrıca bakınız