Tabellengröße 32GB Row zählen 250MWie SQL Server-Abfrage-Leistung
Tabelle DDL
CREATE TABLE Orders
(
ID [int] IDENTITY(1,1) NOT NULL,
server [varchar](50) NULL,
server_id [int] NOT NULL,
merchant_id [int] NOT NULL,
order_id [int] NOT NULL,
customer_id [int] NOT NULL,
customer_name [varchar](50) NULL,
[amount] [money] NULL,
order_date [smalldatetime] NULL,
ship_date [smalldatetime] NULL,
order_status [varchar](50) NULL,
custom_field_1 [varchar](50) NULL,
custom_field_2 [varchar](50) NULL,
custom_field_3 [varchar](50) NULL,
custom_field_4 [varchar](50) NULL,
created_at [datetime] NULL
CONSTRAINT [PK_Orders]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Ich habe folgende nicht gruppierten Index
merchant_id, order_id
order_date
Logisch, die order_id
, verbessern merchant_id
Mache einen einzigartigen Schlüssel.
Einfache Abfrage wie folgt dauert fast 30 Minuten.
select
sum(amount)
from
Orders
where
Order_Date >= getdate() - 7
Ich habe einige Fragen:
- Ist PK richtig? Derzeit ist es auf ID-Feld und es wird für nichts verwendet.
- Werden
order_id
undmerchant_id
als PK helfen bei der Leistung? - Was sind die idealen Indizes, die ich auf dieser Tabelle haben sollte?
sollten Sie einen Index auf 'Order_Date' erstellen, noch besser, wenn es' Betrag' enthält – Lamak
Was ist der Abfrageplan? – Paurian
Wenn Sie die Größe Ihrer Tabelle und die Anzahl der Zeilen feststellen, sollten Sie wahrscheinlich die von SqlZim vorgeschlagenen Indizes verwenden und Indizes basierend auf dem Umfang des Schreibzugriffs auf diese Tabelle regelmäßig neu erstellen, um die Fragmentierung zu reduzieren. – Paurian