Размер таблицы 32GB Ряд 250MКак улучшить подсчет SQL производительность запросов сервера
Таблица 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]
Я следующий некластерном индекс
merchant_id, order_id
order_date
Логически order_id
, merchant_id
сделать уникальный ключ.
Простой запрос, как показано ниже, занимает почти 30 минут.
select
sum(amount)
from
Orders
where
Order_Date >= getdate() - 7
У меня есть несколько вопросов:
- Является ли PK правильно? В настоящее время он находится в поле ID и не используется ни для чего.
- Будет ли делать
order_id
иmerchant_id
как помощь ПК в исполнении? - Каковы идеальные индексы, которые я должен был иметь на этой таблице?
вы должны создать индекс на 'Order_Date', даже лучше, если он включает' amount' – Lamak
Что такое план запроса? – Paurian
Заметив размер вашей таблицы и количество строк, вы, вероятно, захотите взять то, что предложил SqlZim, и периодически перестраивать индексы на основе количества записи трафика в эту таблицу для уменьшения фрагментации. – Paurian