ifadeleri veya Yüklem sırası standart SQL katılır dış birleştirmeler için katılmak durumda herhangi bir fark yaratır mı?

oy
2

Bu yüzden bir sinir bozucu gün biraz yaşıyorum. I did not çünkü son birkaç hafta çalışma olmuştu, sözleşmeden kovuldu ekibi ile örgü. İki örnek aktarıldı:

1) Dün bazı temel sistem veriler dışında bir SQL Server veritabanındaki tüm verileri silmek istendi. Istekte (değil patronum) Bir kaç ay önce bu görev için kullanmıştı yaklaşık sekiz komut vardı. Görünüşe kimse komut dışarı veri modelini veya sistem verilerini düşünülen etmiştir.

Bu kişi aşırı komplike şeylerin bir desen kurdu, bu yüzden görev ve nihai hedef nedenlerini anlamaya çalışıyordum. Ben de hep kaldırmak ve kısıtlamaları yeniden ekleyin tüm bu ekstra komut dosyalarını gerekli belirsiz hatalar her türlü var anlamak için mücadele etti.

Gerekli bir şey yapmak oldukça istekli olduğunu ve biz bu konuda birkaç dakika konuştuk. Belli nedenlerden dolayı ben iyi bir şey olduğunu neden arayan anlamak düşündüm. Aniden sadece başına yapmasını ziyade bana her açıklayan vakit geçirmek için daha hızlı olacağına karar verdik ve bu konuda daha fazla düşünmeden geri benim diğer işine döndü.

Her nasılsa bu olumsuz yorumlandı.

2) Birkaç hafta önce benim ilk haftasında ben başka bir sistemden bazı verileri birleştirme üzerinde çalışmaya istendi. Ben tüm yoksul veri ve özgün programcılar ile ilgili şikayetlerin bir oral tirad ile birlikte önemli olduğu ortaya çıktı SQL snippet'lerinin bir 600 + satır komut verildi. Doğal olarak yakından zorla okumak için biraz zaman aldı ama birkaç gün sonra nihai sonucudur basit bir MERGE kabaca 25 satır olarak ortaya çıktı.

Ben on yıldan fazla için SQL yazıyorum ve kendimi alanında bazı uzmanlığa sahip düşünün. Gereksiz karmaşıklıktan uzak soyulmuş ve söz verdiğimiz gibi görevi bitirmek için geç kalmış olarak Benim arkadaşları biraz sabırsız elde edildi.

Sorunun çözümü tam olarak bir çok kısa bir komut olduğu ortaya çıktı ve ben utanç verici olduğu ispat edilecekti şey eksikti merak ettim onlar kabul edeceğini nasıl kolayca emin değildi. Ne yazık ki benim araştırmacı soruların hepsi art arda kötü öğretmenler aşırı meraklı ilköğretim öğrencisine vermek küçümseyen olmayan cevaplar tür karşı karşıya kalmıştım. Yani bir e-postada boyunca sorgu gönderilen ve eve gittim.

Ertesi sabah her şeyi yanlış olduğunu (aynı kişi olarak # 1) söylendi ama ben yeni adam olarak bilmek beklenemeyeceğini söyledi şeyler oldu. O hepsini yeniden kendini güç olduğunu açıkladı. Onun noktalardan biri Zaten kendim hakkında ona sormak amacı vardı veriler hakkında küçük bir şeydi. Diğer tamamen SQL oldu.

(Soru burada başlıyor.)

Tipik bir sol dış senaryosunu katılmak atın. Hepimiz tabloların sırası örneğin, oldukça önemli olduğunu biliyoruz Q1 ve Q2 eşdeğer değildir:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)

Ben birden konusunda kavramsal düşündüğümde genellikle ilgi nesnesi olarak yeni bir tablo seçiyor ve onun satırları önce gelen şeyle ilgili nasıl açıklayan hayal etmek bana doğal görünüyor katılır. paralel terimleri tutulması genellikle katılmak koşul Bu şekilde yazmak bana ve benim kendi alışkanlığı ile herhangi bir avantaj yok:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)

Yani kendimi bir dış tablolar sırası önemlidir katılmak konusunda eğitsel ediliyor bulabilirsiniz. Benim zeka bu test zaten iş görüşmesi sırasında yapılmıştır düşünmüştü. Ben o sadece eşitlik karşılaştırma odaklanarak anladı olarak benim karışıklık uyuşukluk dönüştü. Onun için Q3 yanlıştı ve Q1 yerine gerekli versiyonu oldu.

Ben diplomatik hepsi de herhangi bir fark yapmadığını ve kimi istiyorsa kolayca davamı olabilecek ısrar etti. Onun akıl açıklığa kavuşturmak için çalıştı ama bu onlar yeterlilik küçücük seviyesini önermek için kullandıkları teknik kelimeleri ifadelerle veya kaç ne kadar dikkatle olursa olsun sorularınıza yakından dinlemiyor kişinin türüdür, bu yüzden karar sadece o Ben salak değilim onu ​​ikna edemedi. Ve bunun hakkında tartışmaya değmez çünkü senaryoyu değiştirmeye karar verdiler.

Ben hemen gururumu yanaşmıyor ben olmadığını gösterdi herhalde Yol gösterilebilir.


