Ich habe einen Tisch mit Transaktionen für einen Bus (Boarding Riders). Angesichts der Routen-ID und des Datums muss ich in einer anderen Tabelle nachschlagen, welchen Servicetyp es an diesem Tag ausgeführt hat. Die Busfahrpläne ändern sich höchstens alle 6 Monate, wobei die meisten Jahre unverändert bleiben.
Derzeit ist die Zeitplantabelle wie folgt definiert:
CREATE TABLE [dbo].[Routes](
[ID] [int] NOT NULL,
[RouteID] [int] NOT NULL,
[Type] [varchar](50) NOT NULL,
[StartDate] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
));
Ein Beispiel könnte folgendermaßen aussehen:
ID RouteID Type StartDate
-- ------- ------------ ----------
1 301 Standard 2015-01-01
2 301 Discontinued 2016-06-01
3 302 Standard 2015-01-01
4 302 ParaTrans 2017-01-01
Wenn ich also eine Transaktion vom 20.04.2015 für RouteID 301 habe , möchte ich "Standard" zurückerhalten. Wenn die Transaktion jedoch vom 20.01.2018 stammt , sollte sie "Eingestellt" zurückgeben. Bei Transaktionen vor dem 01.01.2015 sollte NULL (oder "" oder etwas anderes als ein Ergebnis zurückgegeben werden, das möglicherweise mit einer gültigen Antwort in Konflikt steht, z. B. "Standard", "Paratrans" oder "Discontinued").
Grundsätzlich stellt die Tabelle , dass Route 301 war eine Standardroute zwischen 2015.01.01 und 2016.05.31 (und damit alle Transaktionen während dieser Zeit sollte als „Standard“ eingestuft werden), dann wurde es aufgegebene auf 2016-06- 01 (über die aktuellen Tag, implizit , da es keine spätere Planänderung ist angegeben), während 302 eine Standardroute war 2015.01.01 durch 2016.12.31 , dann ein ParaTrans (it) Route nach.
Route Type Start End
----- ---- ----- ---
301
Standard 2015-01-01 2016-05-31
Discontinued 2016-06-01 Present
302
Standard 2015-01-01 2016-12-31
ParaTrans 2017-01-01 Present
Derzeit sieht die Abfrage dazu folgendermaßen aus:
SELECT
TRANSIT_DAY,
ROUTE_ID,
(SELECT TOP (1) Type FROM Routes
WHERE (RouteID = dbo.DAILY_SALES_DETAIL.ROUTE_ID)
AND (StartDate <= dbo.DAILY_SALES_DETAIL.TRANSIT_DAY)
ORDER BY StartDate DESC) AS NCTD_MODE
FROM dbo.DAILY_SALES_DETAIL
Fragen
Was ich wissen möchte, ist: Ist dies die effektivste Kombination aus (a) Struktur der RoutesTabelle und (b) Abfrage, um dieses Ergebnis zu erzielen? Mit anderen Worten, könnte eine effizientere Abfrage mit der vorhandenen Struktur verwendet werden? Könnte eine Änderung der Routentabelle eine effizientere Abfrage ermöglichen?
Überlegungen
Die Transaktionstabelle wird täglich von einem Lieferanten importiert. Daher ist das Ändern des Schemas dieser Tabelle nicht trivial und wird bevorzugt vermieden. Noch wichtiger ist, dass diese Suche in einer Reihe von Tabellen und Datenbanken unter Verwendung von Transaktionen oder anderen busbezogenen Daten verwendet wird, die von mehreren Anbietern bezogen wurden. Dies ist nur ein einziges Beispiel. Wir haben einen Anbieter (und damit eine Datenbank) für Geldtransaktionen, einen anderen für die Anzahl der Fahrer und einen weiteren für die Leistung usw., wobei die Routennummer und das Datum die einzige zuverlässig konsistente Kennung für alle sind.
Die Routentabelle hat einen Index von (RouteID, StartDate). Derzeit befinden sich 56 Zeilen in der Routentabelle und 26 Millionen Zeilen in der Transaktionstabelle. Die Routentabelle besteht aus 45 Routen. Derzeit gibt es keine Routen mit mehr als 2 Zeilen oder einer Änderung. Es gibt keine Begrenzung für die Anzahl der Änderungen, die eine einzelne Route haben könnte, aber ich füge diese Statistik hinzu, um zu zeigen, dass die Anzahl auf absehbare Zeit wahrscheinlich gering bleiben wird.
Ich kann alle erforderlichen Indizes hinzufügen, um eine vorgeschlagene Abfrage zu optimieren. Bei der Frage geht es mehr darum, die beste Strategie zu finden, vorausgesetzt, alle angemessenen Optimierungen werden an den betrachteten Strategien vorgenommen, als darum, die beste Optimierung einer bestimmten Strategie zu finden.
db <> hier fummeln





