更好的性能SQL查询

时间:2014-06-12 15:43:26

标签: sql performance sql-optimization

我正在尝试检查此查询问题是否有更好的解决方案:

找到具有相同速度和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

1 个答案:

答案 0 :(得分:0)

改进的索引和正确的密钥(当然,还有一个编写良好的查询)是实现更好性能的最佳方法。看看以下内容。

[以下基于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的所有计算机(成对,无论是一对还是多对): / p>

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]);

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