2014-06-12 6 views
0

이 쿼리 질문에 더 나은 솔루션이 있는지 확인하려고합니다 :더 나은 성능 SQL 쿼리

동일한 속도와 RAM을 가진 PC 모델 쌍을 찾습니다. 결과적으로, 각각의 결과 쌍은 단지 1 회, 즉 (i, j)는 표시되지만 (j, i)는 표시되지 않는다. 결과 집합 : 숫자가 더 큰 모델, 숫자가 더 낮은 모델, 속도 및 RAM.

 speed ram 
--------------------------------  
1260 1232 500 32 
1233 1232 500 64 
1233 1121 750 128 

PC의 테이블은 다음과 같습니다 얻을

select max(model), min(model), speed, ram 
from PC 
group by speed, ram 
having count(model) = 2 and max(model) <> min(model) 

과 :

내가 함께했다

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 
+2

"better": 더 읽기 쉽도록 정의 하시겠습니까? 적은 SQL? 더 공연? 뭐? –

+0

done, performance 측면에서 – leo

+0

SQL 시스템에'explain' 키워드가있는 경우 가끔 향상시킬 수있는 항목이나 적어도 사용할 수있는 색인 (또는 사용하지 않을 수도 있음)을 표시 할 수 있습니다. – Majenko

답변

0

개선 인덱싱 및 적절한 키 (뿐만 아니라, 현재 물론, 잘 쓰여진 쿼리)가 더 나은 성능을 얻는 가장 좋은 방법입니다. 다음을보십시오.

[다음 SQL Server 기반 SQL Fiddle example은 아래 나열된 코드를 강조 표시합니다. 이 샘플은 물론, 다른 DBMS를 수정할 수 있습니다.]

생성 PCs 테이블을 기반으로
// 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); 

는, 다음 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 컬럼에 인덱스를 추가하는 제안

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

이 예제를 통해 필요한 솔루션을 얻을 수 있기를 바랍니다. 행운을 빕니다.