SQL Server 2008 पर 70 मिलियन पॉइंट क्लाउड पर निकटतम पड़ोसी क्वेरी का अनुकूलन करें


16

SQL Server 2008 R2 एक्सप्रेस डेटाबेस में मेरा लगभग 75 मिलियन रिकॉर्ड है। प्रत्येक कुछ मान के अनुरूप एक लंबा लंबा है। तालिका में भूगोल कॉलम है। मैं दिए गए अक्षांश देशांतर (बिंदु) के लिए एक निकटतम पड़ोसी खोजने की कोशिश कर रहा हूं। मेरे पास पहले से ही स्थानिक सूचकांक के साथ एक क्वेरी है। लेकिन डेटाबेस में रिकॉर्ड कहां है, इसके आधार पर, पहली तिमाही या अंतिम तिमाही कहें, निकटतम पड़ोसी को खोजने के लिए क्वेरी को लगभग 3 से 30 सेकंड तक का समय लग सकता है। मुझे लगता है कि यह क्वेरी या स्थानिक सूचकांक को अनुकूलित करके बहुत तेज़ी से परिणाम देने के लिए अनुकूलित किया जा सकता है। अभी डिफ़ॉल्ट सेटिंग्स के साथ कुछ स्थानिक सूचकांक लागू किया है। यहां मेरी तालिका और क्वेरी जैसी दिखती है।

CREATE TABLE lidar(
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [POINTID] [int] NOT NULL,
    [GRID_CODE] [numeric](17, 8) NULL,
    [geom] [geography] NULL,
 CONSTRAINT [PK_lidar_1] PRIMARY KEY CLUSTERED ([id] ASC)
 WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
 ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

स्थानिक सूचकांक मैं उपयोग कर रहा हूँ:

CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) USING  GEOGRAPHY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,  
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

यहाँ मैं उपयोग कर रहा प्रश्न है:

declare @ms_at geography = 'POINT (-95.66 30.04)';
select TOP(1) nearPoints.geom.STAsText()as latlon 
from
(
select r.geom
from lidar r With(Index(SPATIAL_lidar))
where r.geom.STIntersects(@ms_at.STBuffer(1000)) = 1
) nearPoints

यहाँ मेरे डेटाबेस में lat longs का एक नमूना है। सटीकता और घनत्व का एक विचार देने के लिए। सभी 70 मिलियन रिकॉर्ड एक शहर (लिडार डेटा) के लिए हैं।

POINT (-95.669434934023087 30.049513838913736)

अब यह क्वेरी मुझे ऊपर बताए अनुसार परिणाम देती है, लेकिन मैं यथासंभव बेहतर प्रदर्शन करना चाहता हूं। मेरा अनुमान है कि स्थानिक सूचकांक के डिफ़ॉल्ट मानों को बेहतर बनाने के लिए मैं प्रदर्शन को बेहतर ढंग से अनुकूलित करने के लिए ऊपर हो सकता हूं। इस बारे में कोई सुराग?

मैंने बफर को 10 से 1000 तक अलग-अलग करने की कोशिश की लेकिन लगभग उसी परिणाम के साथ।

साथ ही प्रदर्शन में सुधार के लिए किसी अन्य सुझाव का स्वागत है।

यहाँ वह प्रणाली है जिसका मैं अभी उपयोग कर रहा हूँ:

Windows 7 64bit Professional
Intel(R) Core(TM)2 Quad CPU    Q9650  @ 3.00GHz (4 CPUs), ~3.0GHz
Ram: 8 GB
NVIDIA GeForce 9500 GT

1
क्या यह लिडार डेटा है? यदि ऐसा है तो एक lidarटैग जोड़ने पर विचार करें ।
कर्क कुयकेंडल

2
मैं SQL सर्वर नहीं बोलता, लेकिन यह मेरी अचूक नज़र को देखता है कि आपकी क्वेरी को लक्ष्य बिंदु के 1000 मीटर बफर के भीतर पड़े सभी बिंदुओं को ढूंढना है। ये प्वाइंट-इन-बहुभुज परीक्षण होने जा रहे हैं जिस तरह से धीमी निकटता परीक्षण है, जो अपने में की पेशकश समाधान के लिए आधार हैं की तुलना में पिछले प्रश्न
whuber

