【发布时间】:2013-06-17 10:11:57
【问题描述】:
考虑一个简单的 3 表数据库 i SQL Server 2012。
表 A
AId
Name
Other1
Other2
表 B
BId
Name
表 A_Bh2>
BId
AId
简单示例查询:
SELECT TOP(20) A.Aid, A.Name, B.Bid, B.Name
FROM A
INNER JOIN A_B ON A.AId = A_B.Aid
INNER JOIN A as AA ON AA.Aid = A_B.Aid
INNER JOIN B ON B.BId = A_B.Bid
WHERE AA.Aid = @aid
AND A.Other1 = @other1
BId
AId
SELECT TOP(20) A.Aid, A.Name, B.Bid, B.Name
FROM A
INNER JOIN A_B ON A.AId = A_B.Aid
INNER JOIN A as AA ON AA.Aid = A_B.Aid
INNER JOIN B ON B.BId = A_B.Bid
WHERE AA.Aid = @aid
AND A.Other1 = @other1
表 A 中有数百万行。
表 B 中有数千行。
表 A_B 中的行数是表 A 的十倍。
Other1 和 Other2 字段可用于过滤查询。
使用 Top(20) 的连接查询可以以每秒 100 个或更多请求的速度完成(规格尚不清楚)。
查询几乎总是使用不同的参数,因此结果缓存不会有太大帮助。
SQL Server 2012 中的哪些功能可以帮助提高上述示例的联接查询性能?
我最初的想法是,由于都是 PK int 连接,因此我无能为力。但是我不知道分区视图是否有帮助。
我在想可能只是增加内存。
【问题讨论】:
-
一个非常模糊的问题。索引/索引视图。
-
如何改进问题?
-
提供实际查询将是一个开始。
-
您的意思是
AND B.Other1 = @other1?此外,您是否只需要任何TOP 20,或者您是否需要基于特定订单的前 20 个?数据多久更改一次? (一个可能的答案涉及覆盖索引,当它发布时我可能会赞成。) -
另外,数据的选择性如何(即 A 中的行与 A 中 Other1 的不同值的比率)?例如,“Male”或“Female”的值不是选择性的,数百万行中的 50 个州不是很选择性,LastName 可能非常选择性。
标签: sql sql-server tsql join sql-server-2012