SSMS neden tablonun üstüne yeni satırlar ekliyor?


9

Ne zaman bir satırı el ile bir tabloya SQL Server Management Studio 2008'e eklediğimde (veritabanı SQL Server 2005'tir) yeni satırım alttan ziyade listenin en üstünde görünür.Kimlik sütunları kullanıyorum ve bu sonuç şöyle olur:

id row
42 first row
1 second row
2 third row

Satırlar alındığında ve açıkça sıralanmadığında.Bu, web uygulaması için satırlar alındığında farklı bir görünüme neden olur ve bir TOP 1 sorgusunun döndürdüğü değeri değiştirir.

Onları order by yapabileceğimi biliyorum, ama bu neden oluyor?Verilerimin çoğu bir web uygulaması aracılığıyla eklenir, bu uygulamanın tüm ekleri bir İlk Giren İlk Siparişi verir; örneğin en son ek, en alttadır, böylece kimlikleri arka arkaya oluşturur.Sunucuda veya Management Studio'da bu hatalı sıralamaya neden olan bir ayar var mı?

  0

Bazen gördüğüm gibi, tek bir tablo seçerseniz, PK’nın satırların nasıl görüntülendiğini siparişine bağlıdır.Katılırsanız, diğer tablolara göre PK, FK ve indeksler değişebilir ... 18 tem. 132013-07-18 22:00:36

  0

[Atlıkarınca] (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx) taramalarından da haberdar olun. 01 nis. 152015-04-01 03:49:03

17

SQL dünyasında, sıra, bir veri kümesinin doğal bir özelliği değildir.Bu nedenle, verilerinizi bir sorgulamadığınız sürece, RDBMS’nizden, verilerinizin belirli bir sırada (veya tutarlı bir sırada bile) geri döneceğine dair hiçbir garanti alamazsınız.ORDER BYfıkra.

itibarenCraig Freedman:

TOP'u ORDER BY ile birleştirmek, döndürülen satır kümesine determinism ekler.SİPARİŞ BY olmadan, döndürülen satır kümesi, sorgu planına bağlıdır ve yürütmeden yürütmeye bile değişebilir.

Her zaman kullanORDER BYSonuç kümenizde iyi tanımlanmış ve tutarlı bir düzen bekliyorsanız.Sorgularınızda belirli bir veri sırasını sağlamak için veritabanınızın disklerdeki (örneğin kümelenmiş bir dizin aracılığıyla) satırları nasıl saklayacağına asla güvenmeyin.


0

