【发布时间】:2011-07-27 22:53:11
【问题描述】:
使用 mssql server 2008。我需要比较性能。直到下周我才能访问查询分析器。这只是一个疯狂的想法,我想知道哪个脚本的性能最好。
我想知道哪些脚本可以使用 txt 上的索引以及为什么。
这两个表共有 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*joins)
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*join 1*'or')
SELECT *
FROM table1 t1 LEFT JOIN
table2 t2 ON t1.id = t2.t1_id
AND (t2.txt LIKE 'blue%' or t2.txt LIKE 'green%')
【问题讨论】:
-
AFAI 记得 Stack Exchange Data Explorer 有一个“查看执行计划”选项。尽管 SQL2 没有否定,但在我看来,SQL2 乍一看更可笑。
-
顺便说一句,请提供正确的 DDL(您错过了
t1_id上的任何信息,并且未能准确解释您拥有哪些索引 - t2 上是否有 2 个单独的索引或只有 1 个复合索引。如果 2那么哪些是集群的,哪些是非集群的?) -
@MartinSmith 更正了 t1_id,总共 3 个索引,我添加了哪些索引是集群的而不是集群的。唯一有趣的索引是 txt 上的索引
-
You can see the plans on SEDE here。勾选“包括执行计划”框。
t1_id,txt上的复合索引将避免对连接内部的扫描。 -
@MartinSmith 我有很多方法可以从这两个表中检索数据。我无法创建索引来匹配每个查询。我的大多数查询都没有使用 txt,如果我更改该索引,这些搜索将没有索引。感谢您的链接。我不知道你可以在临时表上创建索引
标签: sql tsql optimization indexing