Wprowadzenie
Musiałeś już słyszeć termin „sortowanie” w SQL Server. Sortowanie to konfiguracja, która określa sposób sortowania danych znakowych. Jest to ważne ustawienie, które ma ogromny wpływ na zachowanie silnika bazy danych SQL Server podczas obsługi danych znakowych. W tym artykule postaramy się ogólnie omówić sortowania i pokazać kilka przykładów radzenia sobie z sortowaniami.
Gdzie znajdę zestawienia?
Sortowanie SQL można znaleźć na poziomie serwera, bazy danych i kolumny. Inną ważną rzeczą, o której należy wiedzieć, jest to, że ustawienie sortowania nie musi być takie samo na poziomie serwera, bazy danych i kolumny. Możesz także zaktualizować zapytania, aby używały określonych sortowań. W tym momencie zdasz sobie sprawę, jak ważne jest skonfigurowanie poprawnego sortowania w Twoim środowisku, ponieważ istnieje duże prawdopodobieństwo nieoczekiwanych problemów, jeśli sortowanie nie jest spójne.
Jakie są dostępne różne rodzaje sortowania?
Możesz uzyskać pełną listę dostępnych sortowań, wysyłając zapytanie do funkcji systemowej sys.fn_helpcollations()
select * from sys.fn_helpcollations()
Spowoduje to zwrócenie następujących danych wyjściowych.
Jeśli szukasz konkretnych zestawień według języka, możesz dalej filtrować nazwę. Na przykład, jeśli szukasz sortowania obsługiwanego przez język maoryski, możesz użyć następującego zapytania.
select * from sys.fn_helpcollations() where name like '%Maori%'
Spowoduje to zwrócenie następujących danych wyjściowych.
W ten sposób możesz sprawdzić obsługiwane sortowania dla wybranego sortowania. W przypadku samego zapytania funkcji systemowej fn_helpcollations() zwrócono łącznie 5508 wierszy, co oznacza, że jest tak wiele obsługiwanych sortowań. Pamiętaj, że dotyczy to większości języków na całym świecie.
Jakie są różne opcje widoczne w nazwie sortowania?
Na przykład w tym zestawieniu:Maori_100_CS_AI_KS_WS_SC_UTF8, możesz zobaczyć różne opcje w nazwie zestawienia.
CS – wielkość liter ma znaczenie
AI – niewrażliwy na akcent
KS – kana wrażliwy na typ
WS – wrażliwy na szerokość
SC – znaki uzupełniające
UTF8 – Standard kodowania
W zależności od typu wybranej opcji sortowania, silnik bazy danych SQL Server będzie działał inaczej w przypadku danych znakowych do operacji sortowania i wyszukiwania. Na przykład, jeśli użyjesz opcji rozróżniania wielkości liter w sortowaniu SQL, silnik bazy danych będzie zachowywał się inaczej dla operacji zapytania szukającej „Adam” lub „adam”. Zakładając, że masz tabelę o nazwie „sample” i kolumnę z imieniem z użytkownikiem „adam”. Poniższe zapytanie nie zwróci żadnych wyników, jeśli nie ma wiersza z imieniem „Adam”. Dzieje się tak z powodu opcji „CS-Case sensitive” w zestawieniu.
select * from sample where firstname like '%Adam%'
Za pomocą tego prostego przykładu możesz zrozumieć znaczenie wyboru właściwej opcji sortowania SQL. Przed wybraniem sortowania upewnij się, że rozumiesz wymagania aplikacji.
Znajdowanie sortowania na instancji SQL Server
Sortowanie serwerów można uzyskać w SQL Server Management Studio (SSMS), klikając prawym przyciskiem myszy wystąpienie SQL, a następnie klikając opcję „Właściwości” i zaznaczając zakładkę „Ogólne”. To sortowanie jest wybierane domyślnie podczas instalacji SQL Server.
Alternatywnie możesz użyć opcji serverproperty, aby znaleźć wartość sortowania.
select SERVERPROPERTY('collation'),
Znajdowanie sortowania bazy danych SQL
W SSMS kliknij prawym przyciskiem myszy bazę danych SQL i przejdź do „Właściwości”. Możesz sprawdzić szczegóły sortowania w zakładce „Ogólne”, jak pokazano poniżej.
Alternatywnie możesz użyć funkcji databasepropertyex, aby uzyskać szczegóły sortowania bazy danych.
select DATABASEPROPERTYEX('Your DB Name','collation')
Znajdowanie sortowania kolumny w tabeli
W SSMS przejdź do tabeli, następnie do kolumn, a na koniec kliknij prawym przyciskiem myszy poszczególne kolumny, aby wyświetlić „Właściwości”. Jeśli kolumna ma typ danych znakowych, zobaczysz szczegóły sortowania.
Jednak w tym samym czasie, jeśli sprawdzisz wartość dla typu danych niebędących znakami, wartość sortowania będzie równa null. Poniżej znajduje się zrzut ekranu kolumny, która ma typ danych int.
Alternatywnie możesz użyć przykładowego zapytania poniżej, aby wyświetlić wartości sortowania dla kolumn.
select sc.name, sc.collation_name from sys.columns sc inner join sys.tables t on sc.object_id=t.object_id where t.name='t1' – enter your table name
Poniżej znajduje się wynik zapytania.
Próbowanie różnych sortowań w zapytaniach SQL
W tej sekcji zobaczymy, jak na kolejność sortowania wpływa użycie różnych sortowań w zapytaniach. Przykładowa tabela jest tworzona z 2 kolumnami, jak pokazano poniżej.
Kolumna fname ma domyślne sortowanie bazy danych, do której należy. W tym przypadku sortowanie to SQL_Latin1_General_CP1_CI_AS.
Aby wstawić kilka rekordów do tabeli, użyj poniższego zapytania. Przypisz własne wartości do parametrów.
insert into emp values (1,'mohammed') insert into emp values (2,'moinudheen') insert into emp values (3,'Mohammed') insert into emp values (4,'Moinudheen') insert into emp values (5,'MOHAMMED') insert into emp values (6,'MOINUDHEEN')
Teraz przeprowadź zapytanie do tabeli emp i posortuj ją według kolumny fname przy użyciu różnych sortowań. Do sortowania użyjemy domyślnego sortowania kolumny, a także innego sortowania uwzględniającego wielkość liter — SQL_Latin1_General_CP1_CS_AS.
select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default
Dane wyjściowe dla tych zapytań podano poniżej. Zwróć uwagę na różnicę w użytym sortowaniu. Używamy rozróżniania wielkości liter zamiast rozróżniania wielkości liter.
Możesz również sprawdzić plany zapytań dla obu tych zapytań, aby dostrzec różnicę. W pierwszym planie zapytania, w którym używamy innego sortowania niż to w kolumnie, możesz zauważyć dodatkowy operator „Compute Scalar”.
Po najechaniu myszą na operator „Oblicz skalarny”, zobaczysz dodatkowe szczegóły, jak pokazano poniżej. Wynika to z niejawnej konwersji, która ma miejsce, ponieważ używamy innego sortowania niż domyślne używane w kolumnie.
W tym małym przykładzie można zobaczyć, jaki wpływ na wydajność zapytań ma jawne użycie sortowania w zapytaniach. W naszej demonstracyjnej bazie danych użyliśmy prostej tabeli, ale wyobraźmy sobie scenariusz w czasie rzeczywistym, w którym niewielkie zmiany w wydajności zapytań mogą spowodować nieoczekiwane wyniki.
Sprawdzanie, czy można zmienić sortowanie na poziomie instancji
W tej sekcji przyjrzymy się różnym scenariuszom, w których być może będziemy musieli zmienić domyślne sortowanie. Możesz napotkać sytuacje, w których serwery lub bazy danych zostaną Ci przekazane i mogą nie spełniać Twoich standardowych zasad, więc może być konieczna zmiana sortowania. Domyślne sortowanie programu SQL Server to SQL_Latin1_General_CP1_CI_AS. Zmiana sortowania na poziomie instancji SQL nie jest prosta. Wymaga wypisania wszystkich obiektów w bazach danych użytkowników, wyeksportowania danych, usunięcia baz danych użytkowników, przebudowania głównej bazy danych z nowym sortowaniem, utworzenia baz danych użytkowników, a następnie zaimportowania wszystkich danych. Tak więc, jeśli instalujesz nowe instancje SQL, po prostu upewnij się, że sortowanie jest prawidłowe za pierwszym razem, w przeciwnym razie może być konieczne wykonanie wielu niechcianych prac później. Szczegółowe wyjaśnienie etapów zmiany sortowania na poziomie instancji wykracza poza zakres tego artykułu ze względu na szczegółowe kroki wymagane dla każdego z etapów.
Zmiana sortowania na poziomie bazy danych
Na szczęście zmiana sortowania na poziomie bazy danych nie jest tak trudna, jak zmiana sortowania instancji. Możemy aktualizować zestawienie za pomocą SSMS i T-SQL. W SSMS wystarczy kliknąć prawym przyciskiem myszy bazę danych, przejść do „Właściwości” i kliknąć zakładkę „Opcje” po lewej stronie. Tam możesz wyświetlić opcję zmiany sortowania w menu rozwijanym.
Po zakończeniu kliknij "OK". Właśnie zmieniłem sortowanie bazy danych na SQL_Latin1_General_CP1_CI_AS. Tylko upewnij się, że wykonujesz tę operację, gdy baza danych nie jest używana, ponieważ w przeciwnym razie operacja zakończy się niepowodzeniem, jak pokazano poniżej.
Użyj poniższego zapytania, aby zmienić sortowanie bazy danych za pomocą T-SQL.
USE master; GO ALTER DATABASE mo COLLATE SQL_Latin1_General_CP1_CS_AS; GO
Można zauważyć, że zmiana sortowania na poziomie bazy danych nie wpłynie na sortowanie istniejących kolumn w tabelach. Możesz użyć wcześniejszych przykładów, aby sprawdzić wpływ sortowania na porządek sortowania poniższych zapytań.
select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default
Sortowanie kolumn fname pozostanie oryginalne i pozostanie niezmienione nawet po zmianie sortowania na poziomie bazy danych.
Jednak nowe sortowanie na poziomie bazy danych zostanie zastosowane do wszystkich nowych kolumn w nowych tabelach, które utworzysz. Dlatego zawsze dokładnie przetestuj zmiany sortowania bazy danych, ponieważ ma to znaczny wpływ na wyniki lub zachowanie zapytań.
Zmiana sortowania na poziomie kolumny
W poprzedniej sekcji zauważyłeś, że nawet po zmianie sortowania na poziomie bazy danych, sortowanie istniejących kolumn w tabelach pozostaje niezmienione. W tej sekcji zobaczymy, jak możemy zmienić sortowanie istniejących kolumn w tabelach, aby odpowiadały sortowaniu bazy danych. W poprzedniej sekcji zmieniono sortowanie bazy danych na SQL_Latin1_General_CP1_CS_AS. Następnie chcesz zidentyfikować wszystkie kolumny w tabelach użytkowników, które nie pasują do tego sortowania bazy danych. Możesz użyć tego skryptu do identyfikacji tych kolumn.
select so.name TableName,sc.name ColumnName, sc.collation_name CollationName from sys.objects so inner join sys.columns sc on so.object_id=sc.object_id where sc.collation_name!='SQL_Latin1_General_CP1_CS_AS' and so.[type] ='U'
Przykładowe dane wyjściowe z mojej bazy danych demonstracyjnych są pokazane poniżej.
Załóżmy, że chcesz zmienić sortowanie istniejącej kolumny fname na „SQL_Latin1_General_CP1_CS_AS”, wtedy możesz użyć poniższego skryptu alter.
use mo go ALTER TABLE dbo.emp ALTER COLUMN fname nvarchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS NULL; GO
Jeśli użyjesz wcześniejszych przykładów, w których sprawdzałeś wydajność zapytań przy użyciu różnych sortowań, zauważysz, że operator „compute scalar” nie jest używany, gdy używamy tego samego sortowania, co w bazie danych. Zobacz zrzut ekranu poniżej. W poprzednim przykładzie można było zauważyć, że operator „Oblicz skalarny” został użyty w pierwszym planie wykonania. Ponieważ zmieniliśmy sortowanie kolumn, aby dopasować je do sortowania bazy danych, nie ma potrzeby niejawnej konwersji. W drugim zapytaniu zobaczysz operator „Oblicz skalarny”, ponieważ używa on jawnie innego sortowania.
select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS – - this is default select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS
Czy możemy zmienić sortowanie systemowych baz danych?
Zmiana sortowania baz danych systemu nie jest możliwa. Jeśli spróbujesz zmienić sortowanie baz danych systemu – master, model, msdb lub tempdb, otrzymasz ten komunikat o błędzie.
Aby zmienić sortowanie baz danych systemu, należy wykonać opisane wcześniej kroki dotyczące zmiany sortowania na poziomie instancji SQL Server. Aby uniknąć takich problemów, ważne jest, aby sortowanie było poprawne przy pierwszej instalacji SQL Server.
Znany problem dotyczący konfliktu sortowania
Innym częstym problemem, który możesz znaleźć, jest błąd związany z konfliktem sortowania, zwłaszcza podczas korzystania z obiektów tymczasowych. Obiekty tymczasowe są przechowywane w tempdb. Tempdb będąca systemową bazą danych przyjmie sortowanie instancji SQL. Podczas tworzenia baz danych użytkowników, które mają sortowanie inne niż instancja SQL, napotkasz problemy podczas korzystania z obiektów tymczasowych. Możesz również napotkać problemy podczas porównywania kolumn w tabelach, które mają różne sortowanie. Do tej pory wiesz już, że tabela może mieć kolumny z różnymi sortowaniami, ponieważ nie możemy zmienić sortowania na poziomie tabeli. Typowy komunikat o błędzie, który zauważysz, to coś w rodzaju „Nie można rozwiązać konfliktu sortowania między „Collation1” i „Collation2” w operacji równej. Collation1 i Collation2 może być dowolnym sortowaniem używanym w zapytaniu. Korzystając z prostego przykładu, możemy stworzyć demonstrację tego konfliktu sortowania. Jeśli uzupełniłeś poprzednie przykłady w tym artykule, będziesz już miał tabelę o nazwie „emp”. Po prostu utwórz tymczasową tabelę w demonstracyjnej bazie danych i wstawiaj rekordy za pomocą dostarczonego przykładowego skryptu.
create table #emptemp (id int, fname nvarchar(20)) insert into #emptemp select * from emp
Po prostu uruchom połączenie przy użyciu obu tabel, a otrzymasz ten błąd konfliktu sortowania, jak pokazano poniżej.
select e.id, et.fname from emp e inner join #emptemp et on e.fname=et.fname
Zauważysz, że użyte sortowanie bazy danych użytkownika to „SQL_Latin1_General_CP1_CS_AS” i nie jest zgodne z sortowaniem serwera. Aby naprawić ten typ błędu, możesz zmienić kolumny używane w obiektach tymczasowych tak, aby używały domyślnego sortowania bazy danych użytkownika. Możesz użyć opcji „database_default” lub jawnie podać nazwę sortowania bazy danych użytkownika. W tym przykładzie używamy sortowania „SQL_Latin1_General_CP1_CS_AS”. Wypróbuj jedną z tych opcji
Opcja 1: Użyj opcji database_default
alter table #emptemp alter column fname nvarchar(20) collate database_default
Po zakończeniu uruchom ponownie instrukcję select, a błąd zostanie naprawiony.
Opcja 2: Używaj jawnego sortowania bazy danych użytkowników
alter table #emptemp alter column fname nvarchar(20) collate SQL_Latin1_General_CP1_CS_AS
Po zakończeniu uruchom ponownie instrukcję select, a błąd zostanie naprawiony.
Wniosek
W tym artykule zapoznałeś się z:
• pojęciem sortowania
• różnymi dostępnymi opcjami sortowania
• znajdowaniem szczegółów sortowania dla dowolnej instancji SQL, bazy danych i kolumny
• A PRZYKŁAD PRACY wypróbowania opcji sortowania w zapytaniach SQL
• zmiana sortowania na poziomie instancji, bazy danych i na poziomie kolumn
• JAK zmienić sortowanie systemowych baz danych
• konflikt sortowania i jak naprawić
Teraz już wiesz, jak ważne jest sortowanie i jak ważne jest konfigurowanie poprawnego sortowania w instancji SQL, a także w obiektach bazy danych. Zawsze testuj różne scenariusze w swoim środowisku testowym przed zastosowaniem którejkolwiek z powyższych opcji w swoich systemach produkcyjnych.