Dưới đây là một truy vấn cơ bản dựa trên hai chỉ số không clustered:SQL Azure Query - terribly chậm Ngay cả Với Tuned Queries
SELECT cc.categoryid, count(*) from company c
INNER JOIN companycategory cc on cc.companyid = c.id
WHERE c.placeid like 'ca_%'
GROUP BY cc.categoryid order by count(*) desc
Khi cùng cơ sở dữ liệu chính xác được lưu trữ trên SQL Server 2008, trên hầu như bất kỳ phần cứng , điều này trả về < 500 ms. Ngay cả khi bộ đệm cache đã xóa:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
... điều này vẫn trả về trong ~ 1 giây trên SQL truyền thống.
Trên Azure, mất khoảng 3,5 giây để trả lại mỗi lần.
Một số articles có vẻ như gợi ý rằng mọi người thường hài lòng với hiệu suất truy vấn trong SQL Azure. Và đây là một kịch bản cơ bản trong đó việc điều chỉnh 'hiển nhiên' đã cạn kiệt và không có vấn đề về độ trễ mạng. Nó chỉ là thực sự chậm khi làm việc w/bảng lớn (companycategroy có 1,2 triệu hồ sơ, địa điểm có 7,5K).
Tổng kích thước cơ sở dữ liệu không quá 4GB. Chọn phiên bản 'Web' so với phiên bản 'Doanh nghiệp' dường như không tạo ra nhiều sự khác biệt.
Tôi đang thiếu gì?
Đây chỉ là một ví dụ cơ bản, nó chỉ trở nên tồi tệ hơn với các truy vấn phức tạp hơn, tất cả đều là reviewed, được điều chỉnh và thực hiện tốt tại chỗ.
Dưới đây là kế hoạch thực hiện:
|--Sort(ORDER BY:([Expr1004] DESC))
|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1007],0)))
|--Hash Match(Aggregate, HASH:([cc].[CategoryId]), RESIDUAL:([XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId] = [XX].[dbo].[CompanyCategory].[CategoryId] as [cc].[CategoryId]) DEFINE:([Expr1007]=COUNT(*)))
|--Hash Match(Inner Join, HASH:([c].[Id])=([cc].[CompanyId]))
|--Index Scan(OBJECT:([XX].[dbo].[Company].[IX_Company_PlaceId] AS [c]), WHERE:([XX].[dbo].[Company].[PlaceId] as [c].[PlaceId] like N'ca_%'))
|--Index Scan(OBJECT:([XX].[dbo].[CompanyCategory].[IX_CompanyCategory_CompanyId] AS [cc]))
Và đây là những số liệu thống kê:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 14 ms, elapsed time = 14 ms.
(789 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'CompanyCategory'. Scan count 1, logical reads 5183, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Company'. Scan count 1, logical reads 8710, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row(s) affected)
SQL Server Execution Times:
CPU time = 3328 ms, elapsed time = 3299 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
định nghĩa Index như sau:
CREATE NONCLUSTERED INDEX [IX_Company_PlaceId] ON [dbo].[Company]
(
[PlaceId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
CREATE NONCLUSTERED INDEX [IX_CompanyCategory_CompanyId] ON [dbo].[CompanyCategory]
(
[CompanyId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
ALTER TABLE [dbo].[Company] ADD CONSTRAINT [PK_Company_Id] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Bạn có thể đăng kế hoạch truy vấn văn bản và thống kê cho truy vấn trên 'Azure' không? Vui lòng chạy 'SET STATISTICS IO ON SET STATISTICS TIME TRÊN SET SET SHOWPLAN_TEXT ON GO SELECT…' – Quassnoi
Chúng tôi chắc chắn có thể làm với việc xem một kế hoạch truy vấn ... –
Chúng tôi có kế hoạch thực hiện trên Azure. Chúng ta sẽ thấy tương tự cho DB địa phương của mình chạy quá nhanh. –