Co oznacza ON [PRIMARY]?


237

Tworzę skrypt instalacyjny SQL i używam skryptu innej osoby jako przykładu. Oto przykład skryptu:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
    [CategoryName] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [ParentID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Czy ktoś wie, co robi polecenie ON [PRIMARY]?

Odpowiedzi:


248

Podczas tworzenia bazy danych w Microsoft SQL Server możesz mieć wiele grup plików, w których pamięć jest tworzona w wielu miejscach, katalogach lub dyskach. Każda grupa plików może mieć nazwę. Grupa plików PODSTAWOWA jest grupą domyślną, która jest zawsze tworzona, więc podany SQL tworzy tabelę NA grupie plików PODSTAWOWYCH.

Zobacz pełną składnię MSDN .


153
Oznacza to również, że zwykle jest bezużyteczny i można go bezpiecznie usunąć ze skryptu.
MGOwen

Tak, w ten sam sposób możesz po prostu pominąć inicjalizację zmiennej na 0 i false, ponieważ jest to tylko domyślna, prawda?
Mark Sowul,

12
@MarkSowul O ile nie masz dobrego powodu, aby użyć tego do optymalizacji wydajności, tak, możesz to pominąć i pozwolić, aby nastąpiło ustawienie domyślne. (Stąd „zwykle” MGOwen włączone.) Inicjowanie zmiennych 0lub falseo zapewnienie, że kod działa w stanie wiadomo, co jest logiczne i poprawność problemem, a nie optymalizacji problemem.
jpmc26

3
Widzę ON PRIMARYskładnię dwa razy w skrypcie - jeden dla tabeli, a drugi dla ograniczenia tabeli. Co to oznacza w przypadku ograniczenia tabeli pod względem pamięci? Brzmi dla mnie nieistotny lub zbędny. Pod względem składniowym powinno być wystarczające, aby wspomnieć o tym raz na poziomie tabeli, czy też naprawdę można przechowywać tabelę w grupie plików PODSTAWOWYCH i dane o ograniczeniach tabeli w grupie plików PODSTAWOWYCH?
RBT

1
Oto rzeczywiste łącze MSDN . Ten w odpowiedzi już nie działa i nie mogę edytować posta!
shekhar 11.04.17

38

Odnosi się do tego, na której grupie plików znajduje się tworzony obiekt. Tak więc podstawowa grupa plików może znajdować się na dysku D: \ serwera. możesz następnie utworzyć inną grupę plików o nazwie Indeksy. Ta grupa plików może znajdować się na dysku E: \ twojego serwera.


Czy będzie to miało negatywny wpływ na wydajność, jeśli przechowuję tabelę w grupie plików PODSTAWOWYCH i ograniczenie tabeli lub strukturę danych indeksu w innej grupie plików?
RBT

@RBT Istnieje wiele zmiennych, które mogą mieć na to wpływ, i zwykle wiele odpowiedzi zaczyna się od „To zależy, ale ...” patrz dba.stackexchange.com/questions/2626/... i powiązane pytania
codingbadger

16

ON [PODSTAWOWY] utworzy struktury w grupie plików „Podstawowy”. W takim przypadku indeks klucza podstawowego i tabela zostaną umieszczone w grupie plików „Podstawowy” w bazie danych.


7

Aby dodać bardzo ważną notatkę o tym, co Mark S. wspomniał w swoim poście. W konkretnym skrypcie SQL wspomnianym w pytaniu NIGDY nie można wymieniać dwóch różnych grup plików do przechowywania wierszy danych i struktury danych indeksu.

Powodem tego jest fakt, że indeks tworzony w tym przypadku jest klastrowanym indeksem w kolumnie klucza podstawowego. Dane indeksu klastrowego i wiersze danych tabeli NIGDY nie mogą znajdować się w różnych grupach plików .

Więc jeśli masz dwie grupy plików w bazie danych, np. PODSTAWOWY i WTÓRNY, to niżej wymieniony skrypt będzie przechowywać dane wiersza i dane indeksu klastrowego zarówno w samej grupie plików PODSTAWOWYCH, chociaż wspomniałem o innej grupie plików ( [SECONDARY]) dla danych tabeli . Co ciekawsze, skrypt również działa poprawnie (gdy spodziewałem się, że spowoduje błąd, ponieważ podałem dwie różne grupy plików: P). SQL Server rozwiązuje ten problem za cicho i elegancko.

CREATE TABLE [dbo].[be_Categories](
    [CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
    [CategoryName] [nvarchar](50) NULL,
    [Description] [nvarchar](200) NULL,
    [ParentID] [uniqueidentifier] NULL,
 CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [SECONDARY]
GO

UWAGA: Twój indeks może znajdować się w innej grupie plików TYLKO, jeśli tworzony indeks nie ma charakteru klastrowego .

Poniższy skrypt, który tworzy indeks nieklastrowany, zostanie utworzony w [SECONDARY]grupie plików, gdy dane tabeli już znajdują się w [PRIMARY]grupie plików:

CREATE NONCLUSTERED INDEX [IX_Categories] ON [dbo].[be_Categories]
(
    [CategoryName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Secondary]
GO

Możesz uzyskać więcej informacji o tym, jak przechowywanie indeksów nieklastrowanych w innej grupie plików może pomóc w lepszej wydajności zapytań. Oto jeden taki link.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.