ISNULL: повышение производительности?

Мой запрос выполняется s-l-o-w. Я оцениваю свои индексы и перестраиваю их, но может ли кто-нибудь сказать мне, будет ли в этом запросе использоваться индекс MyField?

SELECT  ISNULL(MyField , 'No Data') 
FROM    MyTable

Я думаю:

  • Когда SQL проверяет поля в IF, WHERE или CASE, он использует доступные индексы.
  • MyField будет протестирован.
  • Следовательно, SQL должен иметь возможность использовать индекс для проверки MyField.

Мои вопросы:

  • Нулевые значения индексируются?
  • Использует ли SQL индексы, если нет IF, WHERE, CASE и т. д.?
  • Будет ли иметь значение, если я буду использовать CASE вместо ISNULL?

Спасибо.

Скотт


person Scott    schedule 10.02.2012    source источник
comment
Вы дали нам очень мало информации о вашей конкретной ситуации. Мы не знаем структуру или размер MyTable. И запрос, который вы сейчас показываете, возвращает все строки и, следовательно, не будет использовать индекс. Если вы предоставите нам больше информации, возможно, мы сможем объяснить, почему это s-l-o-w.   -  person John Pick    schedule 10.02.2012


Ответы (3)


Да, индекс будет использоваться, если он существует в этом поле. ISNULL не имеет значения.

Вы можете проверить это самостоятельно следующим образом (включите план выполнения запроса, чтобы увидеть, какой индекс он использует:

BEGIN TRAN

--Create test table and add some dummy data
CREATE TABLE MyTable(MyField VARCHAR(20))
INSERT INTO MyTable SELECT 'test1'
INSERT INTO MyTable SELECT 'test2'
INSERT INTO MyTable SELECT NULL
INSERT INTO MyTable SELECT 'test3'

-- Run query with ISNULL (note that a Table Scan is done)
SELECT  ISNULL(MyField , 'No Data') FROM MyTable
-- Run query without ISNULL (note that a Table Scan is done)
SELECT  MyField FROM MyTable

-- Now create an index and compare the execution plans for the same queries
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField) 

-- Run query with ISNULL (note that an Index Scan is done)
SELECT  ISNULL(MyField , 'No Data') FROM MyTable
-- Run query without ISNULL (note that an Index Scan is done)
SELECT  MyField FROM MyTable

ROLLBACK

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

person Steven Schroeder    schedule 10.02.2012
comment
Блестящий. Таким образом, SQL по-прежнему читает все значения, но если поле проиндексировано, то SQL не должен считывать их из таблицы, вместо этого он может считывать их из индекса --- верно? - person Scott; 10.02.2012
comment
Да, некластеризованный индекс подобен микроверсии таблицы, содержащей только те данные, которые индексируются (в данном случае — один столбец). Таким образом, запрос просеивает меньше данных. - person Steven Schroeder; 10.02.2012

просто к вашему сведению, ответ был бы другим, если бы вы говорили о пункте «Где». Если вы сделаете:

SELECT  ISNULL(MyField , 'No Data') 
FROM    MyTable
WHERE MyField ='myvalue'

SQL Server выполнит поиск по индексу (это то, к чему вы всегда должны стремиться), но если вы это сделаете:

SELECT  ISNULL(MyField , 'No Data') 
FROM    MyTable
WHERE isNull(myColumn, 'no data') is not null  --I know this check doesn't make sense, but it's just for the sake of illustration. Imagine another function instead of isNull like substring or getdate...

sql-сервер будет использовать индекс SCAN

Кроме того, использует ли SQL Server индекс или нет, вы должны спросить себя, какую операцию он выполняет с индексом, поиск или сканирование.

person Diego    schedule 10.02.2012

Вот моя идея по поводу ваших вопросов:

‹‹ Индексируются ли нулевые значения?

Нулевые значения индексируются, как и другие значения.

‹‹ Использует ли SQL индексы, если нет IF, WHERE, CASE и т. д.?

На самом деле да, потому что есть метод, который имеет то же значение, что и оператор IF или CASE.

‹‹ Будет ли иметь значение, если я буду использовать CASE вместо ISNULL?

Это то же самое, просто другое отображение.

ХТН.

person Thinhbk    schedule 10.02.2012