MySQL

2009-01-17 17 views
9

'daki IN ve NOT IN için boyut sınırlaması nedir? IN veya NOT IN koşulunun çok büyük olması durumunda uygulamamda bellek istisnası kalmam. Bunun için sınırlamanın ne olduğunu bilmek isterim.MySQL

cevap

7

Belki de sorgunuzu gerçekleştirmek için başka bir yolla daha iyi olurdu?

Eşleşme değerlerinizi tek sütunlu bir tabloya yüklemenizi ve ardından yeni tabloda tek sütunla sorgulanan sütunu iç içe geçirmenizi öneririm.

Aksine

SELECT a, b, c FROM t1 WHERE d in (d1, d2, d3, d4, ...) 

yapı geçici tablo 1 sütun ile daha "dval" diyoruz ya bir SQL sorgusu veya veritabanı tasarımını yaparken sınırları hakkında sormak zorunda

 
dval 
---- 
d1 
d2 
d3 
SELECT a, b, c FROM t1 
INNER JOIN temptbl ON t1.d = temptbl.dval 
+0

olup olmadığını görmek istedim.Ayrıca aynı çözümü sorun için de planlıyoruz.Ancak, mevcut kurulumlarda yeni bir tablo ekleyerek, bazı ekstra doğrulamalar ve zamana ihtiyaç duyacaktır - geçici bir çözüm, sorguyu bölmeyi düşündük. –

+0

emin olmak için, ama geçici bir tablo geçici olarak tempdb içinde gerçekleştiği için izinlerin çok fazla gerektirmeyeceğini düşünürdüm.Ama kısa vadede, belirlediğiniz şeylerin döngüsel olarak kabul edilebilir bir arg sayısının işe yaramasını bekliyorum. – dkretz

+0

Ya da hepsine hemen ihtiyacınız varsa, birden çok ifadede bir UNION yapabilirsiniz. – dkretz

4

yanlış yaptığınızı gösteren iyi bir göstergedir.

+0

@PhoenixRedeemer evet, benim yaklaşımımın yanlış olduğunu kabul ediyorum. Tüm tasarımın değiştirilmesi biraz zaman alacaktır, bu yüzden bazı geçici çözümlerin geçici olarak –

0

Çok sayıda kimlik listesiyle IN kullanıyorum - bellek sorununun sorguda bulunmadığından şüpheleniyorum. Sonuçları nasıl alıyorsunuz? örneğin

Bu sorgu, canlı bir siteden geçerli:

SELECT DISTINCT c.id, c.name FROM categories c 
LEFT JOIN product_categories pc ON c.id = pc.category_id 
LEFT JOIN products p ON p.id = pc.product_id 
WHERE p.location_id IN (
955,891,901,877,736,918,900,836,846,914,771,773,833, 
893,782,742,860,849,850,812,945,775,784,746,1036,863, 
750,763,871,817,749,838,986,794,867,758,923,804,733, 
949,808,837,741,747,954,939,865,857,787,820,783,760, 
911,745,928,818,887,847,978,852 
) ORDER BY c.name ASC 

kodu Benim ilk geçiş korkunç naif ve tek bir sayfada yaklaşık 10 bu sorguları vardır ve veritabanı yanıp yok .

Elbette, tamamen farklı bir hikaye olacak 100k değerlerin bir listesini çalıştırabilirsiniz.

+1

@tobyhede çözümünü çözebileceğini düşündüm: Bizim durumumuzda bile, sorgu küçük veri kümeleri için iyi çalışıyor. Sayım 4K'nın üzerindeyken bu hafıza problemiyle karşılaştım. –

0

Sınırın ne olduğunu bilmiyorum, ancak bu soruna daha önce de rastlarım. durum çok küçük olduğunda

select * from foo 
    where id in (select distinct foo_id from bar where ...) 
2

sadece hiç (100 satır ya da öylesine altında) İÇİNDE İÇİNDE DEĞİL kullanın: Bu gibi benim sorgu şey yeniden yazmak zorunda kaldı. Bu senaryolarda iyi performans gösterir. Sorgunun büyük olduğu zaman bir DIŞ JOIN kullanıyorum, her bir tuple için "IN" koşuluna bakmak zorunda değil. Tüm satırların gelmesini istediğiniz tabloyu kontrol etmeniz yeterli. birleşim koşulu "IN" için

katılmak koşulu BOŞ

örneğin IS "İÇİNDE DEĞİL" için

IS NOT NULL Ben yığın izleme baktığınızda

/* Get purchase orders that have never been rejected */ 
SELECT po.* 
FROM PurchaseOrder po LEFT OUTER JOIN 
    (/* Get po's that have been rejected */ 
    SELECT po.PurchaesOrderID 
    FROM PurchaseOrder po INNER JOIN 
     PurchaseOrderStatus pos ON po.PurchaseOrderID = pos.PurchaseOrderID 
    WHERE pos.Status = 'REJECTED' 
    ) por ON po.PurchaseOrderID = por.PurchaseOrderID 
WHERE por.PurchaseOrderID IS NULL /* We want NOT IN */ 
0

Ben "m benzer bir sorun olan ama sadece benim IN yan tümcesinde 100 3 haneli kimlikleri geçen., Aslında IN yan tümcesinde virgül ayrı değerleri keser. I don' bir hata olsun, sadece geri dönmek için tüm sonuçları alamadım. Daha önce böyle bir sorunu olan var mı? İlgili ise, ben symfony framework kullanıyorum ... Onun bir propel olup olmadığını kontrol ediyorum sorun ancak sadece sql