Cách viết truy vấn sql dài trong python

Bắt đầu từ đây? . Kiểm tra đầu

Trong bài học này, chúng tôi sẽ bao gồm

Điều chỉnh hiệu suất SQL là gì?

Điều chỉnh SQL là quá trình cải thiện các truy vấn SQL để tăng tốc hiệu suất máy chủ của bạn. Mục đích chung của nó là giảm lượng thời gian người dùng cần để nhận kết quả sau khi đưa ra truy vấn và giảm lượng tài nguyên được sử dụng để xử lý truy vấn. Bài học về truy vấn con đã giới thiệu ý tưởng rằng đôi khi bạn có thể tạo cùng một tập hợp kết quả mong muốn với truy vấn chạy nhanh hơn. Trong bài học này, bạn sẽ học cách xác định thời điểm có thể cải thiện các truy vấn của mình và cách cải thiện chúng

Cơ sở dữ liệu là một phần của phần mềm chạy trên máy tính và có các hạn chế giống như tất cả các phần mềm—cơ sở dữ liệu chỉ có thể xử lý lượng thông tin nhiều nhất có thể do phần cứng của nó có khả năng xử lý. Cách để làm cho truy vấn chạy nhanh hơn là giảm số phép tính mà phần mềm (và do đó là phần cứng) phải thực hiện. Để làm điều này, bạn sẽ cần một số hiểu biết về cách SQL thực sự tính toán. Trước tiên, hãy giải quyết một số vấn đề cấp cao sẽ ảnh hưởng đến số lượng phép tính bạn cần thực hiện và do đó ảnh hưởng đến thời gian chạy truy vấn của bạn

  • kích thước bảng. Nếu truy vấn của bạn chạm vào một hoặc nhiều bảng có hàng triệu hàng trở lên, điều đó có thể ảnh hưởng đến hiệu suất
  • tham gia. Nếu truy vấn của bạn kết hợp hai bảng theo cách làm tăng đáng kể số lượng hàng của tập kết quả, thì truy vấn của bạn có thể bị chậm. Có một ví dụ về điều này trong bài học truy vấn con
  • tổng hợp. Kết hợp nhiều hàng để tạo ra kết quả đòi hỏi nhiều tính toán hơn là chỉ truy xuất các hàng đó

Thời gian chạy truy vấn cũng phụ thuộc vào một số thứ mà bạn không thể thực sự kiểm soát liên quan đến chính cơ sở dữ liệu

  • Những người dùng khác đang chạy truy vấn. Càng nhiều truy vấn chạy đồng thời trên cơ sở dữ liệu, cơ sở dữ liệu đó càng phải xử lý nhiều hơn tại một thời điểm nhất định và mọi thứ sẽ chạy càng chậm. Điều này có thể đặc biệt tồi tệ nếu những người khác đang chạy các truy vấn đặc biệt sử dụng nhiều tài nguyên đáp ứng một số tiêu chí trên
  • Phần mềm cơ sở dữ liệu và tối ưu hóa. Đây là điều bạn có thể không kiểm soát được, nhưng nếu bạn biết hệ thống mình đang sử dụng, bạn có thể làm việc trong giới hạn của nó để thực hiện các truy vấn của mình hiệu quả hơn

Hiện tại, hãy bỏ qua những điều bạn không thể kiểm soát và làm những điều bạn có thể

Giảm kích thước bảng

Lọc dữ liệu để chỉ bao gồm các quan sát bạn cần có thể cải thiện đáng kể tốc độ truy vấn. Cách bạn làm điều này sẽ phụ thuộc hoàn toàn vào vấn đề bạn đang cố gắng giải quyết. Ví dụ: nếu bạn có dữ liệu chuỗi thời gian, việc giới hạn trong một cửa sổ thời gian nhỏ có thể giúp truy vấn của bạn chạy nhanh hơn nhiều

SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01'
   AND event_date <  '2014-04-01'

Hãy nhớ rằng bạn luôn có thể thực hiện phân tích khám phá trên một tập hợp con dữ liệu, tinh chỉnh công việc của bạn thành truy vấn cuối cùng, sau đó loại bỏ giới hạn và chạy công việc của bạn trên toàn bộ tập dữ liệu. Truy vấn cuối cùng có thể mất nhiều thời gian để chạy, nhưng ít nhất bạn có thể chạy các bước trung gian một cách nhanh chóng

Đây là lý do tại sao Chế độ thực thi mệnh đề

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 theo mặc định—100 hàng thường nhiều hơn mức bạn cần để xác định bước tiếp theo trong phân tích của mình và đó là một tập dữ liệu đủ nhỏ để nó sẽ trả về nhanh chóng

Điều đáng chú ý là

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 không hoàn toàn hoạt động theo cách tương tự với tập hợp—việc tổng hợp được thực hiện, sau đó kết quả được giới hạn ở số lượng hàng đã chỉ định. Vì vậy, nếu bạn đang tổng hợp thành một hàng như bên dưới, thì
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
6 sẽ không làm gì để tăng tốc độ truy vấn của bạn

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100

Nếu bạn muốn giới hạn tập dữ liệu trước khi thực hiện đếm (để tăng tốc mọi thứ), hãy thử thực hiện trong truy vấn con

SELECT COUNT(*)
  FROM (
    SELECT *
      FROM benn.sample_event_table
     LIMIT 100
       ) sub

