SentryOne Plan Explorer UDF'lerde okumaları sayar mı?


9

Ben böyle bir sorgu var:

select dbo.fn_complexFunction(t.id)
from mytable t

Gelen SQL Nöbetçi Planı Explorer , ben fark ben Sorgu Planı UDF dahil olmak Tahmini Planı al çalıştırmak zorunda.

'Gerçek Planı Al' çalıştırıldığında, mantıksal okumaların ve diğer metriklerin UDF'de gerçekleşen işlemleri içerdiği görülmemektedir. Bu gibi durumlarda, Profiler'ı kullanmanın tek çözümü nedir?


1
Bildiğim kadarıyla, sorgu motorunun kendisi UDF'lerde okumaları etkilemez. Bu, UDF'lerin önlenmesi için iyi bir nedendir, optimize ediciye opaktır.
JNK

Yanıtlar:


11

Burada yaşadığımız en büyük problemler:

  1. @JNK'nin dediği gibi, SQL Server bir UDF kullanımını gizler ve yine de onlarla korkunç şeyler yapar (her zaman bir satır tahmin eder gibi). SSMS'de gerçek bir plan oluşturduğunuzda, onun da kullanımını görmezsiniz. Yalnızca SQL Server'ın sağladığı bir plan hakkında bilgi sağlayabildiği için Plan Gezgini aynı sınırlamalara tabidir.
  2. Kod, gerçek bir plan oluştururken çalışma zamanı metrikleri için farklı kaynaklara dayanır. Ne yazık ki plan XML işlev çağrıları içermez ve SQL Server, herhangi bir işlev kullanılırken bir işlevin neden olduğu G / Ç'yi göstermez SET STATISTICS IO ON;( Table I/Osekme bu şekilde doldurulur).

AdventureWorks2012'ye karşı aşağıdaki görünümü ve işlevi göz önünde bulundurun. Bu, başlık tablosundan rastgele bir satır verilen ayrıntı tablosundan rastgele bir satır döndürmeye yönelik aptalca bir girişimdir - çoğunlukla her seferinde mümkün olduğunca çok G / Ç oluşturduğumuzdan emin olmak için.

CREATE VIEW dbo.myview 
WITH SCHEMABINDING
AS
  SELECT TOP (100000) rowguid, SalesOrderID, n = NEWID() 
    FROM Sales.SalesOrderDetail ORDER BY NEWID();
GO

CREATE FUNCTION dbo.whatever(@SalesOrderID INT)
RETURNS UNIQUEIDENTIFIER
WITH SCHEMABINDING
AS
BEGIN
  RETURN 
  (
    SELECT TOP (1) rowguid FROM dbo.myview 
     WHERE SalesOrderID = @SalesOrderID ORDER BY n
  );
END
GO

Management Studio Ne Söylüyor (Ve Vermiyor)

SSMS'de aşağıdaki sorguyu alın:

SET STATISTICS IO ON;

  SELECT TOP (5) SalesOrderID, dbo.whatever(SalesOrderID) 
    FROM Sales.SalesOrderHeader ORDER BY NEWID();

SET STATISTICS IO OFF;

Bir plan tahmin zaman, sorgu için bir plan almak ve bir tek fonksiyon için planı (umut edebileceğiniz gibi, değil 5):

Management Studio'da tahmini plan

