性能更好的 SQL 查询
Posted
技术标签:
【中文标题】性能更好的 SQL 查询【英文标题】:Better performance SQL query 【发布时间】:2014-06-12 15:43:25 【问题描述】:我正在尝试检查这个查询问题是否有更好的解决方案:
找到具有相同速度和 RAM 的 PC 型号对。
因此,每个结果对仅显示一次,即 (i, j) 而不是 (j, i)。 结果集:编号较高的模型、编号较低的模型、速度和 RAM。
我想出了:
select max(model), min(model), speed, ram
from PC
group by speed, ram
having count(model) = 2 and max(model) <> min(model)
得到
speed ram
--------------------------------
1260 1232 500 32
1233 1232 500 64
1233 1121 750 128
PC 表如下所示:
model speed ram
------------------------
1232 500 64
1121 750 128
1233 500 64
1121 600 128
1121 600 128
1233 750 128
1232 500 32
1232 450 64
1232 450 32
1260 500 32
1233 900 128
1233 800 128
【问题讨论】:
定义“更好”:更具可读性?少sql?性能更高?什么? 完成,在性能方面 如果你的 SQL 系统有explain
关键字,它有时可以显示你可以改进的地方,或者至少它可能(或可能不)使用的索引。
如果您希望我们帮助优化查询,您需要向我们展示表和索引定义,以及每个表的行数。也许您的表格定义不佳。也许索引没有正确创建。也许您认为您在该列上没有索引。没有看到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何执行EXPLAIN
或获取执行计划,请将结果也放入问题中。如果您没有索引,请尽快访问use-the-index-luke.com。
Table PC 有以下列(代码、型号、速度、内存、高清、光盘、价格),其中型号是主键。我更感兴趣的是通过更好的 sql 查询本身获得更好的性能,例如更少的 io 命中和低 cpu 使用率等。
【参考方案1】:
改进的索引和正确的键(当然还有编写良好的查询)是实现更好性能的最佳方式。请看以下内容。
[以下基于 SQL Server 的SQL Fiddle example 突出显示下面列出的代码。当然,这个示例可以针对其他 DBMS 进行修改。]
// Your table's columns were not detailed, so this example uses [int] datatype
CREATE TABLE [PCs] (
[id] int NOT NULL IDENTITY(1,1) PRIMARY KEY,
[model] int NOT NULL,
[speed] int NOT NULL,
[ram] int NOT NULL
);
INSERT INTO [PCs]
VALUES (1232, 500, 64),
(1121, 750, 128),
(1233, 500, 64),
(1121, 600, 128),
(1121, 600, 128),
(1233, 750, 128),
(1232, 500, 32),
(1232, 450, 64),
(1232, 450, 32),
(1260, 500, 32),
(1233, 900, 128),
(1233, 800, 128);
根据生成的PCs
表,以下SQL 语句返回共享speed
和ram
的所有计算机(成对,无论是单对还是多对):
SELECT [PCs].*
FROM [PCs]
INNER JOIN (
SELECT [speed], [ram]
FROM [PCs]
GROUP BY [speed], [ram]
HAVING COUNT(*) % 2 = 0
) AS dt ON ([PCs].[speed] = dt.[speed]
AND [PCs].[ram] = dt.[ram])
ORDER BY [PCs].[speed] ASC,
[PCs].[ram] ASC,
[PCs].[model] ASC;
为了提高性能,我建议在 speed
和 ram
列上添加一个 INDEX
CREATE NONCLUSTERED INDEX [IX_PCs_speed_ram] ON [PCs] ([speed], [ram]);
我希望这个示例可以帮助您找到所需的解决方案。祝你好运。
【讨论】:
以上是关于性能更好的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行