更好的性能SQL查询



我正在尝试检查是否有更好的解决这个查询问题:

查找具有相同速度和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 server的SQL Fiddle示例突出显示了下面列出的代码。当然,可以针对其他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]);

我希望这个例子能帮助你找到你需要的解决方案。好运。

最新更新