SQL Server: столбцы индекса, используемые в select, где column1, например str1, или column2, например str2

У меня есть такая таблица:

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]) 

или просто использовать обычный некластеризованный индекс?

Надеюсь, ты сможешь мне помочь, большое спасибо.

Я знаю, что дизайн таблицы неправильный, но данные в ней неверны

Ali Gubran 29.10.2018 00:52

Благодарим за ответ. Вы хотите создать указатель имен и еще один указатель телефонных номеров?

Ali Gubran 29.10.2018 00:53

Вам не нужен индекс для обоих столбцов, поскольку вы не ищете комбинацию имен. Вы ищете ИЛИ, поэтому это подразумевает один индекс для отправителя и другой индекс для получателя.

TomC 29.10.2018 00:54

Вы имеете в виду, что мне нужно создать четыре отдельных индекса? Большое спасибо за ваш ответ.

Ali Gubran 29.10.2018 00:57

Да, я бы создал 4 индекса и позволил оптимизатору запросов решать, что использовать для каждого отправляемого вами запроса. И я бы также использовал стандартный простой оператор создания индекса, так как это даст вам 99% того, что вам нужно.

TomC 29.10.2018 01:27

индекс покрытия действительно имеет смысл, только если вы выбираете несколько столбцов и можете включать их в индекс. Вы должны НЕТ создать покрывающий индекс для столбцов все таблицы - но опять же, вы также должны НЕТ использовать SELECT * в производственной системе в любом случае - выберите только эти столбцы (как список столбцов явный), которые вам действительно нужны в любой момент времени.

marc_s 29.10.2018 06:17

спасибо большое вы мне очень помогли

Ali Gubran 29.10.2018 16:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
47
0

Другие вопросы по теме