@ शुभकर्ता: मैंने दूरी आधारित प्रश्नों और मिनटों में समय की कोशिश की है। ऊँचा रास्ता। हो सकता है मैं कुछ गलत हो रहा हूँ बहुभुज में इन बिंदुओं के रूप में, सेकंड में समय लगता है। यहां तक ​​कि बफर को 10 से 10000 तक अलग-अलग करने से समय पर थोड़ा सा प्रभाव होता है।
शौनक

1
@ शौनक फिर कुछ दूरी पर आधारित प्रश्नों के साथ है, क्योंकि सैद्धांतिक रूप से वे केडी के पेड़ों जैसे उपयुक्त अनुक्रमों का उपयोग करके माइक्रोसेकंड (या बेहतर) और मिलीसेकंड (सबसे खराब स्थिति) में औसतन किया जा सकता है । आप बिंदु-इन-बफर खोज को अनुकूलित करने के तरीकों की तलाश करने के बजाय उन्हें सुधारने के बारे में सोचना चाह सकते हैं।
whuber

क्या यह ग्रिड डेटा है? क्यों एक रेखापुंज का उपयोग नहीं?
मैथ्यू स्नेप

जवाबों:


9

अपने स्थानिक सूचकांक का उपयोग कैसे किया जा रहा है, इस पर विवरण प्राप्त करने के लिए sp_help_spatial_geography_index संग्रहीत कार्यविधि को चलाने का प्रयास करें । आप का उपयोग करने में सक्षम होना चाहिए जैसे:

declare @ms_at geography = 'POINT (-95.66 30.04)'
set @ms_at = @ms_at.STBuffer(1000).STAsText()
exec sp_help_spatial_geography_index 'lidar', 'SPATIAL_lidar', 0, @ms_at;

अपने प्रश्न में परिणाम पोस्ट करके देखें कि क्या कुछ भी बाहर खड़ा है। प्रत्येक आइटम का अर्थ यहां पाया जा सकता है

यदि आपके निर्देशांक अनुमानित किए गए थे, तो आप गणना किए गए X, Y फ़ील्ड्स, और X <MinX और X> MaxX आदि पर एक साधारण गैर-स्थानिक क्वेरी भी कर सकते थे।

अपने निर्देशांक (एक GEOMETRY प्रकार के क्षेत्र में) को प्रोजेक्ट करना भी आपको अपने स्थानिक सूचकांक को डेटा की सीमा तक सीमित करने की अनुमति देता है जिससे प्रदर्शन में काफी तेजी आ सकती है। अपने डेटा के विस्तार के साथ दुनिया के विस्तार को बदलें:

CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) USING  GEOMETRY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,  
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,
BOUNDING_BOX =(-90, -180, 90, 180),) ON [PRIMARY]

1
के अनुसार technet.microsoft.com/en-us/library/bb934196.aspx BOUNDING_BOX केवल GEOMETRY_GRID, नहीं GEOGRAPHY_GRID के लिए इस्तेमाल किया जा सकता
केल्सो

1
अद्यतन उत्तर। BOOMING_BOX को सेट किया जा सकता है, GEOMETRY प्रकार अधिक तेज़ होना चाहिए।
जियोग्राफिका

1

बफ़रविथोलरेंस के साथ बफर को सरल बनाने पर विचार करें । यदि बिंदुओं को कसकर पैक किया जाता है, तो सिस्टम को यह पहचानना होगा कि कोई बिंदु सीमा के दोनों ओर है या नहीं। यह लाइन जितनी सरल है, मशीन को उतना कम काम करना पड़ता है।


1

स्थानिक सूचकांक का उपयोग करके निकटतम पड़ोसी का अनुकूलन करने के लिए नंबर टेबल का उपयोग करने के बारे में इसहाक कुनैन द्वारा इस संसाधन की जांच करें

http://blogs.msdn.com/b/isaac/archive/2008/10/23/nearest-neighbors.aspx

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.