Ich versuche herauszufinden, welche Felder für die Clustered-Index meiner Fakten Tabellen (die alle eine ähnliche Struktur haben) zu verwenden. Ich werde Factsales als BeispielClustered Index auf Faktentabelle mit vielen Standorten
CREATE TABLE dbo.FactSales
(
DateOfSaleKey int NOT NULL, -- PK,
--ProfitCentreKey int NOT NULL, -- (maybe add this?)
RevenueCentreKey int NOT NULL, -- PK
TransactionHeaderNumber int NOT NULL, -- PK
TransactionDetailNumber int NOT NULL, -- PK
TableNumber int NOT NULL,
TransactionOrCheckNumber int NOT NULL,
TerminalKey int NOT NULL,
CashierKey int NOT NULL,
TimeSlotKey int NOT NULL,
TransactionTypeKey int NOT NULL,
TransactionDetailTypeKey int NOT NULL,
MediaKey int NOT NULL,
SaleItemKey int NOT NULL,
SaleTypeKey int NOT NULL,
SalesQuantity int NOT NULL,
SalesGross smallmoney NOT NULL,
SalesNet decimal (16, 8) NOT NULL,
VAT decimal (16, 8) NOT NULL,
...
)
Loading verwenden: Die Faktentabellen geladen werden durch Profit (ProfitCentreKey), die ein einziges Restaurant, und von Tag (DateOfSaleKey). Wir haben keine ProfitCentreKey in der Tabelle, weil wir die genauere RevenueCentreKey haben, die ein Abschnitt innerhalb eines Restaurants ist.
So sieht jede Last wie folgt aus:
DELETE s
FROM FactSales s
INNER JOIN DimOrganisation o ON s.RevenueCentreKey = o.RevenueCentreKey
WHERE s.DateOfSaleKey = 20160105 AND o.ProfitCentreKey = 385
INSERT INTO FactSales (DateOfSaleKey, RevenueCentreKey, ...)
SELECT DateOfSaleKey, RevenueCentreKey, ... FROM #SalesForProfitCentreAndDateOfSale
Was ich überlege ...
(1) Clustered-Index: DateOfSaleKey. Dies könnte die INSERT erleichtern, aber ich bin mir nicht sicher über die DELETE.
(2) Geclusterter Index: DateOfSaleKey, ProfitCentreKey. Ich müsste ProfitCentreKey der Tabelle hinzufügen. Es könnte die einfacher, macht DELETE aber würde es das Tabellenfragment als ProfitCentreKey nicht sequentiell laden
Und die DELETE wären simplier:
DELETE FROM FactSales WHERE DateOfSaleKey = 20160105 AND ProfitCentreKey = 385
Jede Beratung wirklich helfen würde. Danke