Kümelenmiş bir dizin kullanıldığında “satır dışı” alanları okunuyor mu?


10

VARCHAR(MAX)/NVARCHAR(MAX)Sütunlar kullanıldığında veri saklanır biliyorum out of the row- veri satırı 'büyük değer' depolanan başka bir konuma bir işaretçi olacaktır.

Aşağıdaki sorularım var:

  1. Her alan depolanmış mı, out of the rowyoksa yalnızca alan maxmı?
  2. clustered indexTablonun tamamını kayıtların tamamını okumak için kullanıyorsanız , satır dışında depolanan alanlar da okunuyor mu?

VARCHAR (MAX) veya NVARCHAR (MAX) 'büyük değer türü' olarak kabul edilir. Büyük değer türleri genellikle 'sıra dışı' olarak depolanır. Bu demektir ki ...


2
Son alıntılanan bit nereden geldi? Doğru değil.
Paul White 9


3
Orijinal MSDN dizisindeki tam metin (Jacob Sebastian tarafından) doğrudur. Yığın Taşması "alıntı" bunun bir miktar kaybeder. Yukarıda alıntıladığınız küçük kısım tüm önemli bitleri atlıyor :)
Paul White 9

Yanıtlar:


13

VARCHAR(MAX)/NVARCHAR(MAX)Sütunlar kullanıldığında verilerin sıra dışına kaydedildiğini biliyorum ...

Aslında, bu large value types out of rowseçenek kullanılarak ayarlanabilen seçeneğin ayarına bağlıdır sp_tableoption. Gönderen belgeler :

BOL özü

Varsayılan içindir MAXdeğerler saklanmasına içinde satır onlar uyarlarsa, 8000 bayt kadar. Eğer kullanmış sürece sp_tableoptionvarsayılan değiştirmek için, sizin MAXveri büyük olasılıkla içinde satır saklanacaktır.

Bununla birlikte, MAXasla 8000 baytı aşmayacak değerler için veri türlerini kullanmak zayıf bir uygulamadır - bunun yerine MAX olmayan bir tür kullanın. MAXSQL Server'ın 2GB'a kadar olabilecek verilerle başa çıkmaya hazır olması gerektiğinden, başka bir şey dışında, türlerle uğraşırken performans genellikle önemli ölçüde daha kötüdür .

Her alan satır dışında mı saklanıyor yoksa yalnızca maksimum alan mı?

Sadece MAXolanlar. Ayrıca, daha önce satır içi bir MAXsütun satır dışına taşınırsa, yalnızca bu satırdaki sütun etkilenir. Satır, satır dışı LOByapıya bir işaretçi ile değiştirilir . MAX olmayan sütunların satır dışına taşınabileceği durumlar da vardır.

Tablonun kümelenmiş dizinini tüm kaydı okumak için kullanıyorsanız, satır dışında depolanan alanlar da okunuyor mu?

Kümelenmiş dizinin taranması yalnızca satır içi verileri geçer. Sorgu için satır dışı veri gerekiyorsa, satır içi işaretçisi kullanılarak aranır.


Bu her zaman doğru Scanning the clustered index traverses only in-row data.mu - ? Örneğin, NVARCHAR(MAX)alan değerlerini görüntülemek istiyorsanız , yalnızca in-row-data(değerler satır dışına kaydedilmişse) ile çalışmak nasıl mümkün olur ? (Hiçbir kapsayan endeks olmadığından) Eğer kümelenmiş dizini kullanıyor ama gidiş değildir Veya workile NVARCHAR(MAX)sahada SQL Server görüyoruz ve göz yukarı atlamak kadar zeki out-of-rowveri?
gotqn

Cevap için teşekkürler. Son olarak, iki sütununuz varsa - intve nvarchar(max)yalnızca intsütunu seçiyorsanız, SQL-Server, kullanmayacağınızı bildiği readiçin out-of-rowveriye kaynak israf etmez mi?
gotqn

Çok teşekkürler. Bu çok iyi. Görünüşe göre, sp_tableoptionbir çok kümelenmiş dizin aradığında / taradığında, satırın boyutunu azaltmak için sık kullanılmayan her şeyi tablodan çıkarabiliyorsunuz.
gotqn

3
@gotqn Evet. Kapalı sıra eski LOB türleri için varsayılan olarak text, ntextve image. Tabii ki, büyük tipleri ayrı bir tabloda da saklayabilirsiniz.
Paul White 9

4

Büyük nesnelerin depolanması için bu davranış tablo ayarı ile kontrol edilebilir:

exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>

SQL Server 2012 belgelerindeki referans şu adrestedir : http://msdn.microsoft.com/en-us/library/ms173530.aspx

Böylece, alanın nerede kullanıldığını, satır içi veya satır dışında depolanacağını kontrol edebilirsiniz.


Teşekkürler, bunu kontrol edebileceğinizi gerçekten bilmiyordum.
gotqn
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.