ISNULL:提高绩效?

时间:2012-02-10 05:41:38

标签: sql indexing isnull

我的查询正在运行 s-l-o-w 。我正在评估我的索引并重建它们,但有人可以告诉我,如果在此查询中使用MyField上的索引吗?

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

我的想法是:

  • 当SQL测试IF,WHERE或CASE中的字段时,它使用可用的索引。
  • MyField将进行测试。
  • 因此,SQL应该能够使用索引来测试MyField。

我的问题是:

  • 是否为空值编制索引?
  • 如果没有IF,WHERE,CASE等,SQL是否使用索引?
  • 如果我使用CASE rathar而不是ISNULL会有所作为吗?

谢谢。

斯科特

3 个答案:

答案 0 :(得分:3)

只是一个FYI,如果你在谈论“Where”条款,答案会有所不同。 如果你这样做:

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 server将使用索引SCAN

此外,如果SQL Server正在使用索引,您应该问自己它在索引上进行的操作,搜索或扫描。

答案 1 :(得分:1)

这是我对你的问题的看法:

<<是否将空值编入索引?

将空值作为其他值编入索引。

<<如果没有IF,WHERE,CASE等,SQL是否使用索引?

实际上,是的,因为有一些方法与IF或CASE陈述具有相同的含义。

<<如果我使用CASE rathar而不是ISNULL会有所作为吗?

它是相同的,只是显示不同。

HTH。

答案 2 :(得分:1)

是的,如果该字段存在索引,则将使用该索引。 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

索引扫描比表扫描快得多,因此创建索引后的查询效果会更好。