Trong ứng dụng của mình, tôi phải tham gia các bảng với hàng triệu hàng. Tôi có một truy vấn như thế này:
SELECT DISTINCT "f"."id" AS "FileId"
, "f"."name" AS "FileName"
, "f"."year" AS "FileYear"
, "vt"."value" AS "value"
FROM files "f"
JOIN "clients" "cl" ON("f"."cid" = "cl"."id" AND "cl"."id" = 10)
LEFT JOIN "value_text" "vt" ON ("f"."id" = "vt"."id_file" AND "vt"."id_field" = 65739)
GROUP BY "f"."id", "f"."name", "f"."year", "vt"."value"
Bảng "tệp" có 10 triệu hàng và bảng "value lòng" có 40 triệu hàng.
Truy vấn này quá chậm, phải mất từ 40 giây (15000 kết quả) - 3 phút (65000 kết quả) để được thực thi.
Tôi đã nghĩ về việc chia hai truy vấn, nhưng tôi không thể vì đôi khi tôi cần đặt hàng theo cột (giá trị) đã tham gia ...
Tôi có thể làm gì? Tôi sử dụng SQL Server với Azure. Cụ thể, Cơ sở dữ liệu Azure SQL với giá / mô hình lớp "PRS1 PremiumRS (125 DTU)" .
Tôi đang nhận được rất nhiều dữ liệu nhưng tôi nghĩ rằng kết nối internet không phải là nút cổ chai, bởi vì trong các truy vấn khác tôi cũng nhận được rất nhiều dữ liệu và chúng nhanh hơn.
Tôi đã thử sử dụng bảng khách như một truy vấn con và loại bỏ DISTINCT
với cùng kết quả.
Tôi có 1428 hàng trong bảng khách hàng.
thông tin bổ sung
clients
bàn:
CREATE TABLE [dbo].[clients](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[code] [nvarchar](70) NOT NULL,
[password] [nchar](40) NOT NULL,
[name] [nvarchar](150) NOT NULL DEFAULT (N''),
[email] [nvarchar](255) NULL DEFAULT (NULL),
[entity] [int] NOT NULL DEFAULT ((0)),
[users] [int] NOT NULL DEFAULT ((0)),
[status] [varchar](8) NOT NULL DEFAULT ('inactive'),
[created] [datetime2](7) NULL DEFAULT (getdate()),
[activated] [datetime2](7) NULL DEFAULT (getdate()),
[client_type] [varchar](10) NOT NULL DEFAULT ('normal'),
[current_size] [bigint] NOT NULL DEFAULT ((0)),
CONSTRAINT [PK_clients_id] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON),
CONSTRAINT [clients$code] UNIQUE NONCLUSTERED
(
[code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
files
bàn:
CREATE TABLE [dbo].[files](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[cid] [bigint] NOT NULL DEFAULT ((0)),
[eid] [bigint] NOT NULL DEFAULT ((0)),
[year] [bigint] NOT NULL DEFAULT ((0)),
[name] [nvarchar](255) NOT NULL DEFAULT (N''),
[extension] [int] NOT NULL DEFAULT ((0)),
[size] [bigint] NOT NULL DEFAULT ((0)),
[id_doc] [bigint] NOT NULL DEFAULT ((0)),
[created] [datetime2](7) NULL DEFAULT (getdate())
CONSTRAINT [PK_files_id] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON),
CONSTRAINT [files$estructure_unique] UNIQUE NONCLUSTERED
(
[year] ASC,
[name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
ALTER TABLE [dbo].[files] WITH NOCHECK ADD CONSTRAINT [FK_files_client] FOREIGN KEY([cid])
REFERENCES [dbo].[clients] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[files] CHECK CONSTRAINT [FK_files_client]
GO
value_text
bàn:
CREATE TABLE [dbo].[value_text](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[id_file] [bigint] NOT NULL DEFAULT ((0)),
[id_field] [bigint] NOT NULL DEFAULT ((0)),
[value] [nvarchar](255) NULL DEFAULT (NULL),
[id_doc] [bigint] NULL DEFAULT (NULL)
CONSTRAINT [PK_value_text_id] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
ALTER TABLE [dbo].[value_text] WITH NOCHECK ADD CONSTRAINT [FK_valuesT_field] FOREIGN KEY([id_field])
REFERENCES [dbo].[fields] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[value_text] CHECK CONSTRAINT [FK_valuesT_field]
GO
Kế hoạch thực hiện:
* Tôi đã dịch các bảng và các trường trong câu hỏi này để hiểu chung. Trong hình ảnh này, "archivos" tương đương với "tập tin", "khách hàng" của "khách hàng" và "valores tựa" của "value lòng".
Kế hoạch thực hiện mà không có DISTINCT
:
Kế hoạch thực hiện mà không có DISTINCT
và GROUP BY
(truy vấn nhanh hơn một chút):
Kiểm tra truy vấn (câu trả lời Krismorte)
Đây là kế hoạch thực hiện của truy vấn chậm hơn trước. Ở đây, truy vấn trả về cho tôi hơn 400.000 hàng, nhưng thậm chí phân trang kết quả, không có thay đổi.
Kế hoạch thực hiện chi tiết hơn: https://www.brentozar.com/pastetheplan/?id=By_UC2aBG
Và đây là kế hoạch thực hiện của truy vấn nhanh hơn trước. Tại đây, truy vấn trả về hơn 65.000 hàng.
Kế hoạch thực hiện chi tiết hơn: https://www.brentozar.com/pastetheplan/?id=r116e6pSM