哪个例子最适合使用索引

时间:2011-07-27 22:53:11

标签: sql tsql optimization indexing

使用mssql server 2008.我需要比较性能。直到下周我才能访问查询分析器。这只是一个疯狂的想法,我想知道哪个脚本会表现最好。

我想知道哪些脚本可以在txt上使用索引以及为什么。

2个表共有3个索引,两个表的行数约为1密耳

table1(id int(clustered index), name varchar(10))          
table2(t1_id int(non-clustered index), txt varchar(10)(non-clustered index)) 

SQL1:(2 *加入)

SELECT *
FROM table1 t1 LEFT JOIN
table2 t2 ON t1.id = t2.t1_id
AND NOT t2.txt LIKE 'blue%'
AND NOT t2.txt LIKE 'green%'
INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE t2.id is NULL    

SQL2 :( 1 *加入1 *'或')

SELECT *
FROM table1 t1 LEFT JOIN
table2 t2 ON t1.id = t2.t1_id
AND (t2.txt LIKE 'blue%' or t2.txt LIKE 'green%')

2 个答案:

答案 0 :(得分:1)

在你的第一个sql查询中,你真的不应该使用两个连接,而是使用NOT EXISTS,因为这不会影响临时数据库中抛出的列数。

SELECT *
FROM table1 t1 
  INNER JOIN table2 t3 ON t1.id = t3.t1_id
WHERE NOT EXISTS (
  SELECT TOP 1 1 
  FROM table2 t2 
  WHERE t1.id = t2.t1_id
    AND NOT t2.txt LIKE 'blue%'
    AND NOT t2.txt LIKE 'green%')

它更具可读性并完成相同的工作,但是你应该避免双重否定(“不存在”,“不喜欢”)因为它使可读性更难。

如果第二个查询的性能可用或几乎相同,我建议使用它。

您还想过全文索引吗?

答案 1 :(得分:0)

我不认为你真的在这里比较苹果和苹果;在一个查询中使用Not Like,在另一个查询中使用类似的东西会在行为上产生显着差异。由于不喜欢,优化器不太可能在SQL1上使用for txt列的索引。它通常提供非常不同(或非选择性)的查询。那就是你要求优化器找到txt列中的所有内容,除了那些以蓝色或绿色开头的值。这可能意味着您要求该列中的大多数值。

此外,我没有看到加入table2两次给你什么。

当然,虽然我所说的可能是有意义的,唯一真正意义重大的是解释计划。