2011-07-27 15 views
1

使用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

AFAI记得Stack Exchange Data Explorer有一个“View Execution Plan”选项。对我来说,SQL2看起来更可怕,尽管它没有任何否定。 –

+0

顺便说一句,请提供正确的DDL(你错过了有关't1_id'的任何信息,并且未能准确解释你有什么索引 - 是否有2个单独的索引在t2或只有1个组合索引。 ) –

+0

@MartinSmith纠正了t1_id,总共3个索引,我加了哪些索引是聚集的,而不是。唯一有趣的索引是txt上的索引 –

回答

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%') 

它更可读的,不完全一样的工作,但是你应该避免双重否定(“NOT EXISTS”,“NOT LIKE”),因为它使可读性更难。

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

你有没有想过一个全文索引呢?

0

我不认为你真的在这里比较苹果和苹果;在另一个查询中使用“不一样”以及在另一个查询中使用“不相似”将会在行为上产生显着差异。由于不喜欢,优化器不太可能使用SQL1上的txt列的索引。它通常会给出一个非独特(或非选择性)的查询。那就是你实际上要求优化器找到txt列中的所有东西,除了那些以蓝色或绿色开始的值。这很可能意味着您要求提供该专栏中的大部分值。

另外我没有看到加入table2两次给你任何东西。

当然,虽然我说的话可能是有趣的唯一真正的意见是重要的解释计划。

+0

我测试了这个sql,它们给出了相同的结果。尽管看起来很奇怪,但2个连接有一个目的,一个是确保列存在,另一个是确保颜色不存在 –