TOP yürütme neden SQL yürütme planında


9

Bir süre aradıktan sonra, bu soruyu bir cevap bulma eksikliği için göndermeye ve benzer bir soru / cevap varsa özür dilemeye karar verdim.

Aşağıdaki sorguyu benzer şekilde ayarlanmış iki SQL sunucusunda çalıştırırken, performansı etkileyen farklı yürütme planlarıyla karşılaşırız ve nedenini bulmak için yardıma ihtiyacımız vardır.

Sorgu:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

A sunucusunun yürütme planı Sunucu B

Sunucu B'nin uygulama planı Sunucu B http://s2.postimg.org/z9fjrfv4n/server_B.png

B sunucusunun gerçek yürütme planında TOP fiziksel işlemi olduğunu fark edeceksiniz ve nedenini anlamaya çalışıyoruz. Her iki sorgu da Dizin Aramasında aynı dizini kullanır.

Sunucu A ve sunucu B'nin bazı detayları

Sunucu A ve B'nin ikisi de

Windows Server 2008 R2 Standart Hizmet Paketi 1

24 GB RAM

64 bit işletim sistemi

( SELECT SERVERPROPERTY ('ProductVersion') ) kullanılarak elde edilen SQL Server 2012 Sürümleri

Sunucu A SQL sürümü 11.0.3000.0

Sunucu B SQL sürüm 11.0.5058.0

Ne denedik

  1. Temizleme prosedürü önbellekleri
  2. Dizinleri yeniden oluşturma
  3. Yenileme istatistikleri
  4. SATIR SAYISI 0 rowcount ve go ile

Sunucu B'nin yürütme planında neden TOP var? Bu basit sorgu örneğinde gerçek bir sorun yoktur, ancak daha büyük bir sorguda TOP için maliyet artar ve bir performans artışı görürüz. Bu hata ayıklama ile ilgili herhangi bir yardım çok takdir edilecektir ve size yardımcı olması gerekebilecek ek bilgileri alabiliriz.


TOPOperatör sıfırdan farklı anlaşılacağı SET ROWCOUNTönce bu bağlantı üzerinde idam edildi. Yürüttükten sonra tekrar deneyin SET ROWCOUNT 0;. Ayrıca, gönderdiğiniz SQL sürümleri SQL 2008 R2 değildir. SELECT SERVERPROPERTY('ProductVersion');Gerçek SQL Server sürümünü almak için 2 sunucuda çalıştırın .
Dan Guzman

Sağlanan seçme sorgusunu kullanarak orijinal yayını sql sürümleriyle güncelledim. Sql'nin yüklendiği sunucular, Windows 2008 R2 sunucularıyken, sql sunucuları 2012 iken. Daha önce başka bir üye tarafından önerildiği gibi silindikten sonra, yürütme planında değişiklik yapılmadan ROWCOUNT değerini 0 olarak ayarlamayı denedik. Güncel soruya bakın
Arthur Yegiazaryan

GORowcount satırından sonra koyabilirsiniz . En İyi operatörün özelliklerini de gönderebilir misiniz?
Rob Farley

Rob, GO ve özellikleri
TOP'dan

Yanıtlar:


12

Veritabanı uyumluluğu düzeyinin 2 sunucuda aynı olup olmadığını kontrol edin. Bir SQL Server 2012 örneğinde hızlı bir test yaptım ve uyumluluk seviyesi 100 veya daha düşükse TOP operatörünün tanıtıldığını görüyorum. Aksi yapmak için belirli bir nedeniniz yoksa, bir SQL Server 2012 örneğinde 110 (SQL Server 2012) uyumluluk düzeyini kullanmak en iyisidir.


2

ROWCOUNT için bir değerinizin olduğunu düşünüyorum. Yapmak:

SET ROWCOUNT 0

... kapatmak için.


1
SET ROWCOUNT 0,
TOP'u

1
@Arthur Sizin durumunuzdaki çözüm bu olmasa da , gelecekteki okuyucular için davranışın nedeni olabilir. (Üzgünüm Rob, yayınınızı silme özgürlüğünü aldım çünkü bu aynı belirti için gerçekten sorun olabilir.)
Aaron Bertrand

Aaron, kabul etti ve geri getirdiğin için teşekkürler. Benim için çözüm değil ama diğerleri için olabilir.
Arthur Yegiazaryan
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.