Bir SQL sorgu veya bir döngü içinde birçok?

7 Cevap php

Ben bir tablo birkaç satır çekin ve iki şekilde bunları işlemek gerekir:

  • Bir tuşun üzerinde toplanmış
  • satır-by-satır, aynı anahtar sıralanması

Tablo kabaca şöyle:

table (
   key,
   string_data,
   numeric_data
)

Bu yüzden ben yazıyorum işlevine iki yaklaşım bakıyorum.

İlk bir sorgu ile toplu veri çekme, ve sonra (şu PHP gibi pseudocode) satır-by-satır her veri kümesi için bir döngü içinde tekrar sorgulamak istiyorum:

$rows = query(
        "SELECT key,SUM(numeric_data)
         FROM table
         GROUP BY key"
    );

foreach ($rows as $row) {
    <process aggregate data in $row>

    $key = $row['key'];
    $row_by_row_data = handle_individual_rows($key);
}

function handle_individual_rows($key)
{
    $rows = query(
            "SELECT string_data
             FROM table WHERE key=?",
            $key
        );

    <process $rows one row at a time>

    return $processed_data;
}

Ya da, ben büyük bir sorgu yapmak ve kodu tüm çalışma yapalım ki:

$rows = query(
    "SELECT key, string_data, numeric_data
     FROM table"
);

foreach ($rows as $row) {
    <process rows individually and calculate aggregates as I go>
}

Performans bu uygulamada pratik bir endişe değil; Ben sadece mantıklı ve sürdürülebilir kod yazmak için arıyorum.

Ben daha modüler çünkü ilk seçenek gibi - ve yapısal basit görünüyor çünkü ben ikinci seçeneği gibi. Bir seçenek diğerinden daha iyi olduğunu ya da gerçekten stil meselesi?

7 Cevap

Kesin bir SQL sorgu.

Bu irade

  • Eğer veritabanına gidiş-dönüş, çok kaydetmek
  • GROUP BY yöntemleri daha verimli kullanmak için izin

Lütfen agrega veritabanı tarafından eşit derecede iyi yapılabilir yana, aynı zamanda mainainability için daha iyi olacaktır: Eğer tek bir yerde tüm resultset mantığı var.

Burada her satır döndürür ve hesaplayan bir sorgu bir örnektir SUM:

SELECT  string_data, numeric_data, SUM(numeric_data) OVER (PARTITION BY key)
FROM    table

Bu büyük olasılıkla s, PHP olarak pek uygulanabilir olan 'farklı key s' SUM hesaplamak için paralel erişimini kullanacağını unutmayın.

Aynı sorgu MySQL:

SELECT  key, string_data, numeric_data,
        (
        SELECT  SUM(numeric_data)
        FROM    table ti
        WHERE   ti.key = to.key
        ) AS key_sum
FROM    table to

Performansı bir endişe değil, ben ikinci ile gitmek istiyorum. Ufak biraz dostça görünüyor.

Performansı bir endişe olsaydı, cevabım olacak "don't think, profile". :)

İkinci sorunun cevabı çok daha net, mantıklı ve sürdürülebilir gereğidir. Genellikle daha iyi olduğu, daha az kod ile aynı şeyi söylüyorsun.

Ve ben performans bir endişe olmadığını söyledi biliyorum, ama neden veriler size gereken daha fazla getirebilir?

Ben burada örnek belirli olamaz, ama ben SQL sorgusunda kendisini toplama and diğer işleme doğru yapmak için bir şans olup olmadığını bilmek istiyorum. Bu durumda, PHP kodu vs SQL kodunda bu işleme ifade göreceli konfor düzeyine göre "daha rahat" değerlendirmek gerekiyor.

SQL sorgusunda kendisi her şeyi ifade engelleyecek her satırda yapmanız gereken ek işlemler hakkında bir şey var mı?

Ben bir döngü bir sorgu başına yineleme yaparak daha iyi bir seçimdir nerede tüm birçok durum bulacaksınız sanmıyorum. Aslında, muhtemelen never bunu başparmak iyi bir kural olduğunu söyleyebilirim.

Diğer bir deyişle, daha az yuvarlak daha iyi, veritabanına gezileri.

Veri ve gerçek tablolar bağlı olarak, SQL toplama işi yapalım ve bir sorgu ile ihtiyacınız olan tüm satırları seçmek mümkün olabilir.

Arka arkaya tarafından bir toplanma ve bir satır: Eğer iki farklı processings söylüyorlar çünkü ben, kendi sorusunu yanıtladı ettik nasılsa düşünüyorum.

  • doğru gelmiyor tek bir sorguda hem karıştırma, okunabilir ve sürdürülebilir her şeyi tutmak istiyorsanız çok okunabilir olmayacak şekilde, sorgu iki farklı ihtiyaçlarına cevap verecek

  • perf bir sorun olmasa bile, yerine kod bunu yapmanın DB sunucu üzerinde toplama yapmak için daha hızlı

  • tek bir sorgu ile, sonucu idare edecek kod aynı zamanda satır ve bilgisayar toplamaları taşıma, iki processings karıştırmak, böylece zaman içinde bu kod kafa karıştırıcı ve arabası almak eğiliminde olacaktır

  • Aynı kod, zamanla gelişecek örneğin satır-by-satır karmaşık almak ve toplama kısmı veya çevresinde veya başka bir şekilde hata oluşturabilir

  • Gelecekte bu iki tedaviler bölmek gerekir, eğer o anda, bir başkası yıllar önce yazmıştır kodunu çözmek için zor olacak ...

Kenara performans hususlar, sürdürülebilirlik ve okunabilirliği açısından iki sorguları kullanmanızı tavsiye ederim.

Ama performans faktörü anda bir sorun olmayabilir akılda tutmak, ancak db hacmi büyür veya uzun vadede ihmal edilebilir bir faktör ne olursa olsun asla bir kez o zaman olabilir ...

Perf bir sorun olmasa bile, zihninizi. Bir müzisyen uygulamalar, her hareketi müzisyenin beceri geliştirmek amacıyla zaman. Bir geliştirici olarak, sizin beceri geliştirmek için her prosedür geliştirmelidir. veri özensiz ve çirkin tekrarlanan döngüler olsa. SQL sorguları zariftir. Eğer daha şık kodu veya daha fazla özensiz kod geliştirmek istiyor musunuz?