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
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
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