Điều gì có thể tăng tốc truy vấn số SQL?


9

Khi thực hiện truy vấn SQL tổng hợp (tổng hợp), điều gì có thể tăng tốc thời gian thực hiện trong 3 hệ thống cơ sở dữ liệu này? Tôi chắc chắn nhiều thứ có thể tăng tốc (phần cứng cho một), nhưng tôi chỉ là một DBA mới làm quen, vì vậy tôi chắc chắn tôi sẽ nhận được một vài câu trả lời ở đây. Tôi đã di chuyển khoảng 157 triệu hàng vào cơ sở dữ liệu SQL Server và truy vấn này sẽ mất mãi mãi. Nhưng trong cơ sở dữ liệu Netezza nguồn của tôi, phải mất vài giây.

Ví dụ:

Netezza 6:

SELECT COUNT(*) FROM DATABASENAME..MYTABLE

Oracle 11g:

SELECT COUNT(*) FROM MYTABLE

Máy chủ SQL 2012:

SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]


1
Bạn có cần phải làm điều này chỉ một lần, hoặc lặp đi lặp lại?
Jon Seigel

@JonSeigel chúng tôi đang thực hiện tải tăng dần và chúng tôi đang so sánh các bản ghi giữa các hệ thống cơ sở dữ liệu mỗi ngày để đảm bảo số lượng cộng lại. Cứ thế lặp đi lặp lại.
MacGyver

Câu trả lời:


10

Netezza là một thiết bị được thiết kế để vượt trội khi quét bảng lớn, vì vậy đó là lý do tại sao bạn nhận được kết quả nhanh như vậy trên hệ thống đó.

Đối với Máy chủ SQL của bạn, bạn có thể tăng tốc đáng kể số lượng hàng bằng cách truy vấn từ sys.dm_db_partition_stats DMV.

SELECT s.name AS [Schema], o.name AS [Table], SUM(p.row_count) AS [RowCount]
FROM sys.dm_db_partition_stats p JOIN sys.objects o
ON p.object_id = o.object_id JOIN sys.schemas s
ON o.schema_id = s.schema_id
WHERE p.index_id < 2
AND o.object_id = object_id('MyTable')
GROUP BY o.name, s.name;

Trong môi trường giao dịch cao, DMV này không được đảm bảo chính xác 100%. Nhưng từ câu hỏi của bạn, có vẻ như bạn chỉ đang đếm số hàng để xác minh từng bảng sau khi di chuyển, vì vậy truy vấn này sẽ phù hợp với bạn.


4
@Phil tại sao? Nếu bạn lặp qua các bảng và thực hiện một CHỌN (*) đắt tiền từ mỗi bảng - kết quả đầu tiên chính xác đến mức nào khi bạn đạt được bảng cuối cùng?
Aaron Bertrand

1
Để rõ ràng, Phil đã nói: "Sử dụng từ điển dữ liệu, không cung cấp kết quả chính xác 100% là lời khuyên tồi. Theo tôi, câu trả lời nên được chỉnh sửa để xóa đề xuất hoặc xóa - hãy nhớ mọi người google cho câu trả lời như vậy và sẽ mù quáng cắt và dán ... "Tôi đồng ý rằng từ chối trách nhiệm là quan trọng (và có một số trường hợp bị cho là siêu dữ liệu không trả về kết quả hợp lý), tôi không đồng ý rằng việc sử dụng các chế độ xem siêu dữ liệu nói chung là lời khuyên tồi.
Aaron Bertrand

5

Đây là một giải pháp SQL Server sử dụng COUNT_BIGbên trong một khung nhìn được lập chỉ mục. Điều này sẽ giúp bạn có được số lượng thống nhất về giao dịch mà không cần quét bảng lớn hoặc quét chỉ mục và không cần lưu trữ cần thiết cho lần sau:

CREATE TABLE [dbo].[MyTable](id int);
GO

