Используется неверный индекс SQL - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица с примерно 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 )

У меня есть следующие индексы:

  1. DATE: это не кластеризованный неуникальный индекс в поле CREATEDTS1
  2. кластеризованный индекс на ПК, т.е. ORDER_CODE
  3. 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 для выполнения запросов, я не эксперт в области индексирования и обслуживания БД.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я бы посоветовал взглянуть на статистику, она может быть очень старой, и SQL Server считает, что более эффективно выполнять сканирование, а не использовать индекс.

https://docs.microsoft.com/en-us/sql/relational-databases/statistics/statistics?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-updatestats-transact-sql?view=sql-server-2017

0 голосов
/ 20 сентября 2018

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

SQL Engine решает на самом деле сканировать индекс даты, это неплохо.Он решает этот выбор индекса, рассматривая статистику, собранную о данных таблицы.

Я знаю, что такие проблемы возникают (при неправильном выборе индекса и проблемах с производительностью) при выполнении скомпилированного запроса (план выполнения которого уже определен) с совершенно другим параметромsets.

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

Но вы используете простой SELECT, который не вызовет проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...