2010-11-19 15 views
3

Bir görevler kuyruğu depolayan bir tablom var.SQL Server: Tablodaki bir kaydın yerini (ordinal) alın

Id | Operation | Argument | Status 

Operasyon bir dize
Argüman tek sayı
Durum olduğunu biridir: Queued, Busy, Complete, Failed

Bir bir pozisyon anlamaya ihtiyacımız gibi her görev görünüyor sıradaki öğe, ancak sıraya alınmayan görevleri atlamanız gerekir.

Örnek:

1 A 5 Queued -- 1 
2 A 6 Queued -- 2 
3 B 3 Busy  -- x 
4 B 4 Complete -- x 
5 A 8 Queued -- 3 

beklenen pozisyon x talep anlamsız olduğu anlamına gelir -- konumunu izler.

Soru: Ne tür konumunu hesaplamak için iyi bir yol olurdu? Şu anda
yapmam: İngilizce

SELECT TOP 1 p.Position FROM 
(
    SELECT Id, Status, 
    ROW_NUMBER() over (order by Id) as Position 
    from QueuedJobs where Status = 0 AND Id <= @taskId 
) as p 
order by Position desc 

: haydi,

Endişem performans (benim görevidir) benim görev kadar her görevin pozisyonlarını hesaplayın ve bana son pozisyon vermek 1000 kayıtlarım olduğunu ve çok sayıda isteğim olduğunu (her saniyede 100) söylüyorum.
Veritabanı SQL Server 2008

+0

Sorgu doğru ve OK yapmalı. "endişe performanstır": aslında yavaş mı yoksa yavaş olacağını mı düşünüyorsunuz (IOW, yavaşlığını test ettiniz mi)? – smirkingman

+1

@smirkingman: Erken optimizasyon yapıyorum. –

cevap

1

Bir sorgu yeri gösterecek Should herhangi bir sırada satır. Yoğun olmayan veya tamamlanmamış sıraya alınmış istekleri sipariş etmek için hangi ölçüt kullanılır? FIFO kuyruğu mu? En eski istek en üstte mi? Genellikle bu amaçla datetime değeri kullanılır. Her halükarda, satırları, ön uçtaki sorgu tarafından döndürülen sıraya göre numaralandırırdım ve daha verimli bir şekilde yapılırdı.

+0

Evet, bu bir FIFO. Aşırı değil (Id ile sırala) 'row_number satırlar için döndüğünden emin olun ** sırayla * Id tarafından? Bu parçanın bütün noktası, kullanıcıya görevlerinin sıradayken konumunu göstermektir. Sadece bir satırın pozisyonunu belirlemek için tel üzerinden 1000 kayıt çekmenin iyi bir fikir olduğunu düşünmüyorum - lütfen bunu ayrıntılı olarak açıklayabilir misiniz? –

+0

@ user93422: Kimlikle ilgili herhangi bir anlam atfetmek için sağlam bir tasarım olarak düşünülmez (örneğin, sıradaki sıra, geçici sıra vb.). Bir kimlik (yani satıra benzersiz tanıtıcı olmak için) diğerlerinden satır ayırt etmek için, sadece vardır. Neden sağlam değil? Bir görevi sıraya yerleştirmeniz gerekiyorsa, daha yüksek önceliğe sahip olmanız gerekiyorsa ne olur? Kimlik (PK) değerini değiştiremezsiniz. Kuyruk pozisyonunu belirtmek için muhtemelen bir Float veya DateTime kullanıyorum. – Tim

+0

Yani, satıra bir Float veya DateTime sütunu eklerim. – Tim

0

sonra Durum 0 vasıta "Kuyruğa", ise:

Select Count(*) 
From QueuedJobs 
Where Status = 0 
    and Id <= @taskId 

sen dönebilirsiniz maddesi ile bir emir olmadan :)

+1

Herhangi bir anlam ifade etmek için birincil anahtara güvenmek için kötü bir uygulama. – Tim

+0

Tim. Bu yüklem, posterin sorgusundan; o hayır, İd azalan tarafından emir ve sonuncusu değerini toplar? Zaten ima herhangi anlam katma sanmıyorum. –

+0

@Lynnette: Uygulamanız veya onun, benzersiz bir tanıtıcıdan başka bir şey için kimliğe güvenmek genellikle iyi bir fikir değildir. – Tim