2014-10-10 22 views
5

Tablonun bir PK'si standart bir otomatik artışlı int (Id) ise ve alınan ve güncellenen kayıtlar hemen hemen her zaman, her zaman bir fark yaratacaktır. - PK kümelenmiş endeksi artan veya azalan olarak sıralanır mı?Kümelenmiş dizin sıralama sırasının performansı üzerinde etkisi var

Böyle bir PK oluşturulduğunda, varsayılan olarak SSMS, dizinin sıralama düzenini artan olarak ayarlar ve en çok erişilen satırlar her zaman geçerli olan maksimum kimliğe yakın olanlardır, çünkü sıralamaların azalan olarak değiştirilip değiştirilmeyeceğini merak ediyorum. Kayıtlar yukarıdan aşağı yerine yukarıdan aşağıya doğru sıralanacağı ve en üstteki kayıtlara en sık erişildiği için alma işlemini hızlandırır.

+0

Önemli değil gibi görünüyor, Btree'deki dizin SQL'e hangi sayfalardan veri alacağını söyler. Bu noktada, türün yönünün herhangi bir alakası olacağını düşünmüyorum. – Andrew

+0

B-ağaç yanıtlarına eklemek için, dokunan sayfa sayısı aynı ASC veya DESC'dir. "DESC", belirtimin "ORDER BY" deyimiyle eşleşmesi durumunda genellikle yararlıdır. –

+1

[Bu] ile ilgili (http://stackoverflow.com/questions/743858/sql-server-indexes-ascending-or-descending-what-difference-does-it-make) bir çift oldukça iyi cevapları vardır. –

cevap

2

Herhangi bir performans isabeti olacağını düşünmüyorum. Bu yana, erişim için indeks anahtarı ve o anahtar ile belirli bir veri bloğu için bir ikili arama gerçekleştirecektir. Her iki durumda da, bu ikili arama O(log N) karmaşıklığına çarpacaktır. Yani toplam O(log N) + 1 ve kümelenmiş dizin olduğundan, aslında O(log N) zaman karmaşıklığı olmalıdır; Tablo kayıtları fiziksel olarak ayrı bir indeks sayfası/bloğu yerine sipariş edildiğinden.

+0

Sorgumda ayrıca OrderByDescending (Id) kullanıyorum? –

+0

Tek bir sütun dizini için her iki şekilde de aynı olacaktır, ancak bileşik olarak tanımlanan kümelenmiş dizininiz varsa, bu mantıklı olabilir. – Rahul

2

Dizinler bir B-ağacı yapısı kullanır, bu nedenle Hayır. Ancak, birden fazla sütunu temel alan bir diziniz varsa, dış seviyedeki en belirgin sütunları ve en azından iç seviyelerde ayrı olmasını istersiniz. Örneğin, 2 sütun (cinsiyet ve yaş) olsaydı, iç ve dış cinsiyette yaş istersiniz, çünkü sadece 2 olası cinsiyet vardır, oysa daha birçok yaş vardır. Bu performansı etkileyecektir.

+1

Bu tam tersini söylüyor: http://dba.stackexchange.com/questions/33196/multicolumn-index-and-performance. İlk önce Cinsiyet eşitliği (eşitlik testi) ve Yaş (aralık testi) – Anon

+0

@Anon dizinini önerir. Ama sana kendi tecrübemden söyleyebilirim, kesinlikle öyle. Dışarda en seçici olmasını istersiniz. Çok uzun zaman önce bir sorgum vardı, indeksleri geçici bir masa üzerinde geriye aldım ve bunu yaparak hızı ~ 3 dakikadan <2 dakikaya indirdim. – iliketocode

+0

@ user3738391 daha dikkatli okuyun: her iki yüklemenin eşitlik testleri ise, aralık testleri değil * önemli olmadığını söylüyor. {Age, gender} örneğinizde, bir yaş aralığı sorgusu, cinsiyet aralığı sorgusundan çok daha olasıdır. Sizin 'daha seçici ilk' fikriniz iyi bir kuraldır, ama cinsiyetle birlikte kötü bir örnek seçtiniz, çünkü hiçbir zaman 'SELECT *' M 'VE' T 'ARASINDA Cinsiyet olarak kullanılmayacaktır. Testin ya da değil bir yüklem, yani dış indeksi olması gerektiği anlamına gelir. – Anon

İlgili konular