Pertama, mari kita asumsikan bahwa itu (id)
adalah kunci utama tabel. Dalam hal ini, ya, gabungannya (dapat dibuktikan) berlebihan dan dapat dihilangkan.
Nah, itu hanya teori - atau matematika. Agar pengoptimal melakukan eliminasi aktual, teorinya harus dikonversi menjadi kode dan ditambahkan dalam rangkaian optimisasi / penulisan ulang / eliminasi. Agar itu terjadi, para pengembang (DBMS) harus berpikir bahwa itu akan memiliki manfaat yang baik untuk efisiensi dan itu adalah kasus yang cukup umum.
Secara pribadi, itu tidak terdengar seperti satu (cukup umum). Kueri - seperti yang Anda akui - terlihat agak konyol dan peninjau tidak boleh membiarkannya lolos ulasan, kecuali jika diperbaiki dan gabung yang berlebihan dihapus.
Yang mengatakan, ada pertanyaan serupa di mana eliminasi tidak terjadi. Ada posting blog terkait sangat bagus oleh Rob Farley: BERGABUNG penyederhanaan dalam SQL Server .
Dalam kasus kami, yang harus kami lakukan adalah mengubah gabung menjadi LEFT
gabung. Lihat dbfiddle.uk . Pengoptimal dalam hal ini tahu bahwa gabungan dapat dihapus dengan aman tanpa mungkin mengubah hasilnya. (Logika penyederhanaan cukup umum dan tidak khusus untuk bergabung sendiri.)
Dalam kueri asli tentu saja, menghapus INNER
gabungan tidak mungkin mengubah hasil juga. Tetapi sama sekali tidak umum untuk bergabung sendiri pada kunci utama sehingga optimizer tidak menerapkan kasus ini. Namun umum untuk bergabung (atau bergabung kiri) di mana kolom bergabung adalah kunci utama dari salah satu tabel (dan sering ada batasan kunci asing). Yang mengarah ke opsi kedua untuk menghilangkan gabungan: Tambahkan batasan kunci asing (referensi sendiri!):
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
Dan voila, gabungannya dihilangkan! (Diuji dalam biola yang sama): di sini
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 baris terpengaruh
--------------------------------------------------------------------------------
-- 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 | dokter
-: | : ----------------------------------------
1 | Masukkan satu batch per bidang, jangan gunakan 'GO'
2 | Bidang tumbuh saat Anda mengetik
3 | Gunakan tombol [+] untuk menambahkan lebih banyak
4 | Lihat contoh di bawah ini untuk penggunaan lanjutan
--------------------------------------------------------------------------------
-- 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 | dokter
-: | : ----------------------------------------
1 | Masukkan satu batch per bidang, jangan gunakan 'GO'
2 | Bidang tumbuh saat Anda mengetik
3 | Gunakan tombol [+] untuk menambahkan lebih banyak
4 | Lihat contoh di bawah ini untuk penggunaan lanjutan
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 | dokter
-: | : ----------------------------------------
1 | Masukkan satu batch per bidang, jangan gunakan 'GO'
2 | Bidang tumbuh saat Anda mengetik
3 | Gunakan tombol [+] untuk menambahkan lebih banyak
4 | Lihat contoh di bawah ini untuk penggunaan lanjutan