Tablonun bir tablodur (büyük olasılıkla) ve endeksli olmadığı içindir.Kimlik sütununu bir PRIMARY KEY ve ayrıca IDENTITY .SQL Server, dizinleri temel alan verileri fiziksel olarak depolar - örneğin, eğer id bir kümelenmiş indeks (bir birincil anahtar gibi) olsaydı veriler fiziksel olarak kimlikleri sırasına göre depolanır ve bu şekilde bir sorguda olmasa bile bir sorguda döndürülürdü. ORDER BY yan tümcesi.Aksi takdirde, satırların sıralanması, veritabanı için hiç önemli değildir.Sonuç olarak, bir uygulama olan veri tabanında bulunan satır sırasına bağlıdır (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ışmak zorundadır.

  0

Bilmek güzel.Bunun 'siparişe göre' kullanımı için uygulamayı değiştirmenin bir ipucu olduğunu biliyordum (çok sayıda kötü uygulama içeren kalıtsal bir uygulama) ancak bunun neden olduğunu tam olarak merak ediyordum. 14 eyl. 112011-09-14 19:49:38

+4

Tablonun yapısını değiştirerek sadece "SİPARİŞ *", "SİPARİŞ YOK" olmadan *** "doğru" sırayla geri gelebilir (ancak yine de garanti edilemez)? 14 eyl. 112011-09-14 20:22:26

  0

Kümelenmiş bir indeksi olan tablodan basit bir SEÇİMİ, kümelenmiş indeks sırasına göre geri gelecekti.Verilerin belirli bir sütuna göre ne zaman fiziksel olarak sipariş edildiğinin bir gösterimi olması gerektiği kadar açık değildi, ancak kesinlikle her sorguda doğru şekilde döndürüleceği bir söz değil.Mea Culpa. 14 eyl. 112011-09-14 20:27:39

+4

Kümelenmiş endeksin ne olduğu önemli değil.SQL Server, yine de çok çeşitli faktörlere bağlı olarak başka bir dizine göre siparişi geri verebilir.Bazı sütunlarda birincil anahtar oluşturma *** YAPMAYIN ***, hiçbir sırasız seçmenin, her zaman bu sütunda belirtilen sırayla geri döneceğini garanti eder.Bunu çoğu zaman gözlemleyebilir misiniz?Emin.Ancak bu bir garanti olarak aynı değildir.Sokağımda hiç kutup ayısı görmemiştim, ama olmasını engelleyen kutup ayısı güç alanı yok. 14 eyl. 112011-09-14 20:41:09

+3

Her neyse benim açımdan 'SİPARİŞ BY' yan tümcesini eklemenin, tablodaki şema değişikliklerini yapmaktan ve siparişin sonsuza dek beklediğiniz gibi olacağını ummaktan çok daha iyi bir garanti (boşver). 14 eyl. 112011-09-14 20:42:25


10

Sadece diğer cevapları arttırmak için: bir tablonun tanımı gereği sıralanmamış bir sıralar dizisidir.Bir ORDER BY yan tümcesi belirtmezseniz, SQL Server en verimli gördüğü sıraya satırları döndürmekte özgürdür.Bu çoğu zaman sadece ekleme sırasına denk gelir, çünkü çoğu tablo kimliğe, tarihine veya diğer monoton artan sütunlara ilişkin kümelenmiş bir indekse sahiptir, ancak tam olarak şu şekilde muamele etmelisiniz: bir tesadüf.Yeni verilerle değişebilir, bir istatistik güncellemesi, bir izleme bayrağı, maxdop'taki değişiklikler, sorgu ipuçları, birleştirme değişiklikleri veya sorgudaki cümlecikler, bir servis paketi/kümülatif güncelleme/düzeltme/yükseltme nedeniyle optimizerde değişiklik yapabilir, Veritabanını farklı bir sunucuya vb. taşımak.

Başka bir deyişle, cevabı zaten bildiğinizi biliyorum, ancak yeterince belirtilemiyor:

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

  0

Siparişe bağlı olmayı planlamıyordum, ancak görsel olarak son eklenen öğelerimin aniden üstte durması biraz can sıkıcı. 14 eyl. 112011-09-14 20:18:15

  0

Sanırım bunun nedeni Open Table kullanıyor olmanız.Management Studio 2008'de bu komut "Üstteki Satırları Düzenle" ve "Üstteki N satırları seç" olarak ayrılmıştır - ikincisini seçtiğinizde, sonuçtaki sorguyu düzenlemek için özgürsünüz, örneğin üst kısmını kaldırın ve bir sipariş ekleyin. 14 eyl. 112011-09-14 20:21:07

  0

Bu Studio 2008 stüdyosunda, sunucu 2005'te daha net olmalıydı.Bir "open table" komutu olduğunu bilmiyordum, her zaman 'select' ifadelerini kullandım. 14 eyl. 112011-09-14 20:36:30

+4

Tamam, peki nokta hala duruyor, umuyorum ki, verilerin beklemeyeceğiniz bir sırada geri dönmesi can sıkıcıdır, ama umarım şimdi SQL Server'ın neden beklediğiniz sırada gerçekten umursamadığı açıktır * fıkra ile bir sipariş ekleyerek umursarsın.:-) 14 eyl. 112011-09-14 20:37:35