使用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%')
答案 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两次给你什么。
当然,虽然我所说的可能是有意义的,唯一真正意义重大的是解释计划。