2010-04-29 6 views
6

Ich habe Ansichten für mein Projekt erstellt jetzt möchte ich sie für die Geschwindigkeit Zweck zu optimieren ... Wie kann ich identifizieren, dass die Ansicht optimiert werden kann? Index nützlich dafür ist ....Wie kann ich Ansichten in SQL Server für Geschwindigkeit optimieren

let's say the following example... 

    SELECT  dbo.vw_WebInventory.skref AS SaleID, dbo.vw_WebInventory.lot_number AS LotNumber, dbo.vw_WebInventory.Description, 
          dbo.vw_WebInventory.Image AS HasImage, dbo.vw_WebInventory.Sold, dbo.vw_WebInventory.Withdrawn, dbo.vw_WebTopBids.TopBid, 
          ISNULL(dbo.vw_WebInventory.Mins_Extend_y, 0) AS BidTimeExtend, dbo.Sale.SaleTypeID, dbo.Sale.ClosingDate, dbo.vw_WebInventory.ExDate, 
          dbo.vw_WebInventory.CurrDate, CASE WHEN vw_WebInventory.ExDate > ISNULL(vw_WebInventory.LotClosingDate, Sale.ClosingDate) 
          THEN 1 ELSE 0 END AS ShowBidMessage 
    FROM   dbo.vw_WebInventory INNER JOIN 
          dbo.Sale ON dbo.vw_WebInventory.skref = dbo.Sale.SaleID LEFT OUTER JOIN 
          dbo.vw_WebTopBids ON dbo.vw_WebInventory.skref = dbo.vw_WebTopBids.CatNumber AND dbo.vw_WebInventory.lot_number = dbo.vw_WebTopBids.LotNumber 

wo vm_webTopBids und vm_WebInventory sind zwei unterschiedliche Ansicht ... ist es möglich, diese Ansicht zu optimieren?

Antwort

18

Nesting Ansichten, die andere Ansichten nennen eine extrem schlechte Technik für die Leistung ist. Da es nicht indiziert werden kann, muss es die gesamte zugrundeliegende Ansicht aufrufen, um den einen Datensatz zu erhalten, den der Top zurückgeben würde. Plus schließlich bekommen Sie genug Schichten und Sie haben die Grenze erreicht, wie viele Tabellen Sie in einer Ansicht aufrufen können (Und wenn view1 Aufrufe2 und Ansicht3 aufruft und beide die gleichen zugrundeliegenden Tabellen aufrufen, verbinden Sie sie doppelt statt einmal, was oft schlecht ist Stoppen Sie, Ansichten von den Ansichten anzurufen, oder Sie haben sehr kurz ein unbrauchbares System

Wir sind ein System wie dieses völlig neu entwerfen, weil die Anwendungsentwickler dies taten und der Multi-Million-Dollarklient uns verlassen wird, wenn Die Leistung verbessert sich und wir können es mit dieser Strategie nicht verbessern, so dass wir jetzt einem kompletten Redesign gegenüberstehen, für das der Kunde nicht bezahlen wird, weil der Fehler unser war. Gehen Sie nicht diesen Weg. Hören Sie jetzt auf sehr, sehr schlecht

+0

Danke für die Hilfe ... – girish

3

Eine Ansicht ist ein Makro, das in die äußere Abfrage erweitert wird. Wenn es sich nicht um eine indizierte Sicht handelt und Sie eine Enterprise Edition haben, wird diese einfach ignoriert.

Wenn Sie also 3 Ansichten beitreten und jede Ansicht 5 Tabellen verwendet, haben Sie eine große Verknüpfung mit 15 Tabellen.

Sie beste Wette ist die Database Tuning Advisor oder ein fehlender Index Skript:

SELECT 
    CONVERT(decimal(28, 1), migs.avg_total_user_cost * migs.avg_user_impact * 
    (migs.user_seeks + migs.user_scans)) AS improvement_measure, 
    'CREATE INDEX missing_index_' + CONVERT(varchar, mig.index_group_handle) + 
    '_' + CONVERT(varchar, mid.index_handle) + ' ON ' + mid.statement + ' (' + 
    ISNULL(mid.equality_columns, '') + 
    CASE WHEN mid.equality_columns IS NOT NULL AND 
       mid.inequality_columns IS NOT NULL THEN ',' 
     ELSE '' 
    END + ISNULL(mid.inequality_columns, '') + ')' + ISNULL(' INCLUDE (' + 
                  mid.included_columns + 
                  ')', '') AS create_index_statement, 
    migs.*, 
    mid.database_id, 
    mid.[object_id], 
    mig.index_group_handle, 
    mid.index_handle 
FROM 
    sys.dm_db_missing_index_groups mig INNER JOIN 
    sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle INNER JOIN 
    sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle 
WHERE 
    CONVERT(decimal(28, 1), migs.avg_total_user_cost * migs.avg_user_impact * 
    (migs.user_seeks + migs.user_scans)) > 10 AND 
    database_id = DB_ID() 
ORDER BY 
    migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + 
                 migs.user_scans) DESC 

bearbeiten, nach Beispiel

Sie sind Ansichten oben auf Ansichten nisten. Es sind keine Optimierungen der Ansicht selbst möglich.

Wie bereits erwähnt, kann dies nicht

+0

Index zur Ansicht hinzufügen ist nützlich zu die Geschwindigkeit optimieren? – girish

+0

@girish: Es ist schwer ohne weitere Informationen zu sagen. Persönlich würde ich das DTA oder das obige Skript verwenden, bevor ich indexierte Ansichten in Betracht ziehe – gbn

+0

Ich habe Beispiel oben erwähnt ... – girish

2

In diesem Fall indiziert wird, kann die Ansicht nicht indiziert werden, weil es eine OUTER JOIN enthält.

Lesen Sie diesen Artikel für Informationen über die Indizierung Ansichten und die (vielen) Beschränkungen für sie: http://technet.microsoft.com/en-us/library/cc917715.aspx

+0

ist dieser Durchschnittswert, obige Ansicht ist perfact wie es ist ... es kann nicht mehr optimiert werden – girish

+0

Hängt davon ab, zu viel zu sagen. Wie an anderer Stelle empfohlen, sollten Sie zuerst die zugrunde liegenden Tabellen optimieren. Wenn das Zugriffsmuster die Ansicht ausführlich verwenden muss, sodass die Verbesserung dieser Ansicht die größten Vorteile bietet, können Sie sie ändern, sodass sie die Einschränkungen der indizierten Sicht erfüllt, und dann entsprechende Indizes hinzufügen. –

Verwandte Themen