2012-06-27 140 views
1
SELECT * 
FROM 
    tbl_transaction t 
LEFT JOIN 
    tbl_transaction_hsbc ht 
ON 
    t.transactionid = ht.transactionid 

transactionid这两个表是主键所以为什么没有索引寻找?聚簇索引扫描而不是聚簇索引寻求左连接

+0

主键并不一定暗示集群索引.. –

+2

@Pabloker集群或不是真的没关系。在这两种情况下如何寻求工作? –

+1

如果您不得不在纽约大都会地区电话簿中大声朗读每个人的姓氏,名字和电话号码,您是否希望通过网页按顺序(扫描)来完成,还是您希望按电话号码进行订购使用只有电话和姓氏的反向电话号码索引,按字母顺序查找每个姓氏,并查找与当前电话号码(书签查找/查找)关联的名字? – ErikE

回答

6

也许这是SELECT * ...也许是因为你要返回整个表格,没有什么好处。你想要做什么,逐步寻找每一行?扫描效率更高。

我意识到你可能已经阅读或被告知不惜一切代价避免扫描。我认为这需要更多的背景。有时候扫描是正确的答案,也是最有效的数据路径。如果查询速度慢,也许您可​​以展示实际的执行计划,我们可以帮助查明问题。但答案不会强制这个查询使用seek。

+1

准确地说,完整的扫描比较经常地搜索(范围),因为扫描不需要查找+1 – Andomar

+0

以下是我的想法....对于tbl_transaction中的每一行,它都会扫描tbl_transaction_hsbc上的索引要加入的行。我在想,如果它是一个搜索,那么每次查找要加入的行时都不需要扫描整个索引 - 它可以更快地查找它。我想我不明白这些机制...... –

+1

如果它执行扫描,它根本不需要做任何查找 - 数据已经在它正在扫描的页面上。它不会扫描每一行的整个索引,它会扫描整个索引ONCE。 –

0

没有索引查找,因为您没有where子句。 索引查找意味着您检查索引中的一系列值。 由于您没有where子句,除了扫描所有索引值外别无选择。 所以名称“索引扫描”。

这不是一个表扫描,它是一个索引扫描。如果您在其中一个表中没有此列的索引,则您将有第二个表的表扫描+第一个表的索引扫描。