Sorgu gerçekten yürütülmediği için hiçbir G / Ç verisi alamazsınız. Şimdi gerçek bir plan oluşturun. Sonuçlar tablosunda beklediğiniz 5 satırı alırsınız , aşağıdaki plan (UDF'den kesinlikle gözle görülür bir şekilde bahsedilmez, XML dışında bunu sorgu metninin bir parçası olarak ve Skaler Operatörün bir parçası olarak bulabilirsiniz):

Management Studio'daki gerçek plan

Ve aşağıdaki STATISTICS IOçıktı ( bu tablodan okumak zorundaSales.SalesOrderDetail olduğunu bilmemize rağmen, kesinlikle hiçbir şeyden söz etmiyor ):

'SalesOrderHeader' tablosu. Tarama sayısı 1, mantıksal okumalar 57, fiziksel okumalar 0, ileri okumalar 0, lob mantıksal okumalar 0, lob fiziksel okumalar 0, lob okuma öncesi okumalar 0.

Plan Gezgini Size Ne Söylüyor

PE aynı sorgu için tahmini bir plan oluşturduğunda, SSMS ile aynı şeyi bilir. Ancak, işleri biraz daha sezgisel bir şekilde gösterir. Örneğin, dış sorgu için tahmini plan, işlevin çıktısının sorgu çıktısıyla nasıl birleştirildiğini gösterir ve her iki tabloda da G / Ç'nin olduğu hemen anlaşılır :

Plan Gezgini'nde tahmini plan

Ayrıca işlevin planını tek başına gösterir , ki bu sadece bütünlük için dahil ediyorum:

Plan Explorer'da UDF için tahmini plan

Şimdi, binlerce kat daha yararlı olan gerçek bir plana bakalım. Buradaki dezavantaj, yine, sadece SQL Server'ın göstermeye karar verdiği bilgilere sahiptir, bu nedenle sadece SQL Server'ın sağladığı grafik plan diyagramlarını gösterebilir. Bu, birinin size yararlı bir şey göstermemeye karar verdiği bir durum değildir; sağlanan XML planına dayanarak bu konuda hiçbir şey bilmiyor. Bu durumda, tıpkı SSMS'de olduğu gibi , sadece dış sorgunun planını görebilirsiniz ve sanki fonksiyon hiç çağrılmıyormuş gibi :

Plan Explorer'da fiili plan

Tablo G / Ç sekmesi de, yineSTATISTICS IO de işlev çağrısında gerçekleştirilen etkinliklerden herhangi birini göz ardı eden çıktısına dayanır :

Plan Explorer'da gerçek plan için Tablo G / Ç

Ancak, PE tüm çağrı yığınını sizin için alır. İnsanların ara sıra "Pffft, çağrı yığınına ne zaman ihtiyacım olacak?" Diye sorduğunu duydum. Aslında, her bir işlev çağrısı için harcanan zamanı, CPU'yu ve okuma sayısını (ve TVF'ler için üretilen satır sayısını) ayırabilirsiniz :

Plan Gezgini'nde UDF çağrılarını gösteren çağrı yığını

Ne yazık ki, G / Ç'nin hangi tablo (lar) dan geldiğini (SQL Server bu bilgiyi vermediği için) ve UDF adıyla etiketlenmediğini ilişkilendirme olanağınız yoktur. (çünkü işlev çağrısının kendisini değil, geçici bir ifade olarak yakalanır). Ama Management Studio'nun görmediğini görmenizi sağlayan şey, UDF'nizin ne bir köpek olduğu. Hala bazı noktalara katılmalısın, ama daha az nokta var ve birbirlerine daha yakınlar.

Profiler Hakkında

Son olarak, komut dosyası yazacağınız ve daha sonra herhangi bir UI aracının kapsamının dışında çalıştıracağınız bir sunucu tarafı izi ayarlamak sürece Profiler'den uzak durmanızı şiddetle tavsiye ederim. Profiler'ı bir üretim sistemine karşı kullanmak, neredeyse hiç çözemeyeceğinden daha fazla soruna yol açacaktır . Bu bilgileri almak istiyorsanız, lütfen sunucu tarafı izleme veya genişletilmiş etkinlikler kullanın ve çok akıllıca filtrelediğinizden emin olun. Profil oluşturucusuz bile, bir izleme sunucunuzu etkileyebilir ve genişletilmiş etkinlikler aracılığıyla showplans almak dünyadaki en verimli şey değildir .


Ah, Pro sürümünde çağrı yığını hakkında bir şey bilmiyordum. Tam da aradığım şey buydu. Var olduğunu bilmek güzel. Bu noktada, fiyatı haklı çıkarabileceğimi düşünmüyorum, ancak gelecekteki durumlar için bunu aklımda tutacağım. SQL Server'ın İSTATİSTİK G / Ç'de UDF'ler için G / Ç bilgileri sağlamamasının bir nedeni var mı? Bu tür temel bilgileri atlamak yanıltıcıdır.
Gabe

3
@Gabe sebebini bilmiyorum, üzgünüm. Belki danışmanlığı daha kârlı hale getirmek için?
Aaron Bertrand

1
@gabe şimdi plan explorer tamamen ücretsiz .. tüm pro + nihai baskı özelliklerine sahip denilen nöbetçi - hepsi ücretsiz.
Kin Shah
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.