Oracle을 사용 중이며 모든 인덱스가 삽입됩니다.카운트 쿼리의 SQL 성능
내 테이블은 다음과 같습니다 :
CREATE TABLE users
(user_id number(10) NOT NULL,
name varchar2(50) NOT NULL,
type_id number(10) NOT NULL,
is_deleted varchar2(1) NOT NULL
);
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (1,'John',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (2,'Mark',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (3,'Leon',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (4,'David',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (5,'Mike',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (6,'Sam',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (100,'Nike',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (200,'Adidas',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (300,'Reebook',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (400,'Puma',0,'F');
INSERT INTO users (user_id, name, type_id, is_deleted) VALUES (500,'Kinetix',0,'F');
CREATE TABLE ROLE
(role_id number(10) NOT NULL,
role_name varchar2(50) NOT NULL
);
INSERT INTO ROLE (role_id, role_name) VALUES (10, 'User');
INSERT INTO ROLE (role_id, role_name) VALUES (11, 'Company');
CREATE TABLE ROLE_REL
(id number(10) NOT NULL,
user_id number(10) NOT NULL,
role_id number(10) NOT NULL
);
INSERT INTO role_rel (id,user_id,role_id) VALUES (1,1, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (2,2, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (3,3, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (4,4, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (5,5, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (6,6, 10);
INSERT INTO role_rel (id,user_id,role_id) VALUES (7,100, 11);
INSERT INTO role_rel (id,user_id,role_id) VALUES (8,200, 11);
INSERT INTO role_rel (id,user_id,role_id) VALUES (9,300, 11);
INSERT INTO role_rel (id,user_id,role_id) VALUES (10,400, 11);
INSERT INTO role_rel (id,user_id,role_id) VALUES (11,500, 11);
CREATE TABLE COMPANY_USER
(id number(10) NOT NULL,
user_id number(10) NOT NULL,
company_id number(10) NOT NULL,
is_deleted varchar2(1) NOT NULL
);
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (1,1,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (2,1,200,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (3,1,300,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (4,3,400,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (5,1,500,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (6,2,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (7,3,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (8,4,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (9,4,200,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (10,5,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (11,6,100,'F');
INSERT INTO company_user(id,user_id,company_id,is_deleted) VALUES (12,6,200,'F');
CREATE TABLE CITY
(id number(10) NOT NULL,
city_name varchar2(50) NOT NULL
);
INSERT INTO city(id,city_name) VALUES (1,'New York');
INSERT INTO city(id,city_name) VALUES (2,'Sacramento');
INSERT INTO city(id,city_name) VALUES (3,'Washington');
INSERT INTO city(id,city_name) VALUES (4,'New Jersey');
INSERT INTO city(id,city_name) VALUES (5,'Toronto');
CREATE TABLE CITY_USER
(id number(10) NOT NULL,
user_id number(10) NOT NULL,
city_id number(10) NOT NULL,
is_deleted varchar2(1) NOT NULL
);
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (1,1,3,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (2,2,4,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (3,3,4,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (4,4,1,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (5,5,1,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (6,6,2,'F');
INSERT INTO CITY_USER(id,user_id,city_id,is_deleted) VALUES (7,1,1,'F');
CREATE TABLE BRANCH
(id number(10) NOT NULL,
branch_name varchar2(50) NOT NULL
);
INSERT INTO branch(id,branch_name) VALUES (1,'Black');
INSERT INTO branch(id,branch_name) VALUES (2,'White');
INSERT INTO branch(id,branch_name) VALUES (3,'Blue');
INSERT INTO branch(id,branch_name) VALUES (4,'Yellow');
INSERT INTO branch(id,branch_name) VALUES (5,'Orange');
CREATE TABLE BRANCH_USER(
id number(10) NOT NULL,
user_id number(10) NOT NULL,
branch_id number(10) NOT NULL,
is_deleted varchar2(1) NOT NULL
);
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (1,1,5,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (2,2,1,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (3,3,1,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (4,4,2,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (5,5,3,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (6,6,3,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (7,1,1,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (8,2,3,'F');
INSERT INTO BRANCH_USER(id,user_id,branch_id,is_deleted) VALUES (9,1,3,'F');
아래의 내 쿼리입니다.
SELECT count(CU.company_ID) as TypeID, CU.Company_ID, C.Name
FROM Company_User CU
INNER JOIN USERS C
on CU.Company_ID = c.user_ID
INNER JOIN (SELECT Distinct U.user_ID
FROM users U
INNER JOIN Role_Rel RR
on RR.user_ID = U.user_ID
WHERE U.is_deleted = 'F'
and RR.Role_ID = 10) U
on CU.User_ID = U.user_ID
INNER JOIN (SELECT Distinct PU.user_ID
FROM users PU
INNER JOIN city_user SUL
on SUL.user_ID = PU.user_ID
WHERE sul.city_id = 1 and PU.is_deleted = 'F') PU
on CU.User_ID = PU.user_ID
INNER JOIN (SELECT Distinct KU.user_ID
FROM users KU
INNER JOIN branch_user hd
on hd.user_ID = KU.user_ID
WHERE hd.branch_id = 3 and KU.is_deleted = 'F' and hd.is_deleted = 'F') KU
on CU.User_ID = KU.user_ID
GROUP BY CU.Company_Id, C.Name
ORDER BY count(CU.Company_ID) Desc;
내 결과는 원하는대로 회사가 사용자 수로 표시됩니다.
TypeID Company_id Name
6 100 Nike
3 200 Adidas
2 400 Puma
1 300 Reebok.
내 결과
TYPEID COMPANY_ID NAME
2 100 Nike
1 500 Kinetix
1 200 Adidas
1 300 Reebook
저는 @xQbert 대답에 따라 제 질문을 편집했으며 branch_user 및 city_user 테이블에 따라 쿼리에 두 가지 새로운 제한 사항을 추가했습니다. 더 나은 수행을 위해 내 질문을 어떻게 수정할 수 있습니까?
필요한 모든 색인이 추가된다고 상상해보십시오. 나는 새로운 질의 또는 질의에 있어야하는 새로운 색인이 필요하다. 질의는 내 문제를 해결하여 쿼리를보다 최적화되도록하고 싶습니다.
미리 감사드립니다.
어떤 DBMS를 사용하고 있습니까? –
Oracle을 사용하고 있습니다. 지금 내 질문을 편집 할 것입니다. –
테이블 및 인덱스 정의 등 추가 실행 계획/설명? – jarlh