Trong khi cố gắng áp dụng nội dung của câu hỏi dưới đây vào tình huống của riêng tôi, tôi hơi bối rối vì làm thế nào tôi có thể thoát khỏi toán tử Hash Match (Tham gia bên trong) nếu có thể.
Hiệu suất truy vấn SQL Server - loại bỏ nhu cầu đối với Hash Match (Tham gia bên trong)
Tôi nhận thấy chi phí 10% và tự hỏi liệu tôi có thể giảm được không. Xem kế hoạch truy vấn dưới đây.
Công việc này xuất phát từ một truy vấn mà tôi phải điều chỉnh ngày hôm nay:
SELECT c.AccountCode, MIN(d.CustomerSID)
FROM Stage.Customer c
INNER JOIN Dimensions.Customer d ON c.Email = d.Email
OR (
c.HomePostCode = d.HomePostCode
AND c.StrSurname = d.strSurname
)
GROUP BY c.AccountCode
và sau khi thêm các chỉ mục này:
---------------------------------------------------------------------
-- Create the indexes
---------------------------------------------------------------------
CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL
ON Stage.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go
CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_HOME_SURNAME_INCL
ON Dimensions.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go
CREATE NONCLUSTERED INDEX IDX_Stage_Customer_EMAIL_INCL
ON Stage.Customer(EMAIL)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go
CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_EMAIL_INCL
ON Dimensions.Customer(EMAIL)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go
đây là truy vấn mới:
----------------------------------------------------------------------------
-- new query
----------------------------------------------------------------------------
SELECT *
FROM (
SELECT AccountCode
,RO=ROW_NUMBER () OVER (PARTITION BY AccountCode ORDER BY CustomerSID)
--,CustomerSID=MIN(CustomerSID) OVER (PARTITION BY AccountCode ORDER BY AccountCode)
,CustomerSID
FROM (
SELECT c.AccountCode, D.CustomerSID
FROM Stage.Customer c
INNER JOIN Dimensions.Customer d ON c.Email = d.Email
UNION ALL
SELECT c.AccountCode, D.CustomerSID
FROM Stage.Customer c
INNER JOIN Dimensions.Customer d ON c.HomePostCode = d.HomePostCode
AND c.StrSurname = d.strSurname
) RADHE
) R1
WHERE RO = 1
Điều này đã giảm thời gian thực hiện truy vấn từ 8 phút xuống còn 1 giây.
Mọi người đều vui vẻ, nhưng tôi vẫn muốn biết liệu tôi có thể làm được nhiều việc hơn không, bằng cách nào đó loại bỏ toán tử khớp băm.
Tại sao nó ở đó ngay từ đầu, tôi khớp tất cả các trường, tại sao lại băm?