誰かが書いた次の擬似クエリがあります。
SELECT custId, orderId, col1, col2
FROM (SELECT c.id AS custId, o.id AS orderId,
ROW_NUMBER() OVER(PARTITION BY c.id, o.id
ORDER BY d.col1, d.col2) AS RANK
FROM customers c
INNER JOIN orders o ON c.id = o.custId
INNER JOIN orderDetails d ON o.id = d.orderId
WHERE d.col3 IS NULL)
WHERE RANK = 1
- c.id (custId) と o.id (orderId) のみがインデックス付きフィールドです。
- customers テーブルには最大 200 万件のレコードがあります
- orders テーブルには最大 3,700 万件のレコードがあります
- orderDetail テーブルには最大 6 億 2000 万のレコードがあります
残念ながら、このクエリには不明な時間 (> 2 時間) がかかり、私はこの問題を解決する任務を負っています。これまでのところ、かなり高速に実行される代替案を思いつきました(ただし、それでも完全に受け入れられないIMHOです):
SELECT custId, orderId, col1, col2
FROM (SELECT custId, orderId, col1, col2,
ROW_NUMBER() OVER(PARTITION BY custId, orderId
ORDER BY col1, col2) AS RANK
FROM (SELECT c.id AS custId, o.id AS orderId, d.col1, d.col2, d.col3
FROM customers c
INNER JOIN orders o ON c.id = o.custId
INNER JOIN orderDetails d ON o.id = d.orderId)
WHERE col3 IS NULL
WHERE RANK = 1
残念ながら、インデックスを追加したり、これらのテーブルに基づくクエリの実行計画を確認したりすることができないため、これを書き直して構造化し、大幅に高速に実行する方法について途方に暮れています =/。あなたの専門家の一人がより良いアイデアを持っていることを願っています...私はこの特定のクエリのために具体的に尋ねているわけではありませんが、このように書き直す必要があるそのようなクエリがたくさんあり、主な問題が何であるかを学ぼうとしています.これらは/どのように私がそれらを最もよく解決できるかです.