Có một điều thú vị cho tất cả các bạn SQL guru ngoài kia. Bây giờ tìm kiếm này chỉ mất vài giây, nhưng nó khá chuyên sâu và phải có cách tốt hơn. Có lẽ tôi đang mong đợi quá nhiều?
Ứng dụng tìm kiếm kỳ nghỉ đơn giản. 2 triệu ngày lễ. Phân trang / Sắp xếp khoảng 600.000 hàng.
Đây là lược đồ của bảng
CREATE TABLE [dbo].[Holiday](
[Id] [int] NOT NULL,
[PropertyId] [int] NOT NULL,
[Price] [int] NOT NULL,
[Rating] [int] NOT NULL,
[Country] [char](2) NOT NULL,
[ResortId] [int] NOT NULL,
[DepartureAirport] [char](3) NOT NULL,
[DestinationAirport] [char](3) NOT NULL,
[DepartureDate] [datetime] NOT NULL,
[Basis] [char](2) NOT NULL,
[Duration] [int] NOT NULL,
CONSTRAINT [PK_Holiday] PRIMARY KEY CLUSTERED ([Id] ASC)
)
Như bạn thấy, khá đơn giản. Chúng tôi có một tài sản, giá cả, thời gian, sân bay khởi hành / điểm đến, v.v ... Bây giờ, càng nhiều lĩnh vực được cung cấp thì tìm kiếm càng nhanh. Nếu tôi có Sân bay Khởi hành, Tài sản và Ngày thì việc tìm kiếm rất nhanh. Tuy nhiên, nếu tôi chỉ có một Quốc gia và không có gì khác, có rất nhiều dữ liệu để xử lý.
Sử dụng xuất CSV này của bảng của tôi, có tổng cộng 2 triệu hàng và khoảng 666k chỉ với mã quốc gia của FR, đó là ví dụ của tôi.
Đây, là truy vấn tìm kiếm. Mà trả về hai bảng. Đầu tiên là một bản tóm tắt, vì vậy tổng số ngày nghỉ phù hợp với tiêu chí của bạn và có bao nhiêu thuộc tính duy nhất. Bảng thứ hai chứa kết quả thực tế từ tìm kiếm.
--Build a temp table, and store everything we need in it
CREATE TABLE #Pricing (PropertyId int, Duration int, HolidayId int, Rating int, Price int, StartDate datetime, PropertyRow int);
INSERT INTO #Pricing
SELECT
PropertyId, Duration, [Id], [Rating], [Price], DepartureDate,
ROW_NUMBER() OVER (PARTITION BY PropertyId ORDER BY Price ASC) as PropertyRow
FROM
dbo.Holiday
WHERE
DepartureDate > GETDATE() AND Country = 'FR'
--Get a total number of holidays, and total number of properties
SELECT
COUNT(*) AS TotalHolidaysCount,
COUNT(DISTINCT PropertyId) AS PropertyCount
FROM
#Pricing
--Build the final table, which will contain all the holidays we actually want to return
DECLARE @FinalResults TABLE (HolidayId int, RowNumber int);
INSERT INTO
@FinalResults
SELECT
HolidayId, RowNumber
FROM
(SELECT
PropertyRow, HolidayId,
ROW_NUMBER() OVER (order by (CASE WHEN StartDate <= '01/Apr/2013' THEN 1 ELSE 0 END) ASC, [Price] ASC) as RowNumber
FROM
#Pricing
WHERE
PropertyRow = 1) as SearchResults
WHERE
(RowNumber > (10 * (1 - 1)) and RowNumber <= (1 * 10))
ORDER BY
RowNumber;
SELECT
*
FROM
@FinalResults
INNER JOIN dbo.Holiday ON HolidayId = Holiday.Id
DROP TABLE #Pricing
Bây giờ, tôi có thể xem xét Lập chỉ mục rõ ràng sẽ cải thiện hiệu suất. Nhưng điều làm tôi lo lắng là việc sử dụng các bảng tạm thời đáng kinh ngạc. Chắc chắn đây không phải là cách nó được thực hiện? Mất 5 giây để tìm kiếm những gì cuối cùng là một lượng nhỏ dữ liệu. Họ chỉ lý do họ được sử dụng là vì nhu cầu tham khảo dữ liệu sau này.
Nó có thể có giá trị khi chạy truy vấn hai lần, thay vì lưu trữ tất cả dữ liệu trong bộ nhớ? Có vẻ lãng phí khi chọn hơn 25% bảng vào bộ nhớ hết lần này đến lần khác.
Bất kỳ thông tin phản hồi hữu ích sẽ được đánh giá cao. Không tìm kiếm "câu trả lời", chỉ cần một số trợ giúp.
Rất cám ơn, Trưởng khoa
(RowNumber > (10 * (1 - 1)) and RowNumber <= (1 * 10))
sẽ được viết tốt hơn nhiều như làRowNumber Between 1 and 10