Tôi có thể nói rằng truy vấn chậm vì nó đang truy cập liên tục vào bảng khi trình kích hoạt kích hoạt.
Tôi không phải là chuyên gia SQL nhưng tôi đã cố gắng tập hợp một truy vấn bằng cách sử dụng các bảng tạm thời. Bạn có thể xem liệu nó có giúp tăng tốc truy vấn hay không. Tôi đã sử dụng các tên cột khác nhau nhưng có âm giống nhau trong mẫu mã của tôi bên dưới.
CHỈNH SỬA: Đã xảy ra lỗi tính toán trong mã trước đó của tôi. Đã cập nhật ngay bây giờ.
SELECT COUNT(id) INTO @no_of_attempts from tb2;
-- DROP TABLE IF EXISTS S1Percentiles;
-- DROP TABLE IF EXISTS S2Percentiles;
-- DROP TABLE IF EXISTS S3Percentiles;
CREATE TEMPORARY TABLE S1Percentiles (
s1 FLOAT NOT NULL,
percentile FLOAT NOT NULL DEFAULT 0.00
);
CREATE TEMPORARY TABLE S2Percentiles (
s2 FLOAT NOT NULL,
percentile FLOAT NOT NULL DEFAULT 0.00
);
CREATE TEMPORARY TABLE S3Percentiles (
s3 FLOAT NOT NULL,
percentile FLOAT NOT NULL DEFAULT 0.00
);
INSERT INTO S1Percentiles (s1, percentile)
SELECT A.s1, ((COUNT(B.s1)/@no_of_attempts)*100)
FROM (SELECT DISTINCT s1 from tb2) A
INNER JOIN tb2 B
ON B.s1 <= A.s1
GROUP BY A.s1;
INSERT INTO S2Percentiles (s2, percentile)
SELECT A.s2, ((COUNT(B.s2)/@no_of_attempts)*100)
FROM (SELECT DISTINCT s2 from tb2) A
INNER JOIN tb2 B
ON B.s2 <= A.s2
GROUP BY A.s2;
INSERT INTO S3Percentiles (s3, percentile)
SELECT A.s3, ((COUNT(B.s3)/@no_of_attempts)*100)
FROM (SELECT DISTINCT s3 from tb2) A
INNER JOIN tb2 B
ON B.s3 <= A.s3
GROUP BY A.s3;
-- select * from S1Percentiles;
-- select * from S2Percentiles;
-- select * from S3Percentiles;
UPDATE tb1 A
INNER JOIN
(
SELECT B.tb1_id AS id, (C.percentile + D.percentile + E.percentile) AS sum FROM tb2 B
INNER JOIN S1Percentiles C
ON B.s1 = C.s1
INNER JOIN S2Percentiles D
ON B.s2 = D.s2
INNER JOIN S3Percentiles E
ON B.s3 = E.s3
) F
ON A.id = F.id
SET A.sum = F.sum;
-- SELECT * FROM tb1;
DROP TABLE S1Percentiles;
DROP TABLE S2Percentiles;
DROP TABLE S3Percentiles;
Điều này làm là nó ghi lại phân vị cho từng nhóm điểm và sau đó cuối cùng chỉ cập nhật tb1
cột với dữ liệu cần thiết thay vì tính toán lại phần trăm cho mỗi hàng sinh viên.
Bạn cũng nên lập chỉ mục các cột s1
, s2
và s3
để tối ưu hóa các truy vấn trên các cột này.
Lưu ý:Vui lòng cập nhật tên cột theo giản đồ db của bạn. Cũng lưu ý rằng mỗi phép tính phần trăm đã được nhân với 100
vì tôi tin rằng phần trăm thường được tính theo cách đó.