Korzystanie z zestawów kolumn
Dotyczy: SQL Server 2016 (13.x) i nowsze wersje
Azure SQL Database
Azure SQL Managed Instance
SQL Database w Microsoft Fabric
Tabele korzystające z kolumn rzadkich mogą wyznaczyć zestaw kolumn do zwrócenia wszystkich rzadkich kolumn w tabeli. Zestaw kolumn to nietypowa reprezentacja XML, która łączy wszystkie rozrzedzone kolumny tabeli w dane wyjściowe ze strukturą. Zestaw kolumn jest podobny do kolumny obliczeniowej w tym, że zestaw kolumn nie jest fizycznie przechowywany w tabeli. Zestaw kolumn różni się od kolumny obliczeniowej w tym, że zestaw kolumn jest bezpośrednio aktualizowalny.
Należy rozważyć użycie zestawów kolumn, gdy liczba kolumn w tabeli jest duża, a działanie na nich osobno jest kłopotliwe. Aplikacje mogą zobaczyć pewną poprawę wydajności podczas wybierania i wstawiania danych przy użyciu zestawów kolumn w tabelach, które mają wiele kolumn. Jednak wydajność zestawów kolumn można zmniejszyć, gdy wiele indeksów jest zdefiniowanych w kolumnach w tabeli. Wynika to z tego, że ilość pamięci wymaganej do wykonania planu wykonania wzrasta.
Aby zdefiniować zestaw kolumn, użyj słów kluczowych *<column_set_name>* FOR ALL_SPARSE_COLUMNS
w instrukcjach CREATE TABLE CREATE TABLE lub ALTER TABLE instrukcji.
Wskazówki dotyczące używania zestawów kolumn
W przypadku korzystania z zestawów kolumn należy wziąć pod uwagę następujące wskazówki:
Kolumny rzadkie i zestaw kolumn można dodać w ramach tej samej instrukcji.
Nie można dodać zestawu kolumn do tabeli, jeśli ta tabela zawiera już rozrzedzona kolumny.
Nie można zmienić ani zmienić nazwy kolumny w zestawie kolumn. Aby zmienić zestaw kolumn, należy usunąć i ponownie utworzyć rozrzedzone kolumny i zestaw kolumn. Kolumny ze słowem kluczowym SPARSE można dodawać i odrzucać z tabeli.
Zestaw kolumn można dodać do tabeli, która nie zawiera żadnych rozrzedzonych kolumn. Jeśli rzadkie kolumny zostaną dodane później do tabeli, zostaną one wyświetlone w zestawie kolumn.
Tylko jeden zestaw kolumn jest dozwolony dla każdej tabeli.
Zestaw kolumn jest opcjonalny i nie jest wymagany, aby używać rozrzedzonych kolumn.
Nie można zdefiniować ograniczeń ani wartości domyślnych w zestawie kolumn.
Obliczone kolumny nie mogą zawierać kolumn zestawu kolumn.
Zapytania rozproszone nie są obsługiwane w tabelach zawierających zestawy kolumn.
Replikacja nie obsługuje zestawów kolumn.
Przechwytywanie zmian danych nie obsługuje zestawów kolumn.
Zestaw kolumn nie może być częścią żadnego rodzaju indeksu. Obejmuje to indeksy XML, indeksy pełnotekstowe i indeksowane widoki. Nie można dodać zestawu kolumn jako dołączonej kolumny w żadnym indeksie.
Nie można użyć zestawu kolumn w wyrażeniu filtru filtrowanego indeksu ani przefiltrowanych statystyk.
Gdy widok zawiera zestaw kolumn, zestaw kolumn jest wyświetlany w widoku jako kolumna XML.
Nie można uwzględnić zestawu kolumn w definicji indeksowanego widoku.
Widoki partycjonowane, które zawierają tabele zawierające zestawy kolumn, można aktualizować, gdy widok partycjonowany określa rozrzedzone kolumny według nazwy. Widok partycjonowany nie jest aktualizowalny, gdy odwołuje się do zestawu kolumn.
Powiadomienia dotyczące zapytań odwołujących się do zestawów kolumn nie są dozwolone.
Dane XML mają limit rozmiaru 2 GB. Jeśli połączone dane wszystkich kolumn rozrzednych innych niż NULL w wierszu przekraczają ten limit, zapytanie lub operacja DML spowoduje wystąpienie błędu.
Aby uzyskać informacje o danych zwracanych przez funkcję
COLUMNS_UPDATED
, zobacz Use Sparse Columns.
Wskazówki dotyczące wybierania danych z zestawu kolumn
Rozważ następujące wskazówki dotyczące wybierania danych z zestawu kolumn:
Koncepcyjnie zestaw kolumn jest typem aktualizowalnej, obliczonej kolumny XML, która agreguje zestaw podstawowych kolumn relacyjnych w pojedynczą reprezentację XML. Zestaw kolumn obsługuje tylko właściwość ALL_SPARSE_COLUMNS. Ta właściwość służy do agregowania wszystkich wartości innych niż NULL ze wszystkich rozrzedowanych kolumn dla określonego wiersza.
W edytorze tabel programu SQL Server Management Studio zestawy kolumn są wyświetlane jako edytowalne pole XML. Zdefiniuj zestawy kolumn w formacie:
<column_name_1>value1</column_name_1><column_name_2>value2</column_name_2>...
Przykłady wartości zestawu kolumn są następujące:
<sparseProp1>10</sparseProp1><sparseProp3>20</sparseProp3>
<DocTitle>Bicycle Parts List</DocTitle><Region>West</Region>
Kolumny rozrzedzone, które zawierają wartości null, są pomijane z reprezentacji XML dla zestawu kolumn.
Ostrzeżenie
Dodanie zestawu kolumn zmienia zachowanie zapytań SELECT *
. Zapytanie ustawi kolumnę jako kolumnę XML i nie zwróci pojedynczych kolumn rozrzedzonych. Projektanci schematów i deweloperzy oprogramowania muszą uważać, aby nie przerywać istniejących aplikacji. Poszczególne rozrzedzone kolumny mogą być nadal odpytywane według nazwy w instrukcji SELECT.
Wstawianie lub modyfikowanie danych w zestawie kolumn
Manipulowanie danymi w rzadkiej kolumnie może odbywać się przy użyciu nazwy poszczególnych kolumn lub odwołując się do nazwy zestawu kolumn i określając wartości zestawu kolumn przy użyciu formatu XML zestawu kolumn. Kolumny rzadkie mogą występować w dowolnej kolejności w kolumnie XML.
Gdy wartości kolumn o rozrzedzonych danych są wstawiane lub aktualizowane przy użyciu zestawu kolumn XML, wartości wstawione do bazowych kolumn o rozrzedzonych danych są niejawnie konwertowane z typu danych xml. W przypadku większości typów danych liczbowych, w tym bigint, int, smallint, tinyint, bit, floati real, pusta wartość w XML dla kolumny jest konwertowana na pusty ciąg. Spowoduje to wstawienie zera do kolumny, jak pokazano w poniższym przykładzie. Jednak podstawienie wartości 0 nie ma zastosowania do liczbowych i typów danych dziesiętnych, te wartości muszą zostać określone lub spowodują błąd konwersji.
CREATE TABLE t (i int SPARSE, cs xml column_set FOR ALL_SPARSE_COLUMNS);
GO
INSERT t(cs) VALUES ('<i/>');
GO
SELECT i FROM t;
GO
W tym przykładzie nie określono żadnej wartości dla kolumny i
, ale wartość 0
została wstawiona.
Używanie typu danych sql_variant
Typ daty sql_variant może przechowywać wiele różnych typów danych, takich jak int, chari data . Kolumna zbioru danych wyjściowych zawiera informacje o typie danych, takie jak skala, precyzja i ustawienia regionalne, które są skojarzone z wartością sql_variant jako atrybuty w generowanej kolumnie XML. Jeśli spróbujesz podać te atrybuty w niestandardowej instrukcji XML jako dane wejściowe operacji wstawiania lub aktualizacji w zestawie kolumn, niektóre z tych atrybutów są wymagane, a niektóre z nich mają przypisaną wartość domyślną. W poniższej tabeli wymieniono typy danych i wartości domyślne generowane przez serwer, gdy nie podano wartości.
Typ danych | localeID* | sqlOpcjePorównywania | wersja sortowania SQL | SqlSortId | Maksymalna długość | Precyzja | Skala |
---|---|---|---|---|---|---|---|
char, varchar, binarne | -1 | "Wartość domyślna" | 0 | 0 | 8000 | Nie dotyczy** | Nie dotyczy |
nvarchar | -1 | "Wartość domyślna" | 0 | 0 | 4000 | Nie dotyczy | Nie dotyczy |
dziesiętny, zmiennoprzecinkowy, rzeczywisty | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | 18 | 0 |
integer, bigint, tinyint, smallint | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy |
data/godzina2 | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | 7 |
przesunięcie daty/godziny | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | 7 |
data/godzina, data, smalldatetime | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy |
pieniądze, małe pieniądze | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy |
czasu | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | Nie dotyczy | 7 |
* localeID -1 oznacza domyślne ustawienia regionalne. Angielskie ustawienia regionalne to 1033.
** Nie dotyczy = żadne wartości nie są danymi wyjściowymi tych atrybutów podczas operacji wybierania w zestawie kolumn. Generuje błąd, gdy wartość jest określona dla tego atrybutu przez obiekt wywołujący w reprezentacji XML podanej dla kolumny ustawionej w operacji wstawiania lub aktualizacji.
Bezpieczeństwo
Model zabezpieczeń zestawu kolumn działa podobnie do modelu zabezpieczeń, który istnieje między tabelami i kolumnami. Zestawy kolumn można wizualizować jako mini-tabelę, a operacja wybierania przypomina operację SELECT *
dla tej mini-tabeli. Jednak relacja między zestawem kolumn a kolumnami rozrzedzonymi to relacja grupująca, a nie wyłącznie kontenerowa. Model zabezpieczeń sprawdza zabezpieczenia na zestawie kolumn i honoruje operacje DENY w podstawowych rzadkich kolumnach. Dodatkowe cechy modelu zabezpieczeń są następujące:
Uprawnienia zabezpieczeń można przyznać i odwołać z kolumny zestawu kolumn, podobnie jak każda inna kolumna w tabeli.
Polecenie GRANT lub REVOKE dla uprawnień SELECT, INSERT, UPDATE, DELETE i REFERENCES na zbiorze kolumn nie jest propagowane do podrzędnych kolumn członkowskich tego zestawu. Dotyczy tylko użycia kolumny zestawu kolumn. Uprawnienie DENY w zestawie kolumn jest propagowane do podstawowych rozrzedzonych kolumn tabeli.
Wykonanie instrukcji SELECT, INSERT, UPDATE i DELETE w kolumnie zestawu kolumn wymaga, aby użytkownik miał odpowiednie uprawnienia do kolumny zestawu kolumn, a także odpowiednie uprawnienie do wszystkich kolumn rozrzedzona w tabeli. Ponieważ zestaw kolumn reprezentuje wszystkie rzadkie kolumny w tabeli, musisz mieć uprawnienia do wszystkich rzadkich kolumn, a obejmuje to rzadkie kolumny, których być może nie zmieniasz.
Wykonanie instrukcji REVOKE na kolumnie rozrzedzonej lub zestawie kolumn powoduje przywrócenie domyślnych zabezpieczeń obiektu nadrzędnego.
Przykłady
W poniższych przykładach tabela dokumentów zawiera wspólny zestaw kolumn DocID
i Title
. Grupa Produkcyjna chce mieć kolumnę ProductionSpecification
i ProductionLocation
dla wszystkich dokumentów produkcyjnych. Grupa Marketing chce kolumnę MarketingSurveyGroup
dla dokumentów marketingowych.
A. Tworzenie tabeli z zestawem kolumn
Poniższy przykład tworzy tabelę, która używa rozrzedzonych kolumn i zawiera kolumnowy zestaw SpecialPurposeColumns
. Przykład wstawia dwa wiersze do tabeli, a następnie wybiera dane z tabeli.
Notatka
Ta tabela zawiera tylko pięć kolumn, aby ułatwić wyświetlanie i odczytywanie.
USE AdventureWorks2022;
GO
CREATE TABLE DocumentStoreWithColumnSet
(DocID int PRIMARY KEY,
Title varchar(200) NOT NULL,
ProductionSpecification varchar(20) SPARSE NULL,
ProductionLocation smallint SPARSE NULL,
MarketingSurveyGroup varchar(20) SPARSE NULL,
MarketingProgramID int SPARSE NULL,
SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS);
GO
B. Wstawianie danych do tabeli przy użyciu nazw rozrzedzonych kolumn
W poniższych przykładach wstawimy dwa wiersze do tabeli utworzonej w przykładzie A. Przykłady używają nazw rozproszonych kolumn i nie odwołują się do zestawu kolumn.
INSERT DocumentStoreWithColumnSet (DocID, Title, ProductionSpecification, ProductionLocation)
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27);
GO
INSERT DocumentStoreWithColumnSet (DocID, Title, MarketingSurveyGroup)
VALUES (2, 'Survey 2142', 'Men 25 - 35');
GO
C. Wstawianie danych do tabeli przy użyciu nazwy zestawu kolumn
Poniższy przykład wstawia trzeci wiersz do tabeli utworzonej w przykładzie A. Tym razem nazwy rozrzednych kolumn nie są używane. Zamiast tego jest używana nazwa zestawu kolumn, a wstawienie zawiera wartości dwóch z czterech rozrzedzonych kolumn w formacie XML.
INSERT DocumentStoreWithColumnSet (DocID, Title, SpecialPurposeColumns)
VALUES (3, 'Tire Spec 2', '<ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>');
GO
D. Obserwuj wyniki zestawu kolumn, gdy jest używana funkcja SELECT *
Poniższy przykład wybiera wszystkie kolumny z tabeli zawierającej zestaw kolumn. Zwraca kolumnę XML, która łączy wartości kolumn rozproszonych. Nie zwraca poszczególnych kolumn rozrzednych.
SELECT DocID, Title, SpecialPurposeColumns FROM DocumentStoreWithColumnSet ;
Oto zestaw wyników.
DocID Title SpecialPurposeColumns
1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>
2 Survey 2142 <MarketingSurveyGroup>Men 25 - 35</MarketingSurveyGroup>
3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>
E. Obserwuj wyniki wybierania kolumny ustawionej według nazwy
Ponieważ dział produkcji nie jest zainteresowany danymi marketingu, w tym przykładzie dodano klauzulę WHERE
w celu ograniczenia danych wyjściowych. W przykładzie użyto nazwy zestawu kolumn.
SELECT DocID, Title, SpecialPurposeColumns
FROM DocumentStoreWithColumnSet
WHERE ProductionSpecification IS NOT NULL ;
Oto zestaw wyników.
DocID Title SpecialPurposeColumns
1 Tire Spec 1 <ProductionSpecification>AXZZ217</ProductionSpecification><ProductionLocation>27</ProductionLocation>
3 Tire Spec 2 <ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>
F. Obserwowanie wyników wybierania rozrzednych kolumn według nazwy
Jeśli tabela zawiera zestaw kolumn, nadal można wykonywać zapytania względem tabeli przy użyciu poszczególnych nazw kolumn, jak pokazano w poniższym przykładzie.
SELECT DocID, Title, ProductionSpecification, ProductionLocation
FROM DocumentStoreWithColumnSet
WHERE ProductionSpecification IS NOT NULL ;
Oto zestaw wyników.
DocID Title ProductionSpecification ProductionLocation`
1 Tire Spec 1 AXZZ217 27`
3 Tire Spec 2 AXW9R411 38`
G. Aktualizowanie tabeli przy użyciu zestawu kolumn
W poniższym przykładzie trzeci rekord zostanie zaktualizowany o nowe wartości dla obu rozrzednych kolumn, które są używane przez ten wiersz.
UPDATE DocumentStoreWithColumnSet
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification><ProductionLocation>38</ProductionLocation>'
WHERE DocID = 3 ;
GO
Ważny
Instrukcja UPDATE, która używa zestawu kolumn, aktualizuje wszystkie rozrzedzone kolumny w tabeli. Kolumny rzadkich, do których się nie odwołuje, są aktualizowane do NULL
.
Poniższy przykład aktualizuje trzeci rekord, ale określa tylko wartość jednej z dwóch wypełnionych kolumn. Druga kolumna ProductionLocation
nie jest uwzględniona w instrukcji UPDATE
i jest aktualizowana do NULL
.
UPDATE DocumentStoreWithColumnSet
SET SpecialPurposeColumns = '<ProductionSpecification>ZZ285W</ProductionSpecification>'
WHERE DocID = 3 ;
GO