Tối ưu hóa truy vấn Geometry.STIntersect


8

Tôi đang cố gắng chuyển các thói quen Geoprocessing đơn giản từ các quy trình dựa trên ESRI sang SQL Server. Giả định của tôi là nó sẽ hiệu quả hơn nhiều. Đối với thử nghiệm ban đầu của tôi, tôi đang làm việc trên một thói quen giao nhau để liên kết dữ liệu tuyến tính chồng chéo.

Trong bảng WCASING của tôi, tôi có 1610 hồ sơ. Tôi đang cố gắng liên kết các Vỏ bọc này với nguồn điện liên kết của chúng. Tôi có ~ 277.000 Mains. Tôi có ~ 1.600 vỏ.

Tôi đang chạy truy vấn bên dưới để có được ý thức chung về việc mất bao lâu để tìm các kết quả khớp riêng lẻ. Truy vấn này trả về 5 giao điểm hợp lệ trong 40 giây.

SELECT Top 5 [WCASING].[OBJECTID] As CasingOBJECTID, 
    [WPUMPPRESSUREMAIN].[OBJECTID] AS MainObjectID, [WCASING].[Shape]
FROM [dbo].[WPUMPPRESSUREMAIN]
    JOIN [WCASING] 
        ON [WCASING].[Shape].STIntersects([WPUMPPRESSUREMAIN].[Shape]) = 1

Câu hỏi chính của tôi;

Quá trình này sẽ nhanh hơn tùy thuộc vào thứ tự tìm kiếm?

  • Tìm 'A' bên trong 'B' vs.
  • Tìm 'B' bên trong 'A'
  • Hoàn trả ban đầu cho 5 bản ghi từ các bộ dữ liệu này là không thành vấn đề

Quá trình này sẽ nhanh hơn, nếu lần đầu tiên tôi đệm để giới hạn một bộ chính nhỏ hơn và sau đó tìm kiếm?

Tôi có thể sử dụng Điều chỉnh máy chủ SQL để làm việc với các truy vấn dựa trên Hình học không?

SELECT WCASING.OBJECTID AS CasingOBJECTID,
    WPUMPPRESSUREMAIN.OBJECTID AS MainObjectID, WCASING.UFID AS UFID,
    WPUMPPRESSUREMAIN_IPS.UFID AS MainUFID, WCASING.SHAPE
INTO WCASING_INTDefsV6
FROM WCASING with (index([FDO_ShapeWC])) 
    INNER JOIN [WPUMPPRESSUREMAIN_IPS] ON 
        [WPUMPPRESSUREMAIN_IPS].Shape.STIntersects(WCASING.SHAPE) = 1

Truy vấn mới này đã được cải thiện định nghĩa.

  • Bây giờ cả hai bảng có chỉ mục không gian
  • Bảng vỏ trước đây (nhỏ hơn) không có Chỉ số không gian
    • Nó đã chứa một Chỉ mục không phân cụm

Các truy vấn cũng có câu lệnh with.

Truy vấn mới mất 37 phút. Truy vấn cũ mất 44 phút.

Tôi đã hy vọng cho kết quả tốt hơn và sẽ tiếp tục thử nghiệm.


1
vui quá phải không!?
DPSSpatial 04/05/2015

Thật tuyệt vời. Tôi đã ở một vị trí mới trong một năm, làm việc với các bộ dữ liệu rất lớn và đường cong học tập w / SQL Server là phần thú vị nhất. Tôi vẫn là một người mới theo nhiều cách, nhưng tôi đã học được một số thứ hay ho.
Rick Monteiro

1
Chúng tôi đã sử dụng các chức năng và dữ liệu không gian của SQL Server để phân tích trong gần 2 năm và chúng tôi sẽ không quay lại bất kỳ lúc nào !!!
DPSSpatial 04/05/2015

Tôi hy vọng việc buộc chỉ mục trên bảng lớn hơn (nguồn chính) sẽ có hiệu suất tốt hơn.
MickyT

Câu trả lời:


7

Tôi giả sử rằng bạn đang sử dụng Hình học, nhưng các phương pháp vẫn không thay đổi.

