性能更好的 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 语句返回共享speedram 的所有计算机(成对,无论是单对还是多对):

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;

为了提高性能,我建议在 speedram 列上添加一个 INDEX

CREATE NONCLUSTERED INDEX [IX_PCs_speed_ram] ON [PCs] ([speed], [ram]);

我希望这个示例可以帮助您找到所需的解决方案。祝你好运。

【讨论】:

以上是关于性能更好的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何编写此查询以在 Sql Server 中获得更好的性能?删除子字符串行

SQL - 找到性能更好的第 n 个最高金额

嵌套 CASE 的 T-SQL 替代方案以获得更好的性能?

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?

SQL 查询执行时间过长。需要提高查询的性能

如何使用 SQLab Xpert Tuning 来调整 SQL 以获得更好的性能?