@Gordon Linoff'un işaret ettiği gibi, dizinleri tanımlamanız gerekir. Ancak, sorgunuzla daha fazla iş yapmak için bazı şeyler var. Bu sıra tabloları sırasını tanımlamak için kesinlikle daha iyi, bu yüzden bu garantisi yoktur rağmen daha şık bir koddur bu
SELECT l.Name, l.Model, l.Engine_Type, m.ID, g.Name
FROM db.vehicle_part k
JOIN db.vehicle l ON k.ID_Vehicle = l.ID
JOIN db.part m ON k.ID_Part = m.ID
JOIN db.part_generic_part b ON b.ID_Part = m.ID
JOIN db.generic_part c ON c.ID = b.ID_Generic_part
JOIN db.part_category_generic_part e ON c.ID = e.ID_generic_part
JOIN db.part_category f ON e.ID_category = f.ID
JOIN db.part_category_name g ON f.ID = g.ID_Part_Category
JOIN db.lang h ON g.ID_Lang = h.ID
JOIN db.generic_part_name d ON c.ID = d.ID_Generic_Part
WHERE l.Name = 'BMW' AND l.Model = '3 (E30)' AND l.Engine_Type= '316 i' AND g.ID_Lang =2
bu
SELECT l.Name, l.Model, l.Engine_Type, m.ID, g.Name
FROM db.vehicle_part k
JOIN db.vehicle l ON k.ID_Vehicle = l.ID
JOIN db.part m ON k.ID_Part = m.ID
JOIN db.part_generic_part b ON b.ID_Part = m.ID
JOIN db.generic_part c ON c.ID = b.ID_Generic_part
JOIN db.generic_part_name d ON c.ID = d.ID_Generic_Part
JOIN db.part_category_generic_part e ON c.ID = e.ID_generic_part
JOIN db.part_category f ON e.ID_category = f.ID
JOIN db.part_category_name g ON f.ID = g.ID_Part_Category
JOIN db.lang h ON g.ID_Lang = h.ID
WHERE l.Name = 'BMW' AND l.Model = '3 (E30)' AND l.Engine_Type= '316 i' AND g.ID_Lang =2
değiştirmek aslında olacak ilk olandan daha hızlı olun. Ancak, bu daha iyi düzen ile, bir sonraki adıma geçiyoruz. where
yan tümcesi, join
tamamlandığında, belleğe yüklenen büyük, çok boyutlu bir kayıt kümesine sahip olduğunuzdan ve satırları filtrelediğinizden sonra yürütülür. on
durum daha erken çalıştırır, dolayısıyla bir sonraki adım, bu gibi where
değiştirmek ve on
koşulları içine durumunu taşımaktır:
SELECT l.Name, l.Model, l.Engine_Type, m.ID, g.Name
FROM db.vehicle_part k
JOIN db.vehicle l ON k.ID_Vehicle = l.ID AND l.Name = 'BMW' AND l.Model = '3 (E30)' AND l.Engine_Type= '316 i'
JOIN db.part m ON k.ID_Part = m.ID
JOIN db.part_generic_part b ON b.ID_Part = m.ID
JOIN db.generic_part c ON c.ID = b.ID_Generic_part
JOIN db.part_category_generic_part e ON c.ID = e.ID_generic_part
JOIN db.part_category f ON e.ID_category = f.ID
JOIN db.part_category_name g ON f.ID = g.ID_Part_Category and g.ID_Lang =2
JOIN db.lang h ON g.ID_Lang = h.ID
JOIN db.generic_part_name d ON c.ID = d.ID_Generic_Part
Bu şekilde, gereksiz kayıtları onlar beri zamanı azaltarak, join
ğine filtrelenir hepsi belleğe yüklenmez ve ardından filtrelenir. Son adım, eğer ve ancak sorgu hala yavaşsa, kodun okunabilirliğini azalttığından, yapılmalıdır: Şiddetli bir filtreye sahip olan (satır sayısını önemli ölçüde azaltan) veya ciddi bir projeksiyona sahip olan (çok sayıda) join
Büyük alanlar, ancak adlandırılmış alt-seçimlere, bunun sadece küçük bir alt kümesine ihtiyaç vardı. Örnek:
SELECT 'BMW', '3 (E30)', '316 i', m.ID, g.Name
from (select temp.ID from db.vehicle temp where temp.Name = 'BMW' AND temp.Model = '3 (E30)' AND temp.Engine_Type= '316 i') l
JOIN db.vehicle_part k on l.ID = k.ID_VEHICLE
JOIN db.part m ON k.ID_Part = m.ID
JOIN db.part_generic_part b ON b.ID_Part = m.ID
JOIN db.generic_part c ON c.ID = b.ID_Generic_part
JOIN db.part_category_generic_part e ON c.ID = e.ID_generic_part
JOIN db.part_category f ON e.ID_category = f.ID
JOIN db.part_category_name g ON f.ID = g.ID_Part_Category and g.ID_Lang =2
JOIN db.lang h ON g.ID_Lang = h.ID
JOIN db.generic_part_name d ON c.ID = d.ID_Generic_Part
Bu son değişiklik ön filtreler l
ile join
başlatmak için kayıtların sadece bir avuç olmadığından emin olmak için.
Belki dizinlerden başlayabilirsiniz. – Nitish
Bu, bir sorunun açıklaması değil, yalnızca birkaç sayı ve bir SQL sorgusudur. Veritabanının şeması nedir (tabloların yapısı - indeksler dahil - ve bunlar arasındaki bağlantılar), tahmini yürütme planı nedir, kayıt sayısı nedir? Bir sorguyu optimize etmek, yalnızca bazı en iyi uygulamaları uygulamakla kalmaz, aynı zamanda üzerinde çalıştığınız verilerin de bilinmesini gerektirir. Verileriniz hakkında hiçbir şey bilmiyoruz. Verilerini biliyor musun? Bize öğretebilir misin? – Pred