SQL Server Join / nerede işlem sırası


18

Yavaş SQL sorgusu okuduktan sonra , nasıl optimize edeceğinizden emin değilim , sorguların genel performansını düşünmemi sağladı . Şüphesiz, sorgularımızı biraz daha hızlı hale getirmek için ilk tablonun sonuçlarının (diğer tablolar birleştirildiğinde) katılmadan önce (bu soru için iç birleşimler) olabildiğince küçük olması gerekir.

Örnek:

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2

Şundan daha iyi / daha hızlı olun:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val

Benim teorim aşağıdaki gibidir (bu doğru uygulama olmayabilir, okuduğum bir SQL Server 2008 iç kitabından hatırlamaya çalışıyorum (MSFT Press)):

  1. Sorgu işlemcisi önce sol tabloyu alır (tablo1)
  2. İkinci tabloya (tablo2) katılır ve gerekli satırları filtrelemeden önce (varsa) kartezyen bir ürün oluşturur
  3. Sonra SEELCT deyimiyle en son WHERE, ORDER BY, GROUP BY, HAVING yan tümcelerini gerçekleştirir.

Yukarıdaki # 1 ifadesinde tablo daha küçükse, SQL motorunun kartezyen ürünleri oluştururken daha az işi vardır. Daha sonra where deyimine ulaştığınızda, bellekten filtrelemek için daha düşük bir sonuç kümeniz olur.

Şu ana kadar gerçek dışı olabilirim. Dediğim gibi, bu bir teori.

Senin düşüncelerin?

Not : Sadece bu soruyu düşündüm ve henüz kendi testlerimi yapma şansım olmadı.

Not 2 : MySql vb. Uygulaması hakkında hiçbir şey bilmediğim için SQL Server olarak etiketlendi . Lütfen yine de cevaplamaktan / yorum yapmaktan çekinmeyin

Yanıtlar:


15

Sorgunun mantıksal işlenmesi MSDN'de (3. taraflar değil, Microsoft SQL Server ekibi tarafından yazılmıştır)

1. FROM
2. ON
3. JOIN
4. WHERE
5. GROUP BY
6. WITH CUBE or WITH ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

Türetilmiş bir tablo bunu izler, sonra dış sorgu tekrar yapar vb.

Bu mantıklı : gerçek değil . SQL Server gerçekten nasıl yaparsa yapsın, bu anlambilim mektuba saygı duyar . "Gerçek", Sorgu İyileştiricisi (QO) tarafından belirlenir ve bahsettiğiniz ara Kartuş ürününden kaçınırsınız.

SQL'in beyan edici olduğunu belirtmek gerekir: prosedürel / zorunlu bir programlama (Java, .net) için "nasıl" nasıl "değil" diyorsunuz. Bu nedenle, "bu ondan önce olur" demek çoğu durumda yanlıştır (örneğin kısa devre varsayımı veya L-R-WHERE sırası)

Yukarıdaki durumunuzda, QO basit bir sorgu olduğu için nasıl yapılandırılmış olursa olsun aynı planı oluşturacaktır.

Bununla birlikte, QO maliyete dayalıdır ve karmaşık bir sorgu için ideal planı oluşturmak 2 hafta sürebilir. Yani aslında "yeterince iyi" değil.

Bu nedenle ilk durumunuz, en iyi duruma getiricinin daha iyi bir plan bulmasına yardımcı olabilir, çünkü mantıksal işleme sırası 2 sorgu için farklıdır. Ama olmayabilir.

Bu hileyi raporlama sorgularında 60x hız performans artışı elde etmek için SQL Server 2000'de kullandım. QO, sürümü sürüme geliştirdikçe, bu şeyleri çalışma konusunda daha iyi olur.

Ve bahsettiğiniz kitap: üzerinde bazı anlaşmazlıklar var
SO'ya ve sonraki bağlantılara bakın: /programming//q/3270338/27535


6

Bir SQL sorgusu yordamsal değildir, birleştirme işleçlerinin yukarıdan aşağıya işlenmesi yoktur. Örnek sorgularınızdaki tabloların sıralamasının, mantıksal olarak eşdeğer oldukları ve tam olarak aynı planı üretecekleri için yürütme planı üzerinde hiçbir etkisi yoktur .

Bu sorgu için bir plan oluştururken , sorgu optimize edicisinin dikkate alabileceği iki seçeneği değerlendiriyorsunuz . Plan seçimini etkileyen temel faktör, ilgili tabloların istatistikleri ve herhangi bir aday plandaki operatör seçimleriyle ilişkili maliyetlerdir .

Örneğiniz gibi çok basit bir iki masa birleşimi, yüzlerce farklı yürütme planından herhangi birinden memnun olabilir. Optimize edici, bu planların maliyetlerini karşılaştırarak sorgunuzu yanıtlamanın en iyi yolu olacağına karar verir.

Bazen yanlış olur ve gelişmiş dizin oluşturma, istatistikleri güncel tutma ve ipuçlarını uygulama yoluyla daha iyi seçimler yapmasına yardımcı olabilirsiniz. Çok nadir durumlarda, KUVVET SİPARİŞİ ipucunu kullanarak yürütme sırasını zorlamak isteyebilirsiniz, ancak bu çok az kullanılmalıdır. Bir somunu kırmak için bir çekiç, optimize edici genellikle daha iyi bilgi besleyerek daha iyi planlar üretmeye teşvik edilebilir.

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.