11

(SQL Server 2008 R2), bir eşanlamlı bağlantılı sunucuya işaret syn_view1 denilen var remoteserver.remotedb.dbo.view1Performans etkisi LocalServer On

Bu YAVAŞ sorgu çalıştırmak için 20 saniye sürer .

select e.column1, e.column2 
from syn_view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

Bu hızlı sorgu çalıştırmak için 1 saniye alır.

select e.column1, e.column2 
from remoteserver.remotedb.dbo.view1 e 
where e.column3 = 'xxx' 
    and e.column4 = 'yyy' 
order by e.column1 

İki sorgundaki tek fark, gerçekten eşanlamlılığın varlığıdır. Açıkçası, eşanlamlı sorgunun performansı üzerinde bir etkisi vardır.

YAVAŞ sorgu için yürütme planı:

Plan    Cost % Subtree cost 
4 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000     0.00 3.3521 
    3 Filter 
    I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1 
    Cost: 0.008800    0.26 3.3521 
     2 Compute Scalar 
     I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
     Cost: 0.000000   0.00 3.3433 
      1 Remote Query 
      I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1 
      Cost: 3.343333  99.74 3.3433 

Ve FAST sorgu için:

Plan   Cost % Subtree cost 
3 SELECT 
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0 
Cost: 0.000000    0.00 0.1974 
    2 Compute Scalar 
    I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
    Cost: 0.000000   0.00 0.1974 
     1 Remote Query 
     I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1 
     Cost: 0.197447  100.00 0.1974 

Benim anlayış YAVAŞ sorguda, sunucu tüm verileri getirir olmasıdır Uzak sunucu, daha sonra filtreyi (dizinsiz olsa da) uygular; FAST sorgusunda sunucu, filtrelenmiş verileri uzak sunucudan alır, böylece uzak dizinleri kullanır.

Hızlıyken eşanlamı kullanmanın bir yolu var mı? Belki bağlantılı sunucunun kurulumu? yerel veritabanı sunucusu

Yardımın için teşekkürler!

+0

Uzak sunucuda bir yordam oluşturulmasını önerin. –

+0

@AaronBertrand, ne değişecek? Dizinler kullanılacak mı?Bağlı sunucumun tam olarak nitelenmiş ismini saklı yordamımın içinde belirtmekten kaçınabiliyor muyuz? –

+0

Evet ve evet. Ve görünüm yerine saklı yordam adı için eşanlamlı oluşturabilirsiniz. –

cevap

1

dba.stacexchange.com adresindeki this post için kabul edilen yanıt, bağlantılı sunucudaki sınırlı erişim hakları nedeniyle, performans sunucularının sorguları, sunucu istatistikleri görünürlüğünü yerel sunucuya kısıtlayarak, bağlı sunucular üzerinden sorgularda görülebilir. Bu, sorgu planını ve dolayısıyla performansı etkileyebilir.

alıntı:

Ve bu farklı sonuçlar var nedeni budur. Sysadmin I olarak çalıştırıldığında, sipariş kimliği> 20000 olan satır bulunmadığını belirten tam dağıtım istatistikleri alındı ​​ve tahmin bir satırdı. ( 'un iyileştiricinin hiç bir zaman istatistiklerden sıfır satır almayı hatırlamadığını unutmayın.) Ancak düz kullanıcı olarak çalışan , DBCC SHOW_STATISTICS bir izin hatasıyla başarısız oldu. Bu hata yayılmadı, ancak bunun yerine eniyileyici, istatistik olmadığını ve varsayılan varsayımlarını kullandığını kabul etti. Kardinalite bilgisini aldığından beri, uzaktaki tablonun 830 satır olduğunu ve 249 satırlık tahmini olduğunu öğrendiler. Ben yerel sunucuda geçici tabloya verileri sipariş vermeden ekecekti

+0

Bağlantılı bir sunucudaki bir sorgunun performansının birçok sorundan kaynaklandığını, ancak eşanlamlı sorgu ile bağlantılı tablo arasındaki farkın neden olduğunu görebilirim; Eş anlamlı olarak eşanlamlı olarak farklı bir erişim hakkı olabileceğini önermediğiniz sürece, eşanlamlı aynı bağlantıyı verir. – PhillipH

+1

@PhillipH: Açıkça * bir şey * eşanlamlı için farklıdır; Bu açıklama gözlenen performans bozulmasına neden olmak için yeterli görünmektedir, bu yüzden uzak sunucu üzerinde kontrol etmeye değer. –

2

. Sonra sipariş ile temp tablosundan seçerdim. Sipariş neredeyse her zaman katildir.