Ghi chú. Sử dụng

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4, điều này sẽ thay đổi đáng kể kết quả của bạn, vì vậy bạn nên sử dụng nó để kiểm tra logic truy vấn chứ không phải để nhận kết quả thực tế

Nói chung, khi làm việc với các truy vấn con, bạn nên đảm bảo giới hạn lượng dữ liệu bạn đang làm việc ở nơi nó sẽ được thực thi trước tiên. Điều này có nghĩa là đặt

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 vào truy vấn con, không phải truy vấn bên ngoài. Một lần nữa, điều này là để làm cho truy vấn chạy nhanh để bạn có thể kiểm tra—KHÔNG phải để tạo ra kết quả tốt

Theo một cách nào đó, đây là phần mở rộng của mẹo trước. Theo cách tương tự, tốt hơn là giảm dữ liệu tại một điểm trong truy vấn được thực hiện sớm, tốt hơn là giảm kích thước bảng trước khi nối chúng. Lấy ví dụ này, kết hợp thông tin về các đội thể thao của trường đại học với danh sách các vận động viên ở các trường đại học khác nhau

SELECT teams.conference AS conference,
       players.school_name,
       COUNT(1) AS players
  FROM benn.college_football_players players
  JOIN benn.college_football_teams teams
    ON teams.school_name = players.school_name
 GROUP BY 1,2

Có 26.298 hàng trong

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
2. Điều đó có nghĩa là 26.298 hàng cần được đánh giá cho phù hợp trong bảng khác. Nhưng nếu bảng
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
2 đã được tổng hợp trước, bạn có thể giảm số lượng hàng cần đánh giá trong phép nối. Đầu tiên, chúng ta hãy xem tổng hợp

SELECT players.school_name,
       COUNT(*) AS players
  FROM benn.college_football_players players
 GROUP BY 1

Truy vấn trên trả về 252 kết quả. Vì vậy, bỏ truy vấn đó trong một truy vấn con và sau đó nối với truy vấn đó trong truy vấn bên ngoài sẽ giảm đáng kể chi phí nối

SELECT teams.conference,
       sub.*
  FROM (
        SELECT players.school_name,
               COUNT(*) AS players
          FROM benn.college_football_players players
         GROUP BY 1
       ) sub
  JOIN benn.college_football_teams teams
  ON teams.school_name = sub.school_name

Trong trường hợp cụ thể này, bạn sẽ không nhận thấy sự khác biệt lớn vì 30.000 hàng không quá khó để cơ sở dữ liệu xử lý. Nhưng nếu bạn đang nói về hàng trăm nghìn hàng trở lên, bạn sẽ thấy sự cải thiện rõ rệt bằng cách tổng hợp trước khi tham gia. Khi bạn làm điều này, hãy đảm bảo rằng những gì bạn đang làm nhất quán về mặt logic—bạn nên lo lắng về độ chính xác của công việc trước khi lo lắng về tốc độ chạy

GIẢI THÍCH

Bạn có thể thêm

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 vào đầu bất kỳ truy vấn (đang hoạt động) nào để biết được sẽ mất bao lâu. Nó không hoàn toàn chính xác, nhưng nó là một công cụ hữu ích. Hãy thử chạy cái này

EXPLAIN
SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01'
   AND event_date < '2014-04-01'
 LIMIT 100

Bạn sẽ nhận được kết quả này. Nó được gọi là Kế hoạch truy vấn và nó hiển thị thứ tự mà truy vấn của bạn sẽ được thực hiện

Cách viết truy vấn sql dài trong python

Mục ở dưới cùng của danh sách được thực hiện đầu tiên. Vì vậy, điều này cho thấy rằng mệnh đề

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
5 giới hạn phạm vi ngày sẽ được thực hiện trước. Sau đó, cơ sở dữ liệu sẽ quét 600 hàng (đây là con số gần đúng). Bạn có thể thấy chi phí được liệt kê bên cạnh số hàng—số càng cao nghĩa là thời gian chạy càng lâu. Bạn nên sử dụng điều này nhiều hơn như một tài liệu tham khảo hơn là một thước đo tuyệt đối. Để làm rõ, điều này hữu ích nhất nếu bạn chạy
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 trên một truy vấn, sửa đổi các bước tốn kém, sau đó chạy lại
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 để xem chi phí có giảm không. Cuối cùng, mệnh đề
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
4 được thực hiện sau cùng và thực sự rẻ để chạy (24. 65 so với 147. 87 cho mệnh đề
SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100
5)

%s trong SQL Python là gì?

Chúng tôi cần cung cấp các giá trị trong trình giữ chỗ ( %s ) trước khi thực hiện truy vấn. Truyền các biến Python ở vị trí của trình giữ chỗ khi chúng tôi thực hiện truy vấn. Chúng ta cần truyền hai đối số sau cho một con trỏ. hàm exec() để chạy truy vấn được tham số hóa.

%d và %s trong SQL là gì?

Bạn phải sử dụng %d cho giá trị số nguyên và %s cho giá trị chuỗi . Bạn cũng có thể sử dụng %f cho giá trị dấu phẩy động, %b cho dữ liệu nhị phân và %% chỉ để chèn ký hiệu phần trăm.

Python có tốt với SQL không?

Python đặc biệt phù hợp với dữ liệu có cấu trúc (dạng bảng) có thể được tìm nạp bằng SQL và sau đó yêu cầu thao tác xa hơn , điều này có thể khó đạt được nếu chỉ sử dụng SQL.