Oracle USING INDEX yan tümcesinin SQL Server eşdeğeri


9

Oracle'da USING INDEX yan tümcesinin SQL Server 2008 eşdeğeri var mı? Özellikle yapı için:

CREATE TABLE c(c1 INT, c2 INT);
CREATE INDEX ci ON c (c1, c2);
ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci;

Benzersiz Dizinlere İlişkin Sql Server Dokümantasyonunda şunları belirtmektedir (vurgu eklenmiştir):

Benzersiz dizinler aşağıdaki şekillerde uygulanır:

PRIMARY KEY veya UNIQUE kısıtlaması

Bir PRIMARY KEY kısıtlaması oluşturduğunuzda, tabloda kümelenmiş bir dizin zaten yoksa ve benzersiz bir kümelenmemiş dizin belirtmezseniz , sütun veya sütunlarda benzersiz bir kümelenmiş dizin otomatik olarak oluşturulur . Birincil anahtar sütunu NULL değerlere izin veremez.

Bu da, Birincil Anahtar için hangi dizinin kullanılması gerektiğini belirtmenin bir yolu olduğu anlamına gelir.


PK'yı tablo ile birlikte tanımlamanız yeterlidir. create table c (c1 int not null primary key, c2 int)
a_horse_with_no_name

İlgilendiğim "PK'nin adlandırılmış bir dizin kullanması" bölümü.
nik

Hayır, bunu yapmanın bir yolu yok. Birincil anahtar bir kısıtlama ve bir dizindir. Birincil anahtarı sağladığınız şeyde varsayılan olarak benzersiz bir kümelenmiş dizin olur. Burada, c1 ve c2 öğelerini where yan tümcesine dahil etmedikçe, diğer tanımlanmış dizini çoğaltır.
Aaron

Yanıtlar:


7

Oracle'da USING INDEX yan tümcesinin SQL Server 2008 eşdeğeri var mı?

Hayır. SQL Server'da birincil anahtar veya benzersiz bir kısıt oluşturduğunuzda, bu kısıtlamayı destekleyen benzersiz bir dizin, aynı anahtarlarla otomatik olarak oluşturulur.

Bu da, Birincil Anahtar için hangi dizinin kullanılması gerektiğini belirtmenin bir yolu olduğu anlamına gelir.

Hayır. Belgeler, siz belirtmezseniz, otomatik destek dizininin kümelenmiş veya kümelenmemiş olarak oluşturulup oluşturulmayacağını açıklamaya çalışır. Kafa karıştırıcı bir şekilde ifade edildi, katılıyorum.

Açıklığa kavuşturmak için, mevcut bir tabloya tercih belirtmeden birincil anahtar kısıtlaması eklediğinizde, tabloda önceden varolan bir kümelenmiş dizin yoksa destekleyici dizin kümelenir . Zaten kümelenmiş bir dizin varsa destekleyici dizin kümelenmemiş olarak oluşturulur

Özellikle: PRIMARY KEY CLUSTEREDveya kullanarak kümelenmiş veya kümelenmemiş bir birincil anahtar isteyebilirsiniz PRIMARY KEY NONCLUSTERED.

Adil olmak gerekirse, dokümantasyon şu konuda daha açıktır:

table_constraint (Transact-sql)


5

Ayrıca birincil anahtar olan kümelenmiş bir dizin oluşturmak için SQL Server sözdizimi şöyledir:

CREATE TABLE dbo.c
(
    c1 INT NOT NULL, 
    c2 INT NOT NULL,
    CONSTRAINT PK_c
    PRIMARY KEY CLUSTERED (c1, c2)
);

Yorumunuza göre: "PK'nin adlandırılmış bir dizin kullanması", yukarıdaki kod birincil anahtar dizininin "PK_c" olarak adlandırılmasına neden olur.

Birincil anahtar ile kümeleme anahtarının aynı sütunlar olması gerekmez. Bunları ayrı ayrı tanımlayabilirsiniz. Yukarıdaki örnekte, CLUSTEREDanahtar kelimeyi olarak değiştirin NONCLUSTEREDve CREATE INDEXsözdizimini kullanarak kümelenmiş bir dizin ekleyin :

