2016-03-31 4 views
1

Ich habe ein Skript erstellt, um nach Kandidatentabellen für die Partitionierung zu suchen, und mit den Indexinformationen möchte ich die ideale Spalte für die Partitionierung finden. Ich ignoriere (vorerst), welche Spalten am häufigsten abgefragt werden. Ich habe unten eine grundlegende Abfrage, die Spalten priorisiert, die Teil von gruppierten Indizes sind, und dann, ob sie ein Primärschlüssel sind.SQL Server: bevorzugte Indexmerkmale/Qualitäten für Partition Spalte

Also mit dieser zugegebenermaßen groben Ansatz, die die besten Kriterien/Qualitäten einer indizierten Spalte sind, die ich auch einbeziehen kann, um festzustellen, ob sie gute Partitionierungssäulen sind? Wenn Sie auch diese Attribute begründen können.

Wenn Sie mit dem Ansatz insgesamt nicht einverstanden sind, ist das in Ordnung, bitte kommentieren Sie, aber denken Sie daran, dass dies eine vorläufige Analyse des Partitionierungsergebnisses ist, bevor Sie sich mit Best Practices befassen.

;WITH cte AS 
(
    SELECT 
     t.name AS TableName, ind.name AS IndexName, 
     ind.type_desc AS TypeDesc, col.name AS ColumnName, 
     st.name AS DataType, ind.is_unique AS IsUnique, 
     ind.is_primary_key AS IsPrimaryKey, 
     ind.is_unique_constraint AS IsUniqueCons, 
     ROW_NUMBER() OVER (PARTITION BY t.name 
          ORDER BY 
           CASE WHEN ind.type_desc = 'CLUSTERED' THEN 1 ELSE 2 END, 
           CASE WHEN ind.is_primary_key = 1 THEN 1 ELSE 2 END) AS row_num 
    FROM 
     sys.indexes ind 
    INNER JOIN 
     sys.index_columns ic ON ind.object_id = ic.object_id 
          AND ind.index_id = ic.index_id 
    INNER JOIN 
     sys.columns col ON ic.object_id = col.object_id 
         AND ic.column_id = col.column_id 
    INNER JOIN 
     sys.tables t ON ind.object_id = t.object_id 
    INNER JOIN 
     sys.types st ON col.system_type_id = st.system_type_id 
    WHERE 
     t.is_ms_shipped = 0 
     AND st.name IN ('datetime', 'smalldatetime') 
) 
SELECT * 
FROM cte 
WHERE row_num = 1 

Antwort

0

Sie können keine guten Partitionierungsspalten aus dem Schema allein erkennen. Es hängt hauptsächlich von der Arbeitsbelastung ab.

Partitionierung ist nicht, damit Abfragen schneller gehen. Es kann das, aber es ist oft schlechter als normale Indizierung. In den meisten Fällen macht die Partitionierung Abfragen langsamer. Die Abfrage muss dem Partitionierungsschema entsprechen.

Partitionierung ist in der Lage, Partitionen in konstanter Zeit zu löschen und hinzuzufügen und verschiedene Daten auf verschiedenen Speicher (unterschiedlichen Durchsatz und anderen Backup-Zeitplan) zu legen.

Ich denke, Ihr Ansatz kann nie funktionieren. Sie müssen das wegwerfen.

+0

Der Ansatz ist in meinem Fall ziemlich gut. Wie ich bereits sagte, versuche ich im Moment nur Metriken in einem Partitionierungsszenario zu erhalten (Links/Rechts-Summen usw.). Die Clustered-Indizes enthalten im Allgemeinen die Datumsfelder, durch die wir partitionieren würden, wenn wir uns für eine Partitionierung entscheiden dieser Tisch. Aber bevor ich etwas mache, möchte ich Metriken mit verschiedenen Daten, einschließlich oder Ausschluss bestimmter Tabellen nach Datensatzanzahl, Gesamtgröße usw., daher funktioniert dieser Ansatz bisher ziemlich gut. Und die meisten Abfragen sollten sich an die Indizes halten. Diese Tische sind so groß, ich wäre überrascht, wenn sie nicht wären. – John

+0

Sie haben gefragt, nach welchen Kriterien gesucht werden soll. Meine Antwort ist: Es gibt keine. Sie werden feststellen, dass dies aus den angegebenen Gründen zutrifft. 'Ermitteln, ob es sich um gute Partitionierungsspalten handelt' Unmöglich, nur Schemainformationen zu verwenden. Deine Vorgehensweise ist zum Scheitern verurteilt. Diese Antwort löst daher die Frage, die Sie gestellt haben. – usr