【问题标题】:which example is best at using indexes哪个例子最擅长使用索引
【发布时间】: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


【解决方案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%')

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

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

你也想过全文索引吗?

【讨论】:

    【解决方案2】:

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

    我也没有看到两次加入 table2 会给你带来任何好处。

    当然,虽然我说的可能很有趣,但唯一真正重要的观点是解释计划的观点。

    【讨论】:

    • 我测试了 sql,它们给出了相同的结果。尽管看起来很奇怪,但 2 个连接是有目的的,一个是确保列存在,另一个是确保颜色不存在
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多