У меня есть такая таблица:
CREATE TABLE [dbo].[MoneyTrans]
(
[Trans_id] [nvarchar](25) NULL,
[Amount] [nvarchar](25) NULL,
[Currency] [nvarchar](11) NULL,
[ExchangeRate] [nvarchar](25) NULL,
[CorrAmount] [nvarchar](25) NULL,
[senderName] [nvarchar](255) NULL,
[SenderPhone] [nvarchar](20) NULL,
[RecipientName] [nvarchar](255) NULL,
[RecipientPhone] [nvarchar](20) NULL,
[SenderPr] [nvarchar](5) NULL,
[RecipientPr] [nvarchar](5) NULL,
[Trans_Status] [nvarchar](25) NULL,
[SendDate] [nvarchar](12) NULL,
[Receivdate] [nvarchar](12) NULL,
[Trans_type] [nvarchar](25) NULL
) ON [PRIMARY]
и все запросы выглядят как
SELECT *
FROM MoneyTrans
WHERE [senderName] = 'some one' OR [RecipientName] = 'some one'
или
SELECT *
FROM MoneyTrans
WHERE [SenderPhone] = '123456' OR [RecipientPhone] = '123456'
Какая лучшая стратегия индексации?
Это использовать индексы покрытия как это
CREATE NONCLUSTERED INDEX [ix_MoneyTrans_NamPhon]
ON [dbo].[MoneyTrans] ([senderName] ASC, [RecipientName] ASC)
INCLUDE ([Trans_id], [Amount], [Currency], [ExchangeRate], [CorrAmount],
[SenderPhone], [RecipientPhone], [SenderPr], [RecipientPr],
[Trans_Status], [SendDate], [Receivdate], [Trans_type])
или просто использовать обычный некластеризованный индекс?
Надеюсь, ты сможешь мне помочь, большое спасибо.
Благодарим за ответ. Вы хотите создать указатель имен и еще один указатель телефонных номеров?
Вам не нужен индекс для обоих столбцов, поскольку вы не ищете комбинацию имен. Вы ищете ИЛИ, поэтому это подразумевает один индекс для отправителя и другой индекс для получателя.
Вы имеете в виду, что мне нужно создать четыре отдельных индекса? Большое спасибо за ваш ответ.
Да, я бы создал 4 индекса и позволил оптимизатору запросов решать, что использовать для каждого отправляемого вами запроса. И я бы также использовал стандартный простой оператор создания индекса, так как это даст вам 99% того, что вам нужно.
индекс покрытия действительно имеет смысл, только если вы выбираете несколько столбцов и можете включать их в индекс. Вы должны НЕТ создать покрывающий индекс для столбцов все таблицы - но опять же, вы также должны НЕТ использовать SELECT *
в производственной системе в любом случае - выберите только эти столбцы (как список столбцов явный), которые вам действительно нужны в любой момент времени.
спасибо большое вы мне очень помогли
Я знаю, что дизайн таблицы неправильный, но данные в ней неверны