SQL 索引之外的服务器调整建议
SQL Server tuning recommendations beyond indexing
我正在处理一个 SQL 查询,它需要许多自连接 table 来创建聚合函数,如下所示。
SELECT
tab1.foo,
tab1.bar,
tab1.baz,
tab1.bam/tab2.bam as bam_ratio,
RANK() OVER (PARTITION BY tab1.bar, tab1.baz ORDER BY tab1.foo DESC) RANK
FROM
(SELECT
foo,
bar,
baz,
bam
FROM
OPENDATASOURCE(server).dbo.table1
WHERE
qux = 1 AND quux = 'A' AND corge = 2) tab1
JOIN
(SELECT
foo,
bar,
baz,
bam
FROM
OPENDATASOURCE(server).dbo.table1
WHERE
qux = 1 AND quux = 'B' AND corge = 2) tab2 ON tab1.bar = tab2.bar
AND tab1.baz = tab2.baz
AND tab1.foo = tab2.foo
问题是这些 table 中的每一个都有几列,但有数千万条记录。这造成了一个独特的情况,其中索引不能充分提高性能(上面的查询使用 table1 中的每一行)。
我注意到这些 table 调用往往只会在一个或两个次要方面发生变化,例如示例中的 quux 并且它们没有主键需要使用比必要更多的行对索引没有帮助,似乎是多余的。
有没有比简单索引更进一步提高性能的方法?我愿意更改基础 tables 并创建孤立的 tables.
您可以改进的一个性能问题是跨服务器加入。 OPENROWSET、链接服务器等都会发生这种情况。
最简单的缓解方法是将数据从远程数据源提取到临时表或临时表中。这会将数据本地存储在 tempdb 中。然后,加入临时表。 SQL 服务器会自动为这些表创建统计信息,这将大大提高您的性能,而且数据是本地的,但如果您愿意,您也可以添加索引来加快连接速度。
我正在处理一个 SQL 查询,它需要许多自连接 table 来创建聚合函数,如下所示。
SELECT
tab1.foo,
tab1.bar,
tab1.baz,
tab1.bam/tab2.bam as bam_ratio,
RANK() OVER (PARTITION BY tab1.bar, tab1.baz ORDER BY tab1.foo DESC) RANK
FROM
(SELECT
foo,
bar,
baz,
bam
FROM
OPENDATASOURCE(server).dbo.table1
WHERE
qux = 1 AND quux = 'A' AND corge = 2) tab1
JOIN
(SELECT
foo,
bar,
baz,
bam
FROM
OPENDATASOURCE(server).dbo.table1
WHERE
qux = 1 AND quux = 'B' AND corge = 2) tab2 ON tab1.bar = tab2.bar
AND tab1.baz = tab2.baz
AND tab1.foo = tab2.foo
问题是这些 table 中的每一个都有几列,但有数千万条记录。这造成了一个独特的情况,其中索引不能充分提高性能(上面的查询使用 table1 中的每一行)。
我注意到这些 table 调用往往只会在一个或两个次要方面发生变化,例如示例中的 quux 并且它们没有主键需要使用比必要更多的行对索引没有帮助,似乎是多余的。
有没有比简单索引更进一步提高性能的方法?我愿意更改基础 tables 并创建孤立的 tables.
您可以改进的一个性能问题是跨服务器加入。 OPENROWSET、链接服务器等都会发生这种情况。
最简单的缓解方法是将数据从远程数据源提取到临时表或临时表中。这会将数据本地存储在 tempdb 中。然后,加入临时表。 SQL 服务器会自动为这些表创建统计信息,这将大大提高您的性能,而且数据是本地的,但如果您愿意,您也可以添加索引来加快连接速度。