thắc mắc Câu lệnh where để lọc data đưa lên RAM của SQL

SQL:
SELECT * FROM Customers

WHERE Country='VietNam';

Là đưa tất cả customers lên RAM rồi lọc ra VietNam hay là lọc rồi mới đưa vào RAM vậy mn

tại vì giả dụ Customers data tổng là 20GB nhưng Customers ở VietNam chỉ có 2GB, mà lấy lên RAM hết rùi mới lọc thì bị tràn RAM à mn:nosebleed:

nếu dùng 1 nửa code và 1 nửa Sql thì có được chấp nhận ko

ví dụ nửa code SQL (ORM) + lọc bằng python
Python:
customers = Customers.query.all()

customer_vietnam = [customer for customer in customers if customers.Country == 'VietNam']


và dùng hoàn toàn bằng SQL(ORM)

Python:
customer_vietnam = Customers.query.filter_by(Country == 'VietNam')


à mn cho hỏi chút về sqlalchemy, thấy code người ta hay query nhìu lần:
customers = Customers.query
query = query.filter ...
query = query.join(...)
query = query.all()

thì mấy cái query trung gian ý nó có data đẩy lên RAM không hay chỉ là lúc .all() mới cho vào RAM vậy
 
Sửa lần cuối:
SQL:
SELECT * FROM Customers

WHERE Country='VietNam';

Là đưa tất cả customers lên RAM rồi lọc ra VietNam hay là lọc rồi mới đưa vào RAM vậy mn

tại vì giả dụ Customers data tổng là 20GB nhưng Customers ở VietNam chỉ có 2GB, mà lấy lên RAM hết rùi mới lọc thì bị tràn RAM à mn:nosebleed:

nếu dùng 1 nửa code và 1 nửa Sql thì có được chấp nhận ko

ví dụ nửa code SQL (ORM) + lọc bằng python
Python:
customers = Customers.query.all()

customer_vietnam = [customer for customer in customers if customers.Country == 'VietNam']


và dùng hoàn toàn bằng SQL(ORM)

Python:
customer_vietnam = Customers.query.filter_by(Country == 'VietNam')
Xin được việc làm dev rồi à mày ?
 
SQL:
SELECT * FROM Customers

WHERE Country='VietNam';

Là đưa tất cả customers lên RAM rồi lọc ra VietNam hay là lọc rồi mới đưa vào RAM vậy mn

tại vì giả dụ Customers data tổng là 20GB nhưng Customers ở VietNam chỉ có 2GB, mà lấy lên RAM hết rùi mới lọc thì bị tràn RAM à mn:nosebleed:

nếu dùng 1 nửa code và 1 nửa Sql thì có được chấp nhận ko

ví dụ nửa code SQL (ORM) + lọc bằng python
Python:
customers = Customers.query.all()

customer_vietnam = [customer for customer in customers if customers.Country == 'VietNam']


và dùng hoàn toàn bằng SQL(ORM)

Python:
customer_vietnam = Customers.query.filter_by(Country == 'VietNam')


à mn cho hỏi chút về sqlalchemy, thấy code người ta hay query nhìu lần:
customers = Customers.query
query = query.filter ...
query = query.join(...)
query = query.all()

thì mấy cái query trung gian ý nó có data đẩy lên RAM không hay chỉ là lúc .all() mới cho vào RAM vậy
Bác nên học cuốn fundamentals of database systems để có nền từ tầng vật lý đến cách xử lý giao dịch, recovery các kiểu. Dữ liệu lưu ở database thì lưu như dạng file bình thường trên đĩa, cần đọc/ghi/update thì nó sẽ đem từng block lên ram xử lý. Hoặc cũng có framework xử lý data nó cũng load toàn bộ data lên ram rồi xử lý..
Còn việc các bước trung gian có thực hiện hay ko thì tùy bộ execution engine của từng dbms, ví dụ như có hỗ trợ lazy evaluation không chẳng hạn :LOL:
 
Sửa lần cuối:
Bác nên học cuốn fundamentals of database systems để có nền từ tầng vật lý đến cách xử lý giao dịch, recovery các kiểu. Dữ liệu lưu ở database thì lưu như dạng file bình thường trên đĩa, cần đọc/ghi/update thì nó sẽ đem từng block lên ram xử lý. Hoặc cũng có framework xử lý data nó cũng load toàn bộ data lên ram rồi xử lý..
Còn việc các bước trung gian có thực hiện hay ko thì tùy bộ optimizer của từng dbms, ví dụ như có hỗ trợ lazy evaluation không chẳng hạn :LOL:
mấy cái này học môn hệ quản trị csdl cũng có nói hết, có đề cập đến mấy lỗi hay gặp khi xử lý dữ liệu, rồi mấy biện pháp để xử lý đồng thời, rồi mấy tính năng cơ bản của 1 hệ quản trị nữa ( lưu dữ liệu theo mô hình cấu trúc dữ liệu gì, lưu thế nào, lấy ra thế nào, xử lý sự cố khi cúp điện hoặc thiên tai ...), hết khóa học tui nhớ còn có bài tập nâng cao, là thử override 1 tính năng nhỏ cho open source mysql nữa, nói chung nguyên mảng database này mà học cho đủ cũng mệt vcl ra, dev giờ làm ở tầng trên hết, biết cách querry, tối ưu câu querry là đc rồi:D
 
