Bir alt sorguda ORDER BY veritabanı uygulamaları


10

ORDER BY deyimi iç sorguda olacak şekilde SQL deyimlerini saran bir uygulama (MapServer - http://mapserver.org/ ) kullanıyorum. Örneğin

SELECT * FROM (
        SELECT ID, GEOM, Name
        FROM t
        ORDER BY Name
        ) as tbl

Uygulama birçok farklı veritabanı sürücüsüne sahiptir. Ben esas olarak MS SQL Server sürücüsü ve SQL Server 2008 kullanıyorum. Bir alt sorgu bir ORDER BY bulunursa, bir hata atar.

MS Docs (bu SQL Server 2000 için olmasına rağmen hala geçerli gibi görünüyor):

Bir görünüm, bir satır içi işlevi, türetilmiş bir tablo veya bir alt sorgu ORDER BY yan tümcesi kullandığınızda, sıralı çıktı garanti etmez. Bunun yerine, ORDER BY deyimi yalnızca Üst işleç tarafından oluşturulan sonuç kümesinin tutarlı bir yapıya sahip olduğunu garanti etmek için kullanılır. ORDER BY deyimi, sıralı bir sonuç kümesini yalnızca en dıştaki SELECT deyiminde belirtildiğinde garanti eder.

Ancak Postgres (9) ve Oracle'da çalıştırıldığında aynı sorgu türü, alt sorguda tanımlandığı sıra ile sonuç döndürür. Postgres'de sorgu planı sonuçların sıralandığını ve Postgres sürüm notlarının alt sorgu siparişlerinin kullanıldığını ima eden öğeyi içerdiğini gösterir:

ORDER BY alt sorgusu üst sorguyla eşleştiğinde sıralama yapmaktan kaçının

http://en.wikipedia.org/wiki/Order_by belirtiyor:

Bazı veritabanı sistemleri alt seçimlerde veya görünüm tanımlarında ORDER BY deyiminin belirlenmesine izin verse de, varlığın etkisi yoktur.

Ancak kendi sorgu planları kontrol:

  • SQL Server 2008, bir alt sorguda ORDER BY'ı desteklemiyor
  • Postgres 9 bir alt sorguda ORDER BY'ı destekliyor
  • Oracle 10g bir alt sorguda ORDER BY'ı destekler

Benim sorum, Postgres ve Oracle'ın bir alt sorguda sıralamaya izin vermediğini resmi olarak onaylayabilecek veya reddedebilecek bağlantılar var mı?


2
Belirli sonuçları gözlemlemeniz, onları garantilemez. Tutarlılık istiyorsanız, siparişi dışarıya koyun. Dönemi.
Aaron Bertrand

İdeal olarak bu uygulanacaktır. Ancak bu aşamaya gelmek için çekirdek mantık ve birçok veritabanı sürücüsünde değişiklikler yapılacaktır. Bu sorun uzun yıllardır bildirilmediğinden, bazı dbs alt sorgularda sürekli olarak ORDER BY uyguluyor gibi görünüyor. Mümkünse hangilerini bilmek güzel olurdu.
geographika

2
@geographika Bazı DBMS bunu şimdiye kadar tutarlı bir şekilde yapsa bile, gelecekte de aynısını yapmaya devam edeceklerine dair bir garanti yoktur. Örnek olarak, MySQL'in optimize ediciyi 5.6 (ve MariaDB 5.3) sürümündeki geliştirmeleri ORDER BY, alt sorguda gereksiz olarak tanımlanır ve gereksiz sıralama yapmaz.
ypercubeᵀᴹ

Yanıtlar:


15

Eğer uygulama yapmak zorunda gidiyoruz değil koymak ORDER BYalt sorgu içine (belki ilk etapta gereksiz bir alt sorgu kullanmaz için bir seçenek vardır). Daha önce keşfettiğiniz gibi, bu sözdizimi SQL Server'da desteklenmez TOP. Ve TOP, bazı satırları dışarıda bırakmak istemiyorsanız, kullanmak optimize edilmiş TOP 100 PERCENTolanı ORDER BYyine de yapacak .

Oracle ve PostGres'de sözdiziminin desteklenmesi nedeniyle itaat edildiği anlamına gelmez. Ve sadece bir senaryoda itaat edildiğini gözlemlemeniz, yeni sürümler çıktıkça veya verilerinizde, istatistiklerinizde, sorgunun kendisinde veya çevrede küçük değişikliklerle uyulmaya devam edeceği anlamına gelmez.

Ben, Sizi temin ederim ki hiç şüphesiz bir istiyorsanız, garanti sipariş hakkında, sen koymak gerekmez ORDER BYdıştaki sorguyu. Hangi platformu kullanıyor olursanız olun, bu yaklaştığınız bir doktrin olmalıdır.

Bir şeyin desteklenmediğini resmi olarak bildiren bir bağlantı istiyorsunuz. Bu, aracınızın uçamayacağı resmi bir açıklama için aracınızın kullanım kılavuzuna bakmak gibidir.


Teşekkürler. Bence MSSQL hata atmada doğru yaklaşıma sahip. Çekirdek SQL ilkesine aykırı olduğunda, iç sorgular üzerinde sıralamayı hem destekleme hem de uygulama, felaket için bir reçete gibi görünüyor. Araba analojisi hakkında emin değilim - araba gerçekten uçarken kılavuzda aramaya eklemeniz gerekir ..
geographika

-1

Bu kalitesiz itiraf ama bir çimdik iseniz alt sorgu satır üst sayısını döndürmeyi deneyin. En üst yüzde 100'ü döndürmek işe yaramaz, ancak sorundan geçmek istiyorsanız satır sayısını sorgulayabilir ve bunu değişken olarak TOP'a aktarabilirsiniz. SQL 2000 ile çalışması gerektiğini düşünüyorum bu yüzden uyumluluk seviyesi 80 için ayarlanmış bir veritabanı üzerinde test.

SELECT * FROM (
        SELECT TOP (100000) ID, GEOM, Name
        FROM t
        ORDER BY Name
        ) as tbl

Başlangıçta denedim ve küçük veri kümeleri için iyi sıralamak gibiydi. Ancak çok büyük kayıt kümeleri alırken sıralama yeniden SQL Server 2008R2 oldu. Belki bellek / sayfa boyutları ile ilgilidir?
geographika

Üzgünüm, yardımcı olmadı. En üst yüzde 100'ü seçmek de sıralamanın rasgele dönmesine neden oldu.
DBNull

Sorgu paralel giderse, özellikle de Namebenzersiz değilse , bu çalışmaz. Optimize edici farklı anahtar sütun sırası ile farklı bir dizin seçerse seri olarak çalışmaya devam etmeyebilir.
Erik Darling
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.