Khi điều chỉnh các truy vấn không gian, đây là các bước tôi thực hiện

  1. Đây là bước quan trọng nhất . Kiểm tra các chỉ số phù hợp cho bảng. Nếu bạn có SQL Server 2012+ thì tôi khuyên bạn nên sử dụng AUTO GRID. Điều này cung cấp cho bạn một lưới tốt hơn. Hãy chắc chắn rằng phạm vi bao phủ dữ liệu và không mở rộng ra xa nó. Nếu lập chỉ mục đa giác hoặc đường thì hãy thử và xác định một giá trị tế bào trên mỗi đối tượng hợp lý. Các tổng quan về lập chỉ mục không gian khá tốt tại giải thích nó.

  2. Viết truy vấn ở dạng đơn giản nhất trước. Kiểm tra Kế hoạch thực hiện ước tính để đảm bảo rằng chỉ số không gian bạn mong đợi đang được sử dụng. Chạy truy vấn và nhận thời gian và thống kê IO. Một kế hoạch thực hiện thực tế cũng sẽ hữu ích. Đây sẽ là cơ sở của bạn.

  3. Hãy thử các biến thể của truy vấn, bao gồm hoán đổi thứ tự của hình học trong so sánh hình học, v.v. Thu thập số liệu thống kê cho từng truy vấn.

  4. Hãy thử phá vỡ truy vấn trong các phần nhỏ hơn nếu có thể (chia và chinh phục). Đôi khi điều này dẫn đến một thực hiện nhanh hơn tổng thể.

  5. Nếu vẫn thất bại và bạn không thể có được các truy vấn của mình để sử dụng chỉ mục không gian, hãy sử dụng gợi ý chỉ mục. Đây là giải pháp cuối cùng và có khả năng có thể có vấn đề với việc lập chỉ mục trên bàn. Điều đó nói rằng trình tối ưu hóa không phải lúc nào cũng đúng.

Nhìn vào kế hoạch thực hiện và dành một chút thời gian để cố gắng hiểu chúng. Họ thực sự là bạn của bạn. Ngoài ra còn có các công cụ giúp họ dễ dàng giải thích hơn. Cái tôi sử dụng là SQL Sentry .

Đối với truy vấn bạn đã đăng, tôi nghĩ đó sẽ là người thực hiện tốt nhất, nhưng đây là một biến thể bạn có thể muốn thử. Ngoài ra, toán tử TOP sẽ ảnh hưởng đến cách xây dựng kế hoạch thực hiện, vì vậy điều đó có nghĩa là bạn có thể sẽ không có được sự so sánh tốt giữa các phương thức khác nhau.

SELECT c.[OBJECTID] As CasingOBJECTID, 
    x.[OBJECTID] AS MainObjectID, 
    c.[Shape]
FROM [WCASING] c -- Smallest Table
    CROSS APPLY (
        -- This query is essentially done for each casing
        SELECT p.[OBJECTID]
        FROM [dbo].[WPUMPPRESSUREMAIN] p -- Largest table
        WHERE p.[Shape].STIntersects(c.[Shape]) = 1 -- should use the pressure main spatial index
        ) x

1

Những gì tôi đã tìm thấy tăng tốc các truy vấn giao nhau này nhiều nhất là buộc chỉ số không gian:

Trong chế độ xem tôi phân phối tới BI giao với ~ 280.000 điểm địa chỉ với ~ 300 đa giác biên, tôi buộc sử dụng chỉ số không gian điểm địa chỉ:

...

FROM [dpsdata].[Address_Master] as am with (index(SIndx_AddrMsterIC))
  left outer join [dpsdata].[SchoolBoundaries_All_Projected] as sbp
  on (am.shape.STIntersects(sbp.shape) =1)

(Giả sử cả hai bảng đều có các chỉ số không gian được xây dựng tất nhiên ...)

Điều này mất gần 1 phút để chạy, xuống từ vài phút.

Trong trường hợp của bạn, một cái gì đó như thế này sẽ hoạt động:

SELECT Top 5 [WCASING].[OBJECTID] As CasingOBJECTID, 
    [WPUMPPRESSUREMAIN].[OBJECTID] AS MainObjectID, [WCASING].[Shape]
FROM [dbo].[WPUMPPRESSUREMAIN] with (index(PK__WPUMPPRE__E458E6E7F06C9A87)) 
    JOIN [WCASING] 
        ON [WCASING].[Shape].STIntersects([WPUMPPRESSUREMAIN].[Shape]) = 1

Tôi đã thử điều này. Nó không hoạt động theo cách tôi đã cố gắng thực hiện. "CHỌN 5 TUYỆT VỜI NHẤT "Trả về một lỗi. "Msg 319, Cấp 15, Trạng thái 1, Dòng 1 Cú pháp không chính xác gần từ khóa 'với'. Nếu câu lệnh này là biểu thức bảng chung, ..."
Rick Monteiro

Tôi chưa sử dụng tùy chọn 'với' trước đây. Đây có phải là cụ thể cho một lĩnh vực hoặc cho câu lệnh From nói chung. Tôi có thể có hai câu 'với' một cho mỗi bảng không? Câu hỏi thứ hai, chỉ số có nên là một chỉ số không gian?
Rick Monteiro

1a) 'với' được sử dụng trong trường hợp này trong câu lệnh TỪ và 1b) Tôi không biết liệu nó có hoạt động không nếu bạn sử dụng 2 'với' câu lệnh ... 2) Tôi chỉ thử điều này với chỉ số không gian
DPSSpatial 04/05/2015

1
Tôi đã cập nhật câu trả lời của mình để cho thấy cách bạn có thể sử dụng chỉ mục không gian của mình trong truy vấn trong bài đăng gốc của mình ...
DPSSpatial

1
@RichardMonteiro xin lỗi tôi đã quên 'với' trước chỉ số không gian trong câu trả lời của tôi bằng ví dụ của bạn ... Tôi đã cập nhật.
DPSSpatial
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.