ISNULL: повышение производительности? - PullRequest
2 голосов
/ 10 февраля 2012

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

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

Я думаю:

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

Мои вопросы:

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

Спасибо.

Scott

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

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

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

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

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 сервер будет использоватьindex SCAN

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

1 голос
/ 10 февраля 2012

Да, индекс будет использоваться, если он существует в этом поле.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

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

1 голос
/ 10 февраля 2012

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

<< Индексируются ли нулевые значения? </p>

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

<< Есть ли в SQLиспользовать индексы, если нет IF, WHERE, CASE и т. д.? </p>

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

<< Будет ли это делатьразница, если я использовал CASE rathar, а не ISNULL? </p>

Это то же самое, только по-разному.

HTH.

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