İlk olarak, (id)
tablonun birincil anahtarı olduğunu varsayalım . Bu durumda, evet, birleşimler gereksizdir (kanıtlanabilir) ve ortadan kaldırılabilir.
Şimdi bu sadece teori - ya da matematik. Optimize edicinin gerçek bir eliminasyon yapabilmesi için teorinin koda dönüştürülmesi ve optimize edicinin optimizasyon / yeniden yazma / ortadan kaldırma paketine eklenmesi gerekir. Bunun gerçekleşmesi için, (DBMS) geliştiricileri, verimliliğe iyi fayda sağlayacağını ve bunun yeterince yaygın bir durum olduğunu düşünmelidir.
Şahsen, kulağa benzemiyor (yeterince yaygın). Sorgu - kabul ettiğiniz gibi - oldukça aptalca görünüyor ve bir geliştirici, iyileştirilmedikçe ve gereksiz katılım kaldırılmadığı sürece incelemeyi geçmesine izin vermemelidir.
Bununla birlikte, eliminasyonun gerçekleştiği benzer sorgular var. Rob Farley: SQL Server'da JOIN basitleştirmesi ile ilgili çok güzel bir blog yazısı var .
Bizim durumumuzda, birleştirmeleri birleştirmek için tek yapmamız gereken LEFT
. Bkz. Dbfiddle.uk . Bu durumda optimize edici, birleştirmenin sonuçları muhtemelen değiştirmeden güvenle kaldırılabileceğini bilir. (Sadeleştirme mantığı oldukça geneldir ve kendiliğinden birleşmeler için özel kasalı değildir.)
Tabii ki orijinal sorguda, INNER
birleştirmeleri kaldırmak da sonuçları değiştiremez. Ancak birincil anahtarda kendi kendine katılmak hiç de yaygın değildir, bu nedenle optimize edicide bu durum uygulanmaz. Bununla birlikte, birleştirilmiş sütunun tablolardan birinin birincil anahtarı olduğu (ve genellikle bir yabancı anahtar kısıtlaması olduğu) katılmak (veya sol birleşmek) yaygındır. Bu, birleştirmeleri ortadan kaldırmak için ikinci bir seçeneğe yol açar: (Kendinden referanslı!) Bir yabancı anahtar kısıtlaması ekleyin:
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
Ve voila, birleşimler elendi! (aynı kemanda test edilmiştir): burada
create table docs
(id int identity primary key,
doc varchar(64)
) ;
GO
✓
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
, ('Fields grow as you type')
, ('Use the [+] buttons to add more')
, ('See examples below for advanced usage')
;
GO
4 satır etkilenir
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doktor
-: | : ----------------------------------------
1 | Alan başına bir parti girin, 'GO' kullanmayın
2 | Alanlar siz yazdıkça büyür
3 | Daha fazla eklemek için [+] düğmelerini kullanın
4 | Gelişmiş kullanım için aşağıdaki örneklere bakın
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
left join docs d2 on d2.id=d1.id
left join docs d3 on d3.id=d1.id
left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doktor
-: | : ----------------------------------------
1 | Alan başına bir parti girin, 'GO' kullanmayın
2 | Alanlar siz yazdıkça büyür
3 | Daha fazla eklemek için [+] düğmelerini kullanın
4 | Gelişmiş kullanım için aşağıdaki örneklere bakın
alter table docs
add foreign key (id) references docs (id) ;
GO
✓
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | doktor
-: | : ----------------------------------------
1 | Alan başına bir parti girin, 'GO' kullanmayın
2 | Alanlar siz yazdıkça büyür
3 | Daha fazla eklemek için [+] düğmelerini kullanın
4 | Gelişmiş kullanım için aşağıdaki örneklere bakın