Hangi sırada ORDER BY yan tümcesi getirilmez?


11

Bir programcı, aynı veritabanı yapısını ve aynı verileri kullanan aynı uygulamayı, biri Oracle 8 ve diğeri Oracle 9 ile olmak üzere yalnızca iki ayrı veritabanında test ediyor ve karşılaştırıyor.

Uygulama, yan tümcesi olmayan bir sorgu çalıştırır ORDER BY.

ORDER-BY-less sorgusunun satırları her iki veritabanında da aynı sırada döndürmesi gerektiğini iddia eder.

Olasılık ORDER BY yan tümcesi sağlamadığınız sürece aynı satır sırası garanti olmadığını söylüyorum.

Veritabanı aynı dizinlere ve anahtarlara sahiptir. Ancak açıklama planı, veritabanlarından birinde motorun birleştirilmiş tablolardan birinin anahtarını kullandığını, diğer veritabanında ise başka bir veritabanını kullandığını göstermektedir.

İki DB ortamının eşit olmadığını, bu yüzden farklı istatistiklere, farklı rdbms motorlarına vb. Sahip olduklarını, ancak orijinal veritabanının sahip olduğu her dizini çoğaltmayı başaramadığım için değil.

Ona, ORDER BYeğer emir gerçekten önemliyse, açıklık getirmesi gerektiğini söylüyorum.

Soru

Böylece onu daha iyi açıklayabilirim:

Sorgulama açık olmadığında bir sorgu satırları bir ORDER BY yan tümcesi sağlar ve bu sorgu neden satırları aynı sırada döndürmez?


3
Tanımsız. SQL belirtimi kayıtların döndürülmesi gereken belirli sıralar belirtir, bu yüzden uygulamaya bağlı olacak inanmıyorum.
Robert Harvey

1
@RobertHarvey Bu yüzden ona söylüyorum. Aslında: tanımlara göre ilişkisel tabloların belirli bir sırası olmamalıdır.
Tulains Córdova

1
Farklı bir dizin kullanmak için yazılımın tam sürümünde bile mantıklı olabilir, çünkü bu veritabanındaki kesin veriler için topladığı dizin istatistiklerine göre daha seçici olabilir. Dolayısıyla , belirtmezseniz siparişe gerçekten güvenemezsiniz.
psr

Gerçekçi olmayan bir şekilde ilk sorguyu dizine eklenmemiş sütuna göre "zaman ekleme" sırasını izlemeyi bekleyebilirsiniz; endeksli "güncelleme zamanı" ile. Ardışık istekler büyük olasılıkla önbelleğe alınmış sonuçlarla "lekelenebilir" ve bu yüzden oldukça rastgele olabilir; yine de asla buna bağlı değildir - sürümden sürüme, parametrelerle, güncelleme işlemleriyle ve dolunaydaki kötü hava koşulları ile değişebilir. "Tanımsız" doğru cevaptır ve başka bir şey en iyi şekilde tahmin edilmiş tahminlerdir.
SF.

1
RDMBS-es tarafından döndürülen sonuç kümeleri şunlardır: tanım gereği belirli bir sıraya sahip olmayan kümeler . Böylece RDBMS bunları istediği sırayla döndürebilir ve bir sonraki sorgu yürütmesinde sırayı tekrar değiştirebilir. ORDER BY deyimi olmadan belirli bir siparişe güvenmek hata olur. Bunu her zaman iş arkadaşlarıma anlatmaya çalışıyorum, ama sadece yarı yarıya başarılıyım: D.
Radu Murzea

Yanıtlar:


25

Gönderen Vikipedi :

ORDER BY deyimi, sonuçta elde edilen verileri sıralamak için hangi sütunların kullanıldığını ve hangi yönde sıralanmaları gerektiğini (seçenekler artan veya azalan) tanımlar. ORDER BY deyimi olmadan, bir SQL sorgusu tarafından döndürülen satırların sırası tanımsızdır.

Yani tanımsız.

SQL belirtimi, kayıtların döndürüleceği belirli sırayı belirtmez, bu nedenle uygulamaya bağlı olacaktır.

Tabloda dizin bulunmadığında, mantıklı sıralama, kayıtların eklendiği sıra olacaktır. Birincil Anahtar tanımlandığında, mantıklı düzen Birincil Anahtarın sırası olacaktır. Ancak ANSI spesifikasyonu belirli bir sipariş gerektirmediğinden, satıcıya bağlıdır ve duyarlılıkları sizinkinden veya benimkinden farklı olabilir.

Sipariş olduğundan değil şartnamede belirtilen bu bir satıcıdan diğerine değişebilir ve satıcı uyarmadan, düzeni istedikleri zaman değişebilir çünkü, belirli bir satıcının uygulama davranışı güvenmek akıllıca olmaz.

Söylediğiniz gibi, ORDER BYdüzen önemliyse , sadece maddeyi ekleyin .


Sorguda birkaç birleştirilen tablo var. Böylece bir DB motoru sonuç kümesini bir ölçütle sıralar ve diğer DB başka bir ölçüt kullanır. Bir ORDER BY deyimi sağlandığında, her iki sorgu da satırları belirtilen sırada döndürür.
Tulains Córdova

+1 AFAICR, belirli bir veritabanı örneğinde belirli bir sorguyu her yürüttüğünüzde siparişin değişmesine bile izin verilir.
MarkJ

2
ORDER BY deyimi olmadan, tek mantıklı sonuç sırasının en az yükü oluşturan şey olduğunu söyleyebilirim. Basit DB depolama motorları ve sorguları için, bu genellikle ekleme sırası olacaktır (ve oluşturulan birincil anahtarlar için birincil anahtar sırası ile aynı). Ama orada hash birleşimleri olur olmaz, siparişin esasen rastgele olmasını beklerdim.
Michael Borgwardt

2

Açıkçası, spesifikasyonun verilerin hangi sırayla geldiğini söylemediğine işaret etmedi. Muhtemelen verilerin bir diskte veya bir yerde bellekte olduğunu bildiği ve dolayısıyla bunu bir düzen olarak gördüğünden. Birkaç tablodan hesaplanan verilerin sırasının ne olduğunu sorun. Yani 4 tabloya katıldığınızda, 2 tanesi üzerinde bir hesaplama yaparak ve sadece hesaplanan değeri döndürerek bir örnek oluşturun.

Motor, verileri bulduğu sıraya göre döndürür (bir sıralama yok), ancak nasıl bulduğunu değiştirebilecek faktörlere bağlıdır - dizinler, istatistikler, önbellekler. Genel olarak veriler tutarlı bir sırada olacaktır - ancak siparişe bağlıysanız, bunu istemeniz gerekir.

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.