nó lấy từ DISK lên RAM rồi xử lí. Xong một câu query nó sẽ giải phóng RAM đi lưu dữ liệu xuống DISK lại.

Ý còn thiếu, nếu câu query 20GB "SELECT * FROM Customers" lớn quá thì nó sẽ lấy từng phần nhỏ tầm vài GB cho đến khi đầy RAM rồi giải phóng xuống rồi lại load lên tiếp RAM cứ vòng lặp vậy đến khi hết 20GB rồi giải phóng hoàn toàn trong RAM. Nói chặp ko biết mình nói gì luôn =))

Còn trường hợp query một câu sql 20GB đó để gán vào biến trong Python xử lí, chạy hàm thì sẽ bị tràn RAM (out of heap). Mình biết sơ sơ vậy mong các bác giải đáp thêm :D.
 
Sửa lần cuối:
SQL:
SELECT * FROM Customers

WHERE Country='VietNam';

Là đưa tất cả customers lên RAM rồi lọc ra VietNam hay là lọc rồi mới đưa vào RAM vậy mn

tại vì giả dụ Customers data tổng là 20GB nhưng Customers ở VietNam chỉ có 2GB, mà lấy lên RAM hết rùi mới lọc thì bị tràn RAM à mn:nosebleed:

nếu dùng 1 nửa code và 1 nửa Sql thì có được chấp nhận ko

ví dụ nửa code SQL (ORM) + lọc bằng python
Python:
customers = Customers.query.all()

customer_vietnam = [customer for customer in customers if customers.Country == 'VietNam']


và dùng hoàn toàn bằng SQL(ORM)

Python:
customer_vietnam = Customers.query.filter_by(Country == 'VietNam')


à mn cho hỏi chút về sqlalchemy, thấy code người ta hay query nhìu lần:
customers = Customers.query
query = query.filter ...
query = query.join(...)
query = query.all()

thì mấy cái query trung gian ý nó có data đẩy lên RAM không hay chỉ là lúc .all() mới cho vào RAM vậy
đọc cuốn operating system three easy pieces đi anh già, không thì search key word page table, swap
 
RAM nhỏ là filter từng mảng rows một à fen
Pro có thể hiểu như vậy, đại khái là nó sẽ đọc block lên gọi là phýical read, đọc lên cache, sau đó cứ lần lượt làm như vậy, nhưng table của pro 20g vậy nó sẽ có bước flush cache cũ ko sử dụng, đảm bảo cache ko bị tràn, tuy nhiên có nhiều t.hop hệ thống ko xẻ lý kịp nên OS sẽ bị halt, vì vậy nên mấy ông dev nên tối ưu câu lệnh của mình.
 
Nó load field country thôi, vừa seek vừa check

Đầu tiên là lên ram của db server

Nếu field country đc index thì seek record nhanh. Nếu type là blob thì thối mồm do db lưu blob ra file

Tiếp theo là data từ db lên app server, nếu select all thì là 20gb :LOL: , nếu fen dùng cursor thì trên ram của db là 20gb
 
Nó đưa hết lên Ram nhé. Để tối ưu thì phải thiết kế database là thế.
Pro có thể hiểu như vậy, đại khái là nó sẽ đọc block lên gọi là phýical read, đọc lên cache, sau đó cứ lần lượt làm như vậy, nhưng table của pro 20g vậy nó sẽ có bước flush cache cũ ko sử dụng, đảm bảo cache ko bị tràn, tuy nhiên có nhiều t.hop hệ thống ko xẻ lý kịp nên OS sẽ bị halt, vì vậy nên mấy ông dev nên tối ưu câu lệnh của mình.
nó lấy từ DISK lên RAM rồi xử lí. Xong một câu query nó sẽ giải phóng RAM đi lưu dữ liệu xuống DISK lại.

Ý còn thiếu, nếu câu query 20GB "SELECT * FROM Customers" lớn quá thì nó sẽ lấy từng phần nhỏ tầm vài GB cho đến khi đầy RAM rồi giải phóng xuống rồi lại load lên tiếp RAM cứ vòng lặp vậy đến khi hết 20GB rồi giải phóng hoàn toàn trong RAM. Nói chặp ko biết mình nói gì luôn :LOL:

Còn trường hợp query một câu sql 20GB đó để gán vào biến trong Python xử lí, chạy hàm thì sẽ bị tràn RAM (out of heap). Mình biết sơ sơ vậy mong các bác giải đáp thêm :D.
Như vậy mọi người hay viết gộp mọi thứ vào 1 câu query là để tận dụng sự thông minh của cái database nó lấy lần lượt từng mảng lên để xử lý, tránh lưu một array quá lớn vào RAM server của code.

chứ không phải là viết 1 câu query to là nó chạy nhanh hơn phải ko mn
 

Thống kê chủ đề

Ngày tạo
Lập Trình Viên Số Khổ,
Người trả lời cuối
meohen2109,
Trả lời
15
Lượt xem
1.498
Quay lại
Lên đầu trang