Công nghệ thông tin<br />
<br />
NGHIÊN CỨU KỸ THUẬT TIỀN XỬ LÝ DỮ LIỆU TRONG<br />
TỐI ƯU TRUY VẤN CƠ SỞ DỮ LIỆU CÓ KÍCH THƯỚC LỚN<br />
Cao Đăng Huy*, Nguyễn Nhật An<br />
Tóm tắt: Tối ưu hóa cơ sở dữ liệu là một vấn đề rất quan trọng trong việc xây<br />
dựng các ứng dụng cơ sở dữ liệu. Có nhiều công nghệ và kỹ thuật được áp dụng cho<br />
việc tối ưu cơ sở dữ liệu như đặt chỉ mục, phân mảnh dữ liệu…vv; tuy nhiên với ứng<br />
dụng có dữ liệu quá lớn hoặc có tần suất truy cập đồng thời rất cao và những truy vấn<br />
dữ liệu khá phức tạp thì những kỹ thuật này chỉ có thể đạt đến một giới hạn nhất định<br />
nào đó. Trong bài viết này chúng tôi đề xuất kỹ thuật tiền xử lý dữ liệu nhằm tạo ra<br />
các dữ liệu có những định dạng phù hợp mà có thể kết hợp với những kỹ thuật truyền<br />
thống nhằm tối ưu các truy vấn cơ sở dữ liệu có kích thước lớn. Bài viết đồng thời<br />
cũng phân lớp và đề xuất mô hình triển khai cho việc tiền xử lý dữ liệu một cách hiệu<br />
quả. Kết quả thử nghiệm cho bài toán reverse geocode trên dữ liệu không gian trên<br />
tập dữ liệu mẫu mà chúng tôi đề xuất có thể cải thiện tốc độ hơn 54 lần và việc triển<br />
khai nó trong thực tế cho phép chúng tôi có thể tạo ra được những báo cáo về dữ liệu<br />
của hàng trăm triệu đến hàng chục tỷ bản ghi trong thời gian chấp nhận được. Điều<br />
này cho thấy cách tiếp cận này là rất khả quan.<br />
Từ khóa: Tối ưu cơ sở dữ liệu; Tiền xử lý; Phân mảnh dữ liệu.<br />
<br />
1. ĐẶT VẤN ĐỀ<br />
Tối ưu hóa về cơ sở dữ liệu là một chủ đề rất được quan tâm và nghiên cứu.<br />
Khi xây dựng một hệ thống phần mềm với một cơ sở dữ liệu lớn, có nhiều truy vấn<br />
và cập nhật đồng thời thì vấn đề này là cực kỳ quan trọng vì nó ảnh hưởng rất lớn<br />
đến sự đáp ứng của hệ thống, trải nghiệm người dùng, thậm chí là sự ổn định, tồn<br />
vong của cả một hệ thống phần mềm.<br />
Có nhiều giải pháp để tối ưu hóa cơ sở dữ liệu như chuẩn hóa thiết kế, đặt<br />
chỉ mục index hợp lý, thiết lập cấu hình hệ thống, tối ưu các câu hỏi truy vấn và<br />
phân mảnh dữ liệu [4]. Tuy nhiên với dữ liệu có kích thước quá lớn hoặc có tần<br />
suất truy cập rất cao mà câu hỏi truy vấn dữ liệu lại phức tạp thì những giải pháp<br />
này chỉ đạt đến một giới hạn nhất định. Đòi hỏi phải có một giải pháp mới để xử lý<br />
vấn đề này và chúng tôi đề xuất là sử dụng kỹ thuật tiền xử lý dữ liệu.<br />
Tiền xử lý dữ liệu là quá trình biến đổi dữ liệu sang một định dạng mới<br />
phục vụ cho một quá trình phân tích, xử lý dữ liệu nào đó. Thuật ngữ này là khá<br />
phổ biến trong khai phá dữ liệu, trí tuệ nhân tạo, xử lý ngôn ngữ và học máy…vv.<br />
Tuy nhiên trong bài viết này đề cập đến một phạm vi hẹp là sử dụng kỹ thuật tiền<br />
xử lý dữ liệu để tối ưu các truy vấn dữ liệu.<br />
Như chúng ta đã biết hiện nay đa số các cơ sở dữ liệu dựa trên mô hình dữ<br />
liệu quan hệ bởi tính tiện lợi, toàn vẹn và nhất quán của dữ liệu. trong đó tất cả các<br />
thông tin của nó được lưu trữ trong các bảng có các cột và hàng và có mối quan hệ<br />
với nhau. Các truy vấn đến dữ liệu được thông qua ngôn ngữ truy vấn có cấu trúc<br />
SQL để trích xuất một phần hoặc toàn bộ dữ liệu trong các bảng này. Ngôn ngữ<br />
truy vấn có cấu trúc SQL chủ yếu dựa trên các phép toán của đại số quan hệ. Gồm<br />
<br />
<br />
208 C. Đ. Huy, N. N. An, “Nghiên cứu kỹ thuật tiền xử lý … dữ liệu có kích thước lớn.”<br />
Thông tin khoa học công nghệ<br />
<br />
các phép toán 1 ngôi như chọn, phép chiếu, phép gán, phép đổi tên và các phép<br />
toán 2 ngôi như tích decac, giao (Intersection), hợp (union), hiệu (minus), nối<br />
(join), chia (Division). Ngoài ra các hệ quản trị cơ sở dữ liệu hiện đại còn tích hợp<br />
thêm một số phép toán như các hàm tập hợp (Aggregate function), Gom nhóm các<br />
bộ dữ liệu (Grouping) và Phép kết mở rộng (Outer Join). Các thực thể trong cơ sở<br />
dữ liệu quan hệ được phân biệt với nhau thông qua giá trị của nó do vậy cơ sở dữ<br />
liệu quan hệ là cơ sở dữ liệu hướng giá trị (value oriented). Các bộ hay bản ghi của<br />
dữ liệu được phân biệt với nhau bởi các giá trị của nó do vậy việc lựa chọn trích<br />
xuất dữ liệu trong cơ sở dữ liệu hoàn toàn dựa vào giá trị của dữ liệu<br />
Việc truy vấn dựa trên giá trị của dữ liệu sẽ có những hạn chế nhất định về<br />
mặt tốc độ nhất là khi dữ liệu có kích thước lớn do phải thực hiện việc quét (scan)<br />
dữ liệu trong các bảng. Hiệu năng của một truy vấn được dựa trên chi phí (cost) mà<br />
truy vấn đó chiếm dụng tài nguyên hệ thống:<br />
cA(all)=cD(lưu trữ)+cM(Memory)+cN(Networking)+cL(lock)+cC(CPU) [7]<br />
Trong đó:<br />
cD: là chi phí đọc ghi đĩa lưu trữ (bộ nhớ ngoài) liên quan đến truy vấn<br />
cM: chi phí thao tác đến bộ nhớ trong liên quan đến truy vấn<br />
cN: chi phí về truyền thông mạng là số băng thông mạng mà truy vấn chiếm<br />
dụng<br />
cL: là chi phí liên quan đến tranh chấp khóa của truy vấn. Các cơ sở dữ liệu<br />
hiện đại đưa các khóa (lock) vào để quản lý việc truy cập đồng thời và các chỉ mục<br />
(index) để tối ưu truy vấn và việc thay đổi cũng như đọc dữ liệu vì vậy sẽ tiêu tốn<br />
tài nguyên của hệ thống liên quan đến khóa<br />
cC: phí phí liên quan đến tài nguyên chiếm dụng CPU của truy vấn.<br />
Hiệu năng của một hệ thống cơ sở dữ liệu là tổng chi phí của tất cả các yêu<br />
cầu truy vấn phát sinh trong một đơn vị thời gian :<br />
<br />
<br />
<br />
Trong đó N là số truy vấn trong một đơn vị thời gian, cj là chi phí của truy<br />
vấn j<br />
Như vậy mấu chốt của vấn đề là muốn nâng cao hiệu năng của hệ thống thì<br />
phải giảm chi phí tài nguyên của các truy vấn đến cơ sở dữ liệu.<br />
Ngoài việc chuẩn hóa thiết kế để tránh dư thừa dữ liệu và đảm bảo tính toàn<br />
vẹn, chuẩn hóa và tối ưu các câu lệnh sql để cải thiện hiệu năng truy vấn, các hệ<br />
quản trị cơ sở dữ liệu đưa việc đặt chỉ mục (index) để đảm bảo rằng thay vì việc tìm<br />
dữ liệu trong một danh sách không được sắp xếp thì chuyển việc tìm kiếm trong<br />
một danh sách đã được sắp xếp. Ngoài ra các hệ quản trị cơ sở dữ liệu hiện đại đưa<br />
<br />
<br />
<br />
<br />
Tạp chí Nghiên cứu KH&CN quân sự, Số Đặc san CNTT, 11 - 2018 209<br />
Công nghệ thông tin<br />
<br />
ra các công nghệ về phân mảnh dữ liệu đó là quá trình phân chia dữ liệu thành<br />
nhiều đoạn và việc phân chia này cũng dựa trên các chỉ mục index [4].<br />
Trên thực tế có nhiều dạng dữ liệu mà việc đặt chỉ mục là không hề dễ dàng<br />
ví dụ như những dữ liệu không có cấu trúc hoặc có cấu trúc phức tạp như dữ liệu<br />
không gian. Các chỉ mục chỉ hiệu quả khi chúng được tìm kiếm và so sánh dựa trên<br />
các toán tử (operator) và sẽ mất hoàn toàn hiệu quả khi sử dụng các hàm (function)<br />
dù nó là hàm của hệ quản trị cơ sở dữ liệu (system function), hàm do người dùng tự<br />
định nghĩa (user define function) hay hàm của các tool bổ sung thêm (add in<br />
function). Trong trường hợp này việc đặt chỉ mục và phân mảnh dựa trên các dữ<br />
liệu hiện có nhằm tối ưu tối ưu truy vấn là rất khó để thực hiện đòi hỏi chúng ta<br />
phải tạo ra các dữ liệu mới thì mới có thể đặt chỉ mục được [5],[6]<br />
Với cơ sở dữ liệu có kích thước lớn (hàng trăm triệu đến hàng trăm tỷ bản<br />
ghi và dung lượng có thể đạt đến nhiều TB dữ liệu) các truy vấn có thể lấy dữ liệu<br />
từ nhiều bảng thì việc truy vấn dữ liệu rất chậm và trong rất nhiều trường hợp là<br />
không khả thi, khả năng đáp ứng đồng thời nhiều truy vấn cùng lúc là rất khó và có<br />
thể gây nên hiện tượng dead lock (khóa chết) gián đoạn hệ thống và tệ hơn có thể<br />
gây nên việc hỏng và mất dữ liệu. Ngoài ra với những hệ thống có số lượng truy<br />
cập truy vấn dữ liệu đồng thời rất lớn như truy vấn thông tin địa chỉ trên bản đồ<br />
reverse geocode thì mặc dù khối lượng dữ liệu có thể không quá lớn nhưng tần suất<br />
quá lớn (hàng vạn thậm chí hàng chục triệu truy vấn đồng thời) cũng có thể gây nên<br />
quá tải hệ thống đòi hỏi chúng ta phải có giải pháp để nâng cao hiệu năng của các<br />
truy vấn đến cơ sở dữ liệu.<br />
Chúng tôi đề xuất giải pháp là dùng kỹ thuật tiền xử lý dữ liệu để nâng cao<br />
tính hiệu quả của các truy vấn cơ sở dữ liệu. Đó là những kỹ thuật tính toán, xử lý<br />
trước để tạo ra các định dạng dữ liệu mới nhằm cải thiện hiệu năng một cách rõ rệt<br />
cho việc truy vấn dữ liệu. Các kỹ thuật này đã được chúng tôi áp dụng và mang lại<br />
một hiệu quả rõ rệt cho những hệ thống có kích thước dữ liệu tương đối lớn hoặc có<br />
nhiều truy cập khai thác đồng thời. Chúng tôi phân loại tiền xử lý dữ liệu thành 2<br />
dạng là tạo ra các dữ liệu trên cũng một bảng truy vấn và tạo ra một số bảng dữ liệu<br />
tóm tắt hoàn toàn mới dựa trên việc rút gọn và tóm tắt các dữ liệu hiện có và đề<br />
xuất mô hình xử lý đối với hai dạng dữ liệu đó.<br />
2. MÔ HÌNH TIỀN XỬ LÝ DỮ LIỆU TRONG TỐI ƯU TRUY VẤN<br />
Tiền xử lý dữ liệu chính là bước tạo ra các dữ liệu trung gian với một định<br />
dạng và nội dung phù hợp mà dựa trên nó chúng ta có thể cải thiện một cách hiệu<br />
quả hiệu năng truy vấn đến cơ sở dữ liệu và thậm chí là hiệu năng trong quản lý bảo<br />
trì và lưu trữ dữ liệu.<br />
Dựa trên đặc tính và định dạng của dữ liệu và nội dung truy vấn chúng tôi<br />
đề xuất hai mô hình tiền xử lý dữ liệu.<br />
<br />
<br />
210 C. Đ. Huy, N. N. An, “Nghiên cứu kỹ thuật tiền xử lý … dữ liệu có kích thước lớn.”<br />
Thông tin khoa học công nghệ<br />
<br />
2.1. Tiền xử lý tạo ra các các dữ liệu trên cùng một bảng truy vấn.<br />
Kỹ thuật này được áp dụng đối với những truy vấn liên quan đến bảng có kích<br />
thước dữ liệu khá lớn hoặc tần suất khai thác nhiều lần mà các truy vấn đến nó là<br />
rất khó khăn trong việc thiết kế và sử dụng chỉ mục index, các điều kiện tìm kiếm<br />
sau lệnh where hoặc join là rất phức tạp đòi hỏi chi phí tính toán lớn cũng như chi<br />
phí về quét dữ liệu khi scan bảng đòi hỏi phải đọc dữ liệu rất nhiều từ toàn bộ bảng.<br />
Để giải quyết vấn đề này chúng ta sẽ tạo thêm một hoặc một số cột dữ liệu ở<br />
trên bảng mà giá trị của nó được tính toán dựa trên các cột hiện có và có định dạng<br />
phù hợp cho việc tạo chỉ mục cũng như hỗ trợ tốt việc phân mảnh dữ liệu nếu có<br />
(trong trường hợp số lượng bản ghi của bảng quá lớn). Thực chất của quá trình này<br />
là chúng ta đã phi chuẩn hóa về dữ liệu (de-normal) tạo ra các phụ thuộc hàm dựa<br />
trên các thuộc tính hiện có của bảng. Với những cột mới này chúng ta sẽ tạo chỉ<br />
mục tìm kiếm phù hợp và chỉnh sửa lại nội dung cú pháp các câu lệnh truy vấn để<br />
hướng đến việc sử dụng chỉ mục và phân đoạn bảng (với các bảng có dữ liệu lớn)<br />
Để thực hiện việc tiền xử lý trên cùng một bảng chúng ta sẽ thực hiện các bước<br />
như sau:<br />
<br />
<br />
<br />
<br />
Hình 1. sơ đồ các bước tiền xử lý dữ liệu trên cùng một bảng.<br />
Bước 1: Phân tích kích bản thực thi của truy vấn SQL hiện có, phân tích các<br />
tham số đầu vào Input của truy vấn và thứ tự các thao tác vật lý và logic mà bộ thực<br />
thi truy vấn của hệ quản trị cơ sở dữ liệu thực hiện để xử lý và trả kết quả truy vấn.<br />
Đặc biệt chú ý đến việc quét bảng và chỉ mục để tìm các tiến trình và thao tác có<br />
chi phí lớn nhất và có khả năng cải thiện được nhiều nhất. Chúng ta có thể sử dụng<br />
các công cụ hiện có của hệ quản trị cơ sở dữ liệu để thực hiện điều này. Ví dụ trong<br />
sql server chúng ta có thể sử dụng công cụ Estimated Execution Plan.<br />
Bước 2: Thêm các cột nhằm phục vụ cho việc tính toán tiền xử lý vào bảng liên<br />
quan đến truy vấn. Cột thêm vào nhằm tạo chỉ mục tìm kiếm và tối ưu hóa phép<br />
chọn. Tạo chỉ mục index từ các cột vừa tạo. Nếu dữ liệu của bảng quá lớn (>1GB)<br />
thì có thể phân mảnh bảng dữ liệu dựa trên chỉ mục vừa tạo để cải thiện hiệu suất<br />
quét bảng và truy vấn.<br />
<br />
<br />
Tạp chí Nghiên cứu KH&CN quân sự, Số Đặc san CNTT, 11 - 2018 211<br />
Công nghệ thông tin<br />
<br />
Bước 3: Cập nhật các số liệu tiền xử lý vào các cột đã tạo mới một cách chính<br />
xác trong các tiến trình nền.<br />
Bước 4: Bổ sung các điều kiện lọc hướng tới chỉ mục tìm kiếm vào câu lệnh<br />
truy vấn SQL. điều kiện lọc liên quan đến chỉ mục phải được ưu tiên đầu tiên trong<br />
các điều kiện lọc sau lệnh where và lệnh join. Với bảng phân đoạn thì điều kiện lọc<br />
liên quan đến chỉ mục của phân đoạn bảng phải được nằm ở vị trí ưu tiên cao nhất<br />
trong thứ tự các điều kiện lọc này. Tránh tuyệt đối sử dụng hàm trong các điều kiện<br />
lọc mới bổ sung thêm.<br />
2.2. Tiền xử lý tóm tắt dữ liệu từ nhiều bảng<br />
Kỹ thuật này được áp dụng trên những truy vấn mà cần lấy dữ liệu từ nhiều<br />
bảng với khối lượng dữ liệu rất lớn có thể lên đến nhiều tỷ bản ghi vì vậy truy vấn<br />
cần phải có nhiều phép hợp union và phép nối join trên nhiều bảng, và do nó quét<br />
dữ liệu từ nhiều bảng rất lớn nên chiếm dụng I/O đĩa cứng, tài nguyên khóa và CPU<br />
nên nó sẽ không thể chạy được trong thời gian chấp nhận được cũng như có thể gây<br />
treo hệ thống, deadlock (khóa chết) thậm chí là hỏng hóc dữ liệu. Với những truy<br />
vấn kiểu này chúng tôi đề xuất là xây dựng những bảng dữ liệu trung gian lưu trữ<br />
các dữ liệu tổng hợp và tóm tắt để phục vụ cho việc tối ưu tốc độ của các truy vấn<br />
liên quan đến tổng hợp dữ liệu<br />
Các dữ liệu tóm tắt sẽ được thiết kế theo nguyên tắc sau:Dựa trên định dạng<br />
thông tin đầu ra của các truy vấn<br />
- Các dữ liệu tóm tắt có số lượng bản ghi ít hơn nhiều lần so với số lượng bản<br />
ghi của dữ liệu gốc và chứa đựng các nguyên tố của truy vấn đầu ra.<br />
- Dữ liệu tóm tắt được đánh chỉ mục index dựa trên các tham số đầu vào của<br />
truy vấn.<br />
- Bảng dữ liệu quá lớn (>2GB) có thể phân mảnh dựa trên thông tin trong chỉ<br />
mục index để tối ưu hóa tốc độ truy vấn và quản lý cũng như bảo trì hiệu<br />
quả dữ liệu.<br />
Để thực hiện việc tiền xử lý tóm tắt dữ liệu chúng ta sẽ thực hiện các bước<br />
như sau:<br />
<br />
<br />
<br />
<br />
Hình 2. sơ đồ các bước tiền xử lý tóm tắt dữ liệu từ nhiều bảng.<br />
<br />
<br />
212 C. Đ. Huy, N. N. An, “Nghiên cứu kỹ thuật tiền xử lý … dữ liệu có kích thước lớn.”<br />
Thông tin khoa học công nghệ<br />
<br />
Bước 1: Phân tích về tần suất các truy vấn và nội dung dữ liệu tổng hợp của<br />
các truy vấn, nghiên cứu về các định dạng dữ liệu đầu ra và xác định nguyên tố của<br />
các truy vấn đầu ra ví dụ chúng ta cần truy vấn tổng hợp của các cá nhân, phòng<br />
ban của một công ty trong một ngày, tháng, năm thì bản ghi nguyên tố chính là tổng<br />
hợp trong ngày của một cá nhân. Như vậy các thông tin tổng hợp của cá<br />
nhân,phòng ban trong một khoảng thời gian ngày, tháng có thể được lấy từ các<br />
thông tin tổng hợp của các cá nhân trong một số ngày nào đó.<br />
Bước 2: thiết kế các bảng dữ liệu tóm tắt chứa các bản ghi là các thông tin<br />
tóm tắt về dữ liệu phục vụ cho mục đích truy vấn mỗi hàng là một nguyên tố<br />
(atomic) của các dữ liệu báo cáo đầu ra, Xây dựng các chỉ mục tìm kiếm liên quan<br />
đến các điều kiện lọc của dữ liệu, phân mảnh dữ liệu nếu cần. Kích thước bảng này<br />
bé hơn rất nhiều lần so với dữ liệu gốc<br />
Bước 3: xây dựng các tiến trình nền Background process để tiền xử lý dữ<br />
liệu nhằm ghi nhận dữ liệu vào các bảng tóm tắt mà chúng ta xây dựng ở bước 3.<br />
Bước 4: Sửa đổi các câu lệnh truy vấn để truy cập dữ liệu trực tiếp vào các<br />
bảng tóm tắt thay vì tổng hợp từ nhiều bảng. lưu ý về sử dụng chỉ mục trong các<br />
câu lệnh tóm tắt này để nâng cao hiệu năng truy vấn.<br />
3. THỬ NGHIỆM VÀ ĐÁNH GIÁ<br />
Chúng ta sẽ thử nghiệm trên bài toán truy vấn thông tin địa lý mà cụ thể là<br />
địa chỉ trên nền bản đồ reverse geocoding trên dữ liệu không gian địa lý trong SQL<br />
Server 2014. Đây là một bài toán rất quan trọng và có ý nghĩa ứng dụng rất lớn và<br />
là một tính năng cơ bản của các công cụ bản đồ nổi tiếng Google map, Bing map<br />
hay việt bản đồ…vv. Bài toán này được ứng dụng nhiều trên các sản phẩm thương<br />
mại như Uber, Grab…vv. Một số đặc điểm đáng chú ý trong bài toán này là chúng<br />
có số lượng truy vấn đồng thời rất lớn có thể đạt đến hàng triệu, hàng chục triệu từ<br />
những nguồn dữ liệu có cấu trúc phức tạp như dữ liệu không gian vốn là khá khó<br />
khăn trong việc đánh chỉ mục để tìm kiếm.<br />
3.1. Bài toán gốc<br />
Cơ sở dữ liệu mẫu chúng tôi dùng để thử nghiệm là cơ sở dữ liệu không<br />
gian có 2 lớp địa lý là lớp Địa danh hành chính (Tỉnh, huyện, xã) và lớp đường giao<br />
thông của Việt Nam và được tổ chức vào 2 bảng như sau:<br />
Bảng 1. Cấu trúc bảng dữ liệu gốc tblVillage.<br />
Tên cột Loại dữ liệu Loại cột Mô tả<br />
VillageID smallint Khóa chính Mã địa danh<br />
VillageName Nvarchar(30) Tên xã phường<br />
DistrictName Nvarchar(30) Tên quận, huyện<br />
ProvinceName Nvarchar(30) Tên tỉnh, thành phố<br />
<br />
<br />
Tạp chí Nghiên cứu KH&CN quân sự, Số Đặc san CNTT, 11 - 2018 213<br />
Công nghệ thông tin<br />
<br />
Geom Geometry Dữ liệu không<br />
gian<br />
Dữ liệu này bao gồm lớp hành chính của gần 12.000 xã phường ở Việt Nam<br />
bao gồm cả dữ liệu không gian chứa đựng trong trường Geom<br />
Bảng 2. Cấu trúc bảng dữ liệu gốc tblRoad.<br />
Tên cột Loại dữ liệu Loại cột<br />
RoadID int Khóa chính Mã đường<br />
RoadName Nvarchar(80) Tên đường<br />
RoadType tinyint Loại đường:cao tốc, quốc lô,<br />
tỉnh lộ<br />
Geom geometry Dữ liệu không gian<br />
Dữ liệu đường giao thông mà chung tôi thử nghiệm gồm khoảng hơn 200.000<br />
đoạn đường giao thông ở Việt Nam. Nó bao gồm Gần như tất cả các đường giao<br />
thông có tên trên bản đồ google map đến quý 2 năm 2017<br />
Truy vấn mà chúng tôi minh họa ở đây là truy vấn truy vấn địa chỉ dựa trên tọa<br />
độ đầu vào reverse geocoding, tham số đầu vào là tọa độ GPS tại một điểm trên bản<br />
đồ số và đầu ra là địa chỉ của điểm đó (tên đường, xã phường, quận huyện, tỉnh<br />
thành phố). Đây là một truy vấn có tần suất rất lớn trên các dịch vụ bản đồ của<br />
goole map, bing map và việt bản đồ.<br />
Để lấy kết quả chúng ta cần thực hiện 2 truy vấn trên 2 bảng khác nhau là<br />
tblVilage và tblRoad<br />
Để lấy thông tin địa chỉ xã phường, quận huyện, tỉnh thành phố chúng ta sẽ<br />
thực hiện query sau:<br />
declare @Point geometry,@str nvarchar(60), @str nvarchar(60)@Lng<br />
decimal(9,6)=105.7993966,@Lat decimal(8,6)=21.0435112<br />
set @Point=geometry::Point(@Lng,@Lat,4326)<br />
select @str=VilageName+', '+DistrictName+', '+ProvinceName from tblVilage<br />
where Geom.STIntersects(@Point)=1<br />
select @str=RoadName+’, ’+@str from tblRoad where<br />
Geom.STDistance(@Point)