好吧,我是一个相当缺乏经验的SQL开发人员,我想知道哪些陈述更快。
它只是一个" m-to-n "使用store
关系表的store_admin
和store_admin_store
之间的关系。在那些SQL语句中,我想得到store
是" 分配"的所有store_admin
。至。有没有附加索引。仅索引ID和相应的外键。
是这个吗:
--
-- STATEMENT 1
--
SELECT
store.name
FROM
(SELECT
store_admin_store.store_id
FROM
store_admin_store
WHERE
store_admin_store.store_admin_id = 1) as stores, store
WHERE
stores.store_id = store.id
或那一个:
--
-- STATEMENT 2
--
SELECT
store.name
FROM store
JOIN store_admin_store ON store_admin_store.store_admin_id = 1
WHERE store.id = store_admin_store.store_id
或者根本没有区别?
我问的原因是因为如果我省略第二个陈述的WHERE
条款:
--
-- STATEMENT 2 (without WHERE clause)
--
SELECT
store.name
FROM store
JOIN store_admin_store ON store_admin_store.store_admin_id = 1
我可以看到store.id
与store_admin_store.store_id
交叉,导致一个非常大的表,我不确定每个语句中到底发生了什么。
或者甚至有更快的方法来做到这一点?
答案 0 :(得分:0)
使用SQL Server Management Studio,您可以收集有关查询的一些统计信息,以确定哪个更快。
这些选项可在以下网址找到:
使用客户端统计信息,您可以运行多个试验并查看总执行时间和查询细分(单位为毫秒)。我有几个表,我运行你的查询(显然修改为从我的表中获取数据)。我还匹配了ID,而不是简单地搜索ID为1的位置。这两个表一起包含大约200万条记录,总执行时间如下:
声明1: 192.00 ms
声明2: 193.60 ms
修改语句1以使用连接而不是逗号。
修改后的声明1: 189.60 ms
正如你所看到的,从两张拥有数百万条记录的牌桌上抓取时间并没有太大变化。如果你的数据库比我小,我真的不担心哪一个更快"因为它可能比任何事情更浪费时间。无论如何,查询执行时间会有几毫秒的变化。
希望这是有用的,并且获得稍微不同的结果并不令人惊讶但是我会说使用连接几乎总是更快,并且只从表中选择所需的数据并将它们转换为在连接中使用。这将消除收集和保存任何不需要的数据。如果我的理解是错误的,我相信有人会在评论中这么说! :^)
示例:强>
select table1.ID from (select ID from tableA) as table1 join (select ID from tableB) as table2 on table1.ID = table2.ID