CREATE TABLE dbo.c
(
    c1 INT,
    c2 INT,
    CONSTRAINT PK_c
    PRIMARY KEY NONCLUSTERED (c1, c2)
);

CREATE CLUSTERED INDEX CX_c ON dbo.c (c2);

SQL Server kümelenmiş dizin olan tablo, onlar bir-ve-aynıdır. Kümelenmiş bir dizin, tabloda depolanan satırların mantıksal sırasını tanımlar. İlk örneğimde, satırlar c1ve c2sütunlarının sırasıyla sıralanır . Kümelenme anahtarı da birincil anahtar, bir kombinasyon olarak tanımlanır yana c1ve c2tablo çapında farklı olmalıdır.

İkinci örnekte, birincil anahtar c1ve c2sütunlarından oluşur , ancak kümeleme anahtarı yalnızca c2sütundur. İfadede UNIQUEözniteliği belirtmediğim için CREATE INDEX, küme anahtarının ( c2) tablo boyunca benzersiz olması gerekmez. SQL Server tarafından otomatik olarak bir "benzersizleştirici" c2oluşturulur ve kümeleme anahtarını oluşturmak için sütundaki değerlere eklenir . Bu kümeleme anahtarı, artık benzersiz olduğundan, tabloda oluşturulan diğer dizinlerde satır kimliği olarak kullanılacaktır.

Kümeleme anahtarının depodaki satırların düzenini denetlediğini kanıtlamak için, belgesiz işlevi kullanabilirsiniz fn_PhysLocCracker(%%PHYSLOC%%). Aşağıdaki kod, satırları c2küme anahtarı olarak tanımladığım sütun sırasına göre diskte düzenlenmiş olarak gösterir :

USE tempdb;

CREATE TABLE dbo.PKTest
(
    c1 INT NOT NULL
    , c2 INT NOT NULL
    , c3 VARCHAR(256) NOT NULL
);

ALTER TABLE PKTest 
ADD CONSTRAINT PK_PKTest 
PRIMARY KEY NONCLUSTERED (c1, c2);

CREATE CLUSTERED INDEX CX_PKTest 
ON dbo.PKTest(c2);

TRUNCATE TABLE dbo.PKTest;

INSERT INTO dbo.PKTest (c1, c2, c3)
SELECT TOP(25) o1.object_id / o2.object_id, o2.object_id, o1.name + '.' + o2.name
FROM sys.objects o1
    , sys.objects o2
WHERE o1.object_id >0 
    and o2.object_id > 0;

SELECT plc.file_id
    , plc.page_id
    , plc.slot_id
    , pk.*
FROM dbo.PKTest pk
CROSS APPLY fn_PhysLocCracker(%%PHYSLOC%%) plc;

Benim tempdb sonuçları :

resim açıklamasını buraya girin

Yukarıdaki görüntüde, ilk üç sütun fn_PhysLocCracker, diskteki satırların fiziksel sırasını gösteren işlevden çıkarılır . Kümeleme anahtarı olan değerle slot_idkilit adımının arttığını görebilirsiniz c2. Birincil anahtar dizini, SQL Server'ı birincil anahtarı taramaktan sonuç döndürmeye zorlayarak satırları farklı bir sırada depolar:

SELECT pkt.c1
    , pkt.c2
FROM dbo.PKTest pkt WITH (INDEX = PK_PKTest, FORCESCAN);

ORDER BYBirincil anahtar dizinindeki öğelerin sırasını göstermeye çalıştığım için, yukarıdaki ifadede bir cümle kullanmadım .

Yukarıdaki sorgudan çıktı:

resim açıklamasını buraya girin

İşleve bakarak fn_PhysLocCracker, birincil anahtar dizininin fiziksel sırasını görebiliriz.

SELECT plc.file_id
    , plc.page_id
    , plc.slot_id
    , pkt.c1
    , pkt.c2
FROM dbo.PKTest pkt WITH (INDEX = PK_PKTest, FORCESCAN)
CROSS APPLY fn_PhysLocCracker(%%PHYSLOC%%) plc;

Yalnızca dizinin kendisinden okuduğumuzdan, yani sorguda dizinin dışındaki sütunlara başvurulmadığından, %%PHYSLOC%%değerler dizinin kendisindeki sayfaları temsil eder.

Sonuçlar:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.