我可以为您翻译。以下是您需要翻译的内容:
查询1的速度很快,符合我的预期,而查询2非常慢。这两个查询的查询计划看起来非常不同。
我希望查询2的速度能像查询1一样快。我有使用查询2的软件,无法将其更改为查询1。但我可以更改数据库。
一些问题:
这些表在最初填充后不会被修改。只有我一个人在查询它们。它们包含数百万条记录(table_a: 5M, table_b: 4M, table_c: 12M),但只使用1%就可以得到类似的结果。
编辑:我尝试为c_a_id和c_b_id添加外键,但这只会使查询1变慢...
希望有人可以查看查询计划并解释差异。请参考此处的查询计划。
我使用的是Microsoft SQL Server 2008(SP1,x64版)。我有两个查询,它们执行相同的操作(或者我认为是这样),但是它们具有完全不同的查询计划和性能。
查询1:
SELECT c_pk
FROM table_c
WHERE c_b_id IN (SELECT b_id FROM table_b WHERE b_z = 1)
OR c_a_id IN (SELECT a_id FROM table_a WHERE a_z = 1)
查询2:
SELECT c_pk
FROM table_c
LEFT JOIN (SELECT b_id FROM table_b WHERE b_z = 1) AS b ON c_b_id = b_id
LEFT JOIN (SELECT a_id FROM table_a WHERE a_z = 1) AS a ON c_a_id = a_id
WHERE b_id IS NOT NULL
OR a_id IS NOT NULL
查询1的速度很快,符合我的预期,而查询2非常慢。这两个查询的查询计划看起来非常不同。
我希望查询2的速度能像查询1一样快。我有使用查询2的软件,无法将其更改为查询1。但我可以更改数据库。
一些问题:
- 为什么查询计划不同?
- 我能否以某种方式“教”SQL Server查询2等于查询1?
CREATE TABLE table_a (
a_pk int NOT NULL PRIMARY KEY,
a_id int NOT NULL UNIQUE,
a_z int
)
GO
CREATE INDEX IX_table_a_z ON table_a (a_z)
GO
CREATE TABLE table_b (
b_pk int NOT NULL PRIMARY KEY,
b_id int NOT NULL UNIQUE,
b_z int
)
GO
CREATE INDEX IX_table_b_z ON table_b (b_z)
GO
CREATE TABLE table_c (
c_pk int NOT NULL PRIMARY KEY,
c_a_id int,
c_b_id int
)
GO
CREATE INDEX IX_table_c_a_id ON table_c (c_a_id)
GO
CREATE INDEX IX_table_c_b_id ON table_c (c_b_id)
GO
这些表在最初填充后不会被修改。只有我一个人在查询它们。它们包含数百万条记录(table_a: 5M, table_b: 4M, table_c: 12M),但只使用1%就可以得到类似的结果。
编辑:我尝试为c_a_id和c_b_id添加外键,但这只会使查询1变慢...
希望有人可以查看查询计划并解释差异。请参考此处的查询计划。
USE PLAN
提示),以尝试让第二个查询使用第一个查询的计划? - Martin Smitha_z
和b_z
(比如a_y
和b_y
)的列,都存在完全相同的问题。 - Michel de Ruiter