SSMS neden tablonun üstüne alt değil, yeni satırlar ekliyor?


14

SQL Server Management Studio 2008'de (veritabanı SQL Server 2005) bir tabloya el ile bir satır eklediğimde yeni satırım listenin en üstünde değil, en üstte görünür. Kimlik sütunları kullanıyorum ve bunun sonucunda

id  row
42 first row
1 second row
2 third row

Satırlar getirildiğinde ve açıkça sipariş edilmediğinde. Bu, web uygulaması için satırlar getirildiğinde farklı bir görünümle sonuçlanır ve bir TOP 1sorgunun döndürdüğü şeyi değiştirir .

order byOnları yapabileceğimi biliyorum, ama bu neden oluyor? Verilerimin çoğu bir web uygulaması aracılığıyla eklenir, bu uygulamadaki tüm ekler bir First In First Out siparişiyle sonuçlanır, örneğin en son insert en alttadır, bu nedenle kimlikleri bir sıradadır. Sunucuda veya Management Studio'da bu hatalı sıralamaya neden olan bazı ayarlar var mı?


Bazen gördüğüm gibi, tek bir tablo seçerseniz, PK'nın satırların nasıl görüntüleneceğine bağlı olduğuna bağlıdır. Bazı birleştirmeler yaparsanız, diğer tablolara göre PK, FK ve dizinlere göre değişebilir ...
Guillermo Gutiérrez

Atlı karınca taramalarının da farkında olun .
Michael Green

Yanıtlar:


21

SQL dünyasında, düzen bir veri kümesinin doğal bir özelliği değildir. Böylece, verilerinizi bir ORDER BYcümle ile sorgulamadığınız sürece, RDBMS'nizden verilerinizin belirli bir sırada (hatta tutarlı bir sırada) geri geleceğine dair hiçbir garanti almazsınız .

Gönderen Craig Freedman :

TOP ile ORDER BY birleştirildiğinde, döndürülen satır kümesine determinizm eklenir. ORDER BY olmadan, döndürülen satır kümesi sorgu planına bağlıdır ve hatta yürütmeden yürütmeye kadar değişebilir.

ORDER BYSonuç kümenizde iyi tanımlanmış ve tutarlı bir sipariş bekliyorsanız her zaman kullanın . Sorgularınızda belirli bir veri sırasını garanti etmek için veritabanınızın satırları diskte nasıl depolayacağına asla güvenmeyin (örn. Kümelenmiş bir dizin aracılığıyla).


13

Sadece diğer cevapları arttırmak için: bir tablo tanım gereği sıralanmamış bir sıra kümesidir. Bir ORDER BYcümle belirtmezseniz , SQL Server satırları en verimli gördüğü sırayla döndürmekte serbesttir. Çoğu tablonun kimlik, datetime veya diğer monoton olarak artan sütunlar üzerinde kümelenmiş bir dizine sahip olması nedeniyle, bu genellikle ekleme sırasına denk gelir, ancak bunu tam olarak şu şekilde ele almalısınız: bir tesadüf. Yeni veriler, bir istatistik güncellemesi, bir izleme bayrağı, maxdop'taki değişiklikler, sorgu ipuçları, birleştirmedeki değişiklikler veya sorgudaki maddeler, bir hizmet paketi / toplu güncelleme / düzeltme / yükseltme nedeniyle optimize edicideki değişiklikler, veritabanını farklı bir sunucuya taşımak vb.

Başka bir deyişle, cevabı zaten bildiğinizi biliyorum, ama yeterince ifade edilemez:

Bir sorgunun sırasına güvenmek istiyorsanız, HER ZAMAN ekleyin ORDER BY .


Siparişe bağlı olarak planlama yapmıyordum, ancak görsel olarak son eklenen öğelerimin aniden üstte olması biraz can sıkıcı.
Ben Brocka

Sanırım bunun sebebi Open Table kullanıyor olmanız. Management Studio 2008'de bu komut "En İyi n Satırları Düzenle" ve "En Çok N Satır Seç" olarak ayrılmıştır - ikincisini seçtiğinizde, ortaya çıkan sorguyu düzenlemekte özgürsünüz, örn. Üst kısmı kaldırın ve bir sipariş ekleyin.
Aaron Bertrand

Bu yönetim stüdyosu 2008, sunucu 2005, daha açık olması gerekirdi. Bir "açık masa" komutu olduğunu bilmiyordum, her zaman selectifadeleri kullandım
Ben Brocka

4
Tamam, iyi bir nokta hala duruyor, verilerin beklemediğiniz bir sırayla geri gelmesinin can sıkıcı olduğunu anlıyorum, ancak umarım SQL Server'ın umursadığınızı söylemediğiniz sürece neden beklediğiniz siparişi gerçekten umursamadığını açıklıyoruz maddeye göre sipariş ekleyerek. :-)
Aaron Bertrand

1

Bunun nedeni, tablonun bir yığın tablosu olması (büyük olasılıkla) ve dizine eklenmemiş olmasıdır. Kimlik sütunu a Make PRIMARY KEYsıra sıra IDENTITY. SQL Server verileri dizinlere göre fiziksel olarak depolar - örneğin, id kümelenmiş bir dizinse (birincil anahtar gibi) veriler fiziksel olarak kimliklerin sırasına göre depolanır ve sorgu olmadan bu şekilde döndürülür bir ORDER BYmadde. Aksi takdirde, satırların sıralaması veritabanı için hiç önemli değildir. Sonuç olarak, bir uygulama olan bağlı veri tabanında bulunan satır için (aynı zamanda belirli bir sırayla sütunların bağlı olarak) iyi bir uygulama değildir. Uygulama, satırları tanımlamak için veritabanında bulunan anahtarlarla çalışmalıdır.


Bunu bildiğim iyi oldu. Bunun uygulamayı kullanmak için bir ipucu olduğunu biliyordum order by(çok sayıda kötü uygulama ile kalıtsal bir uygulama) ama tam olarak neden olduğunu merak ediyordum.
Ben Brocka

5
O sadece bu yüzden tablonun yapısını değiştirme SELECT *olmadan ORDER BY olabilir "doğru" sırayla gel (ama yine de garanti edilemez)?
Aaron Bertrand

Kümelenmiş bir dizin içeren tablodan basit bir SELECT üzerinde, kümelenmiş dizin sırasıyla geri gelirdi. Verilerin fiziksel olarak belirli bir sütun tarafından ne zaman sipariş edildiğini gösteren bir örnek olması gerektiği kadar net değildi, ancak her sorguda doğru bir şekilde döndürüleceği kesinlikle verilmemiştir. Mea Culpa.
Wil

5
Kümelenmiş dizinin ne olduğu gerçekten önemli değil. SQL Server, çok çeşitli faktörlere dayalı olarak başka bir dizine dayalı olarak siparişi döndürebilir. Bazı sütunlarda birincil anahtar oluşturmak , herhangi bir sipariş vermeden seçimin aniden o sütun tarafından her zaman geri sıralanacağını garanti etmez. Bunu çoğu zaman gözlemleyebilir misiniz? Elbette. Ancak bu bir garanti ile aynı şey değildir. Sokakımda hiç bir kutup ayısı görmedim ama bunun gerçekleşmesini engelleyen kutup ayısı güç alanı yok.
Aaron Bertrand

4
Her neyse, bir ORDER BYcümle eklemenin , şemada değişiklik yapmak ve siparişin beklediğiniz gibi olmasını ummaktan çok daha iyi bir garanti (asla daha az rahatsız edici) olmasıydı .
Aaron Bertrand
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.