У меня есть таблица с примерно 10M строк, в которой у меня есть 4 индекса:
CREATE TABLE ALLTRX2 (
ORDER_CODE nvarchar(20) NOT NULL PRIMARY KEY,
CREATEDTS datetime NULL,
trx_date nvarchar(11) NULL,
trx_month nvarchar(8) NULL,
payment_provider nvarchar(255) NULL,
payment_method nvarchar(100) NULL,
general_payment_method nvarchar(100) NULL,
amount_initial NUMERIC(30,2) NULL,
eur_amount NUMERIC(30,2) NULL,
currency nvarchar(20) NULL,
backend_status nvarchar(255) NULL,
general_status nvarchar(50) NULL,
EMAIL nvarchar(255) NULL,
CUSTOMER_ID nvarchar(50) NULL,
P_UID nvarchar(255) NULL,
P_NAME nvarchar(255) NULL,
P_USER nvarchar(255) NULL,
COUNTRYCODE nvarchar(50) NULL,
COUNTRY nvarchar(50) NULL,
CUSTOMER_GROUP nvarchar(50) NULL,
DELIVERYADDRESS nvarchar(255) NULL,
BILLINGADDRESS nvarchar(255) NULL,
CREATEDTS1 DATE NULL )
У меня есть следующие индексы:
- DATE: это не кластеризованный неуникальный индекс в поле CREATEDTS1
- кластеризованный индекс на ПК, т.е. ORDER_CODE
- EMAIL: на EMAIL
Все работает хорошо, но когда я запускаю простой запрос, такой как:
SELECT * FROM ALLTRX2
WHERE CREATEDTS1>'2018-08-02'
Он выполняет сканирование таблицы вместо поиска по индексу
Но когда я делаю
SELECT * FROM ALLTRX2
WHERE CREATEDTS1='2018-08-02'
Он выполняет поиск по индексу.
Это абсолютно бессмысленно для меня!
Я мог бы использовать WITH (INDEX (дата)), но я хочу найти решение иначе.
Определения INDEX следующие:
CREATE INDEX email
on ALLTRX2 (EMAIL)
CREATE INDEX date
on ALLTRX2 (CREATEDTS1)
Я довольно новичок в управлении БД, и хотя я часто использую SSMS для выполнения запросов, я не эксперт в области индексирования и обслуживания БД.
Любая помощь будет принята с благодарностью!