Ben büyük bir veri grubunu almak için kullanıyorum bir sorgu optimize bazı önerilerde bulmaya çalışıyorum.
Ben üzerinde çalışıyorum orijinal kod kullanıcıların büyük bir set üzerinden döngüye, ve bunların her biri için bir tarih aralığı hesaplandı. Daha sonra bu tarih aralığını almak ve onlar yanıtladı ve kaç o tarih aralığında doğru var kaç soru sorgulamak istiyorum. Bu sonuçlar yukarı sayımı, ve ihtiyacımız olan son tallies olduğunu edildi.
Aksine tek tek her kullanıcı sorgulama yerine, komut artık sadece onlara geçerli olacaktır tarih aralığını (diğer tüm yönlerini hesaplar her kullanıcı aracılığıyla döngüsü: Ben zaten (birkaç dakika alıyor çünkü) bu hızlandırmak için ne yaptık bu sorgu) her kullanıcı için aynıdır. Bu veri bir 3d dizi [startDate] [endDate] [userid], ve tüm kullanıcılar o operasyomo yapmak için inşa edilmiş tek bir sorgu toplanır. İşte çıkışını alır sorgu bir örnek:
SELECT COUNT(uapl.id) AS numAnswered,
SUM(CASE WHEN (a.correct OR q.survey OR uapl.answersId IS NULL) THEN 1 ELSE 0 END) AS numCorrect
FROM usersAnswersProgramsLink uapl
JOIN questions q ON uapl.questionsId=q.id
LEFT JOIN answers a ON uapl.answersId=a.id
WHERE
programsId=123
AND
(
(
CAST(timestamp AS date) >= '2009-09-01'
AND CAST(timestamp AS date) <= '2009-09-21'
AND usercontextid in('123','234','345','465','567')
)
OR
(
CAST(timestamp AS date) >= '2009-09-10'
AND CAST(timestamp AS date) <= '2009-09-21'
AND usercontextid in('321','432','543')
)
OR
(
CAST(timestamp AS date) >= '2009-09-16'
AND CAST(timestamp AS date) <= '2009-09-21'
AND usercontextid in('987','876')
)
)
Bu kod hızlandırmak oldukça iyi çalışır. Ben bu çalıştırmak testlerin çoğu, şimdi sürece% 20 ve% 10 arasında sürer. Ama benim kötü durumda olan, sadece% 50, ve ben o geliştirmek istiyorum.
Ben kullanıcı kimliği (on-thousandish) karşılaştırmak için büyük bir dizi var o zaman en kötü durum olur. Sorun şimdi dışarı bu sorguları çıkardı algoritması üzerinde yapılması gereken optimize artık olmasıdır. Şimdi milisaniye gider. Bu uzun zaman alır, bu sorgu var.
Yani benim bilmece. Ben daha hızlandırmak istiyorum. Herhangi bir öneriniz hoş olurdu. Burada ilgili olan bilgi parçalarının bir çift:
1) There is a 1 to many relationship between the date ranges and the users. none of those user id's will show up in multiple date ranges. 2) The end result we're looking for is just those tallies, but the date ranges need to be calculated on a per-user basis, hence the array of id's per date range.
Ben ~ ~ kudreti daha hızlı bir sandık için tarih aralığı için bir sütun ve kullanıcı id adlı bir sütun ile bir geçici tablo olacağını yapmak düşündüğüm bir şey. Sonra bu tabloya JOIN kullanarak yerine sorguda kendisini bu numaraları koyarak bu sorguyu yeniden yazın. Bunun işe yarayacağını biliyor mu?
Herhangi bir öneriniz için teşekkür ederiz!