yalnız tarzı gelince, onların SQL genellikle diğer yollarla özensiz olsa işveren tercih herhangi standardına uygun. Ben dış Bu önemli olur sözdizimi katılmak eski tarz ile fark yok. Bunun ötesinde ben herkes bu durumda yapmak duymadım. Bu soruya cevap ve benim itibar kurtarmak ediniz.

ifadeleri veya Yüklem sırası standart SQL katılır dış birleştirmeler için katılmak durumda herhangi bir fark yaratır mı?

Oluştur 07/07/2012 saat 01:54
kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
2

eşitlik karşılaştırma sırası katılmak sonuçlarına hiç fark etmez. Ama anlaşılmaz nedenlerle sonuç bilgisayarlı hangi ekonomik etkileyebilecek için. SQL optimize böyle görünüşte önemsiz ayrıntılar etkilenmeden meşhurdur.

Cevap 07/07/2012 saat 02:04
kaynak kullanıcı

oy
4

Hayır, hiç fark etmez.

Şahsen ben 3. çeyrekte göstermek tarzı tercih benim Workmate bazı Q1 tarzını tercih etmektedir. Şimdiye kadar olmak bunlardan birini ele alacak kimseyi tanımıyorum yanlış .

Sorgu optimiser bambaşka bir şey haline içini dışına sorgu döner, bu yüzden onunla bitince yüklem bile artık düz bir karşılaştırma olarak mevcut değil. Genellikle bir dizin veya tablodaki bir arama var, o da sadece bir yöne yapılabilir gibi, yüklem yazılmıştır nasıl hiç fark etmez.

Ben farklı bir sırada yüklem işlenen iki sorgularının yürütme planı (SQL Server 2005) kontrol ve beklendiği gibi onlar aynıdır.

Cevap 07/07/2012 saat 02:21
kaynak kullanıcı

oy
2

Ben Q3 en çok durumu sırasını KATILIN tercih:

... ON B.id = A.id -- (Q3)

doğrudan B.id daha değişen biri olduğunu yansıtır gibi, örneğin karşı test sabit varlık olarak A.id düşünebilirsiniz

B.id = 1984

Aynı şekilde ben kodunda bunu görmek istemiyorum ...

1984 = B.id

... senin gibi ben sorguda bunu görmek istemiyoruz:

A.id = B.id

Ancak, hayatta birçok şey gibi, küçük endian gibi insanlar var ve big-endian isteyenler var. onlar seçmiş tercihine onlara hizmet edebilir zihinsel ne olursa olsun modeli, sana istedikleri neden gerekçesini açıklamak en azından mümkün olmalıdırA.id = B.id

Ben gerçi benim tercih geçmek zorunda düşünüyorum benim (ve sizin) tercih koşul sipariş özellikle bazı ORM Linq çalışmaz. Onların koşul q1 halloldu olması gerektiğini empoze neden kavramak henüz:

from x in A
join y in B on x.id equals y.id

Bu Linq tarafından kabul edilmeyecektir sözdizimi hatası amacıyla sonuçları (SQL sorgusunda bir hata olmasa, Q3 aynı) Ve koşulu tersine:

from x in A
join y in B on y.id equals x.id

Şimdi, Microsoft Linq tasarımcıları Q1 condition emrini tercih neden mantığı bulmalıyız. Ve bu mantıklı olup olmadığını takdir deneyin ve sadece (henüz) mantıklı olmasa bile kabul edin.


ilgili olarak:

ifadeleri veya Yüklem sırası standart SQL katılır dış birleştirmeler için katılmak durumda herhangi bir fark yaratır mı?

Sonuç akıllı, NO . Performans açısından, ben en katılmak koşulu sipariş daha hızlı sorgu yapan bir sorgu henüz görmedik. Hatta forumlarda Herkes daha hızlı sorgu yapmak koşulu tersine onayladığı görmedik.

Sana gerekçesi veya tercih ettikleri condition emri zihinsel modeli izah edemez, belki onlar sadece yapıyorsun hizmet vermektedir Kargo Kültü Programlama , henüz ya da kötü Bikeshedding

Cevap 07/07/2012 saat 02:48
kaynak kullanıcı

oy
1

Ben ancak yapar, senin Q1 tercih kesinlikle hiçbir fark performansında ve sorgu en iyi duruma üzerinde kesinlikle hiçbir etkisi yoktur.

Bana göre, ilk olarak önceki tabloyu koyarak bana tarama sürecinde er ilgili bilgileri verir. Ben okuyabilir join table B on A ...ve zaten iki tablo araya hangilerinin biliyorum. Ben okuduğumda join table B on B.blasdjasdid = ...ben (ad bir çeşit sütun adı anlaşılacaktır altında etki alanı olan) katılmış olan tabloda en önemli bilgileri, uzak çok taramak için yaşadım ve hala bilmiyorum. Kolonlar her iki tabloda (herhangi bir veritabanı ı tasarımında deyimsel) aynı adlandırılır, ayrıca, sadece okuma, tamamen sona tarama önleyebilirsiniz join table B on A.SomethingId ...o olduğunu bilerek ve zaten = B.SomethingId.

Biraz daha derine gidiyor, ben bu olay hakkında sormak için teşvik edecek workplace.stackexchange.com Ben senin hizmetler kesildi nedenleri ne anlattıklarını eşleşmiyor şüpheli çünkü; Bu biraz araştırma üretken olabilir. Senin hatan oldu demiyorum ama gösterilen sebep olasılıkla bir bahane olduğunu.

Cevap 29/12/2015 saat 19:14
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more