CREATE VIEW [dbo].[MyTableRowCount]
    WITH SCHEMABINDING
AS

    SELECT
        COUNT_BIG(*) AS TableRowCount
        FROM [dbo].[MyTable];
GO

CREATE UNIQUE CLUSTERED INDEX IX_MyTableRowCount
    ON [dbo].[MyTableRowCount](TableRowCount);
GO

SELECT
    TableRowCount
    FROM [dbo].[MyTableRowCount] WITH(NOEXPAND);

Điều này sẽ yêu cầu một lần quét ban đầu (không thoát khỏi điều này) và thêm một chút chi phí cho các thao tác dữ liệu bảng gia tăng. Nếu bạn đang thực hiện các hoạt động lớn với nhiều dữ liệu (trái ngược với nhiều hoạt động nhỏ), tôi nghĩ rằng chi phí thay đổi sẽ không đáng kể.


@QueryKiwi: Làm thế nào để đọc bị chặn trước năm 2012? Lỗi máy chủ SQL?
Jon Seigel

@JonSeigel - 0,05 đô la của tôi: Các chỉ mục cụm bình thường trên bảng bình thường được tạo ngoại tuyến áp dụng khóa Sch-M trên bảng. Theo quan điểm, tất nhiên là không cần thiết nhưng điều này có nghĩa là một sự thay đổi trong hoạt động Tạo chỉ mục để tạo trường hợp đặc biệt cho chế độ xem được lập chỉ mục - được thực hiện cho SQL2012. IMHO, tất nhiên.
Fabricio Araujo

3

Trong Oracle, chỉ mục cây nhị phân trên cột KHÔNG NULL có thể được sử dụng để trả lời COUNT (*). Nó sẽ nhanh hơn trong hầu hết các trường hợp so với SCAN FULL TABLE vì các chỉ mục thường nhỏ hơn bảng cơ sở của chúng.

Tuy nhiên, một chỉ số cây nhị phân thông thường vẫn sẽ rất lớn với 157 Mrows. Nếu bảng của bạn không được cập nhật đồng thời (ví dụ: chỉ quá trình tải hàng loạt), thì bạn có thể muốn sử dụng chỉ mục bitmap thay thế.

Chỉ số bitmap nhỏ nhất sẽ là một cái gì đó như thế này:

CREATE BITMAP INDEX ix ON your_table(NULL);

Các mục Null được tính đến bởi một chỉ mục bitmap. Chỉ số kết quả sẽ rất nhỏ (20-30 khối 8k trên một triệu hàng) so với chỉ số cây nhị phân thông thường hoặc bảng cơ sở.

Kế hoạch kết quả sẽ hiển thị các hoạt động sau:

----------------------------------------------
| Id  | Operation                     | Name | 
----------------------------------------------
|   0 | SELECT STATEMENT              |      |
|   1 |  SORT AGGREGATE               |      |
|   2 |   BITMAP CONVERSION COUNT     |      |
|   3 |    BITMAP INDEX FAST FULL SCAN| IX   |
----------------------------------------------

Nếu bảng của bạn được cập nhật đồng thời, chỉ mục bitmap có giá trị duy nhất sẽ là điểm gây tranh cãi và không nên sử dụng.


3

Trong Oracle, truy vấn đếm đơn giản thường được thực hiện bằng cách quét một chỉ mục thay vì toàn bộ bảng. Chỉ mục phải là chỉ mục bitmap hoặc được xác định trên một cột có ràng buộc KHÔNG NULL. Đối với các truy vấn phức tạp hơn yêu cầu quét toàn bộ bảng, bạn có thể sử dụng truy vấn song song.

Để bật truy vấn song song (Yêu cầu Phiên bản doanh nghiệp), bạn có thể sử dụng gợi ý tối ưu hóa:

select /*+ PARALLEL(mytable, 12) */ count(*) from mytable;

Hoặc bật truy vấn song song cho tất cả các truy vấn trên bảng:

alter table mytable parallel 12;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.