Использование LIKE в предложении WHERE для GUID приводит к полному сканированию таблицы - PullRequest
1 голос
/ 03 июля 2019

У меня есть таблица, которая выглядит примерно так:

CREATE TABLE Records 
(
    ID UNIQUEIDENTIFIER PRIMARY KEY NONCLUSTERED,
    owner UNIQUEIDENTIFIER,
    value FLOAT,
    timestamp DATETIME
)

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

Таблица в настоящее время содержит около 500 000 000 строк, и мне нужно работать с ней, но она слишком велика, чтобы иметь дело с ней (мне мешает медленное оборудование). Поэтому я решил работать над этим кусками.

Но если я скажу

SELECT ID 
FROM records
WHERE ID LIKE '0000%'

План выполнения показывает, что ВСЯ ТАБЛИЦА сканируется. Я думал, что с индексом будут сканироваться только те строки, которые соответствуют исходному условию, пока SQL не достигнет записей «0001». С% вперед я мог ясно видеть, почему он будет сканировать всю таблицу. Но с% в конце, он не должен сканировать всю таблицу.

Я предполагаю, что это работает по-другому с GUID, а не CHAR или VARCHAR столбцами.

Итак, мой вопрос таков: как я могу искать подраздел GUID, не сканируя всю таблицу?

1 Ответ

2 голосов
/ 03 июля 2019

Из ваших комментариев я вижу фактическую необходимость разбивать строки случайных значений GUID на куски (упорядоченные) в зависимости от диапазона. В этом случае вы можете указать диапазон вместо LIKE вместе с фильтром желаемых начальных / конечных значений в последней группе:

SELECT ID
FROM dbo.records
WHERE
    ID BETWEEN '00000000-0000-0000-0000-000000000000'
    AND '00000000-0000-0000-0000-000FFFFFFFFF';

В этой статье объясняется, как уникальные идентификаторы (GUID) хранятся и упорядочиваются в SQL Server, сравнивая и сортируя последнюю группу сначала, а не слева направо, как вы могли ожидать. Отфильтровав последнюю группу, вы получите sargable выражение и коснетесь только тех строк в указанном диапазоне (при условии, что используется индекс на ID).

...