База Hintsage

Индексы и производительность

Индексы, планы выполнения, статистика и оптимизация SQL-запросов.

Практика

Вопросы: Индексы и производительность

На проверке плана SQL Server запрос с двумя подходящими индексами внезапно начал сканировать таблицу после добавления второго условия. Какой механизм объясняет такой выбор оптимизатора?

CREATE TABLE dbo.Orders (
    OrderID  int NOT NULL PRIMARY KEY,
    ClientID int NOT NULL,
    Status   varchar(20) NOT NULL,
    Amount   decimal(12,2) NOT NULL
);

CREATE INDEX IX_Orders_ClientID ON dbo.Orders (ClientID);
CREATE INDEX IX_Orders_Status   ON dbo.Orders (Status);

SELECT OrderID, Amount
FROM dbo.Orders
WHERE ClientID = 42 OR Status = 'overdue';

Сценарий: нужно выбрать клиентов, у которых есть хотя бы один заказ. Объясните, за счёт какого механизма этот запрос может читать из индекса только первую подходящую запись для каждого клиента.

CREATE INDEX ix_orders_customer_id
    ON orders (customer_id);

SELECT c.id
FROM customers AS c
WHERE EXISTS (
    SELECT 1
    FROM orders AS o
    WHERE o.customer_id = c.id
);
Программирование SQLИндексы и производительностьРазработчик SQL и специалист по производительности баз данных

Разберите, почему предикат по третьему столбцу не сужает диапазон индексного чтения в этом запросе. Укажите, какие строки будут найдены через индекс, а какие условия проверятся после чтения.

CREATE INDEX ix_orders
    ON orders (customer_id, created_at, status);

SELECT order_id, amount
FROM orders
WHERE customer_id = 42
  AND created_at >= DATE '2025-01-01'
  AND status = 'paid';

Показано 21–40 из 50

Восстановление доступа