এসকিউএল সার্ভার ২০০৮-তে 70 মিলিয়ন পয়েন্ট মেঘে নিকটতম প্রতিবেশী ক্যোয়ারী অনুকূলিত করুন


16

আমার একটি এসকিউএল সার্ভার ২০০ R আর 2 এক্সপ্রেস ডাটাবেসে প্রায় 75 মিলিয়ন রেকর্ড রয়েছে। প্রত্যেকটি একটি মানের সাথে সামঞ্জস্যপূর্ণ দীর্ঘতর। সারণীতে ভূগোলের কলাম রয়েছে। আমি একটি প্রদত্ত অক্ষাংশ দ্রাঘিমাংশ (বিন্দু) এর জন্য নিকটতম প্রতিবেশী সন্ধানের চেষ্টা করছি। আমার কাছে ইতিমধ্যে স্থানিক সূচক সহ একটি প্রশ্ন রয়েছে। তবে ডেটাবেজে রেকর্ডটি কোথায় আছে তার উপর নির্ভর করে, প্রথম ত্রৈমাসিক বা শেষ প্রান্তিকে বলুন, কোয়েরিটি নিকটবর্তী প্রতিবেশীটিকে খুঁজে পেতে 3 থেকে 30 সেকেন্ড সময় নিতে পারে। আমি মনে করি এটি ক্যোয়ারী বা স্পেসিয়াল ইনডেক্সকে অনুকূল করে অনেক দ্রুত ফলাফল দিতে অনুকূলিত হতে পারে। এখনই ডিফল্ট সেটিংস সহ কিছু স্থানিক সূচক প্রয়োগ করেছে applied আমার টেবিল এবং ক্যোয়ারীর মতো দেখতে এখানে।

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

আমার ডাটাবেসে ল্যাট ল্যাংসের একটি নমুনা এখানে। নির্ভুলতা এবং ঘনত্ব সম্পর্কে ধারণা দেওয়া। সমস্ত 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
আমি এসকিউএল সার্ভার বলি না, তবে এটি আমার অচেতন চোখের দিকে তাকিয়েছে যে আপনার কোয়েরিতে লক্ষ্য পয়েন্টের 1000 মিটার বাফারের মধ্যে থাকা সমস্ত পয়েন্টগুলি খুঁজে পেতে হবে। এই বিন্দু-ইন-বহুভুজ পরীক্ষা হতে যাচ্ছে উপায় ধীর নৈকট্য পরীক্ষা, যা আপনার দেওয়া সমাধানের জন্য ভিত্তি চেয়ে পূর্ববর্তী প্রশ্ন
whuber

@ শুভ: আমি দূরত্ব ভিত্তিক প্রশ্নগুলি এবং মিনিটের মধ্যে সময় চেষ্টা করেছি। উচ্চতর উপায় আমি কিছু ভুল হতে পারে যেখানে হতে পারে। বহুভুজের এই বিন্দু হিসাবে এটি সেকেন্ডে সময় নেয়। এমনকি বাফারটি 10 ​​থেকে 10000 পর্যন্ত পরিবর্তিত করতে সময় মতো খুব কম ইমেজ থাকে।
শৌনক

1
@ শৌনাক তারপরে দূরত্ব ভিত্তিক প্রশ্নগুলির সাথে কিছু আছে, কারণ তাত্ত্বিকভাবে এগুলি গড়ে মাইক্রোসেকেন্ডে (বা আরও ভাল) এবং মিলিসেকেন্ডে (সবচেয়ে খারাপ ক্ষেত্রে) যথাযথ সূচক যেমন কেডি ট্রি ব্যবহার করে করা যেতে পারে । আপনি পয়েন্ট-ইন-বাফার অনুসন্ধানের অনুকূলকরণের উপায়গুলি অনুসন্ধান করার চেয়ে তাদের উন্নতি করার বিষয়ে ভাবতে চাইতে পারেন।
শুক্র

এই গ্রিড ডেটা? রাস্টার ব্যবহার করবেন না কেন?
ম্যাথু স্নেপ

উত্তর:


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;

আপনার প্রশ্নের ফলাফল পোস্ট করে কিছু দেখুন কিনা তা দেখতে। আইটেমগুলির প্রতিটিটির অর্থ এখানে পাওয়া যাবে

যদি আপনার স্থানাঙ্কগুলি প্রজেক্ট করা হয় তবে আপনি গণনা করা এক্স, ওয়াই ক্ষেত্র এবং এক্স <মিনএক্স এবং এক্স> ম্যাক্সএক্স ইত্যাদি পরীক্ষা করতে একটি সাধারণ অ-স্থানিক জিজ্ঞাসাও করতে পারেন

আপনার স্থানাঙ্কগুলি (জিওমেট্রি টাইপ ফিল্ডে) প্রজেক্ট করা আপনাকে আপনার স্থানিক সূচকগুলি ডেটার পরিমাণ পর্যন্ত সীমাবদ্ধ করতে দেয় যা পারফরম্যান্সকে যথেষ্ট গতিতে পারে। আপনার ডেটার এক্সটেন্টস সহ ওয়ার্ল্ড এক্সেটেন্টগুলি প্রতিস্থাপন করুন:

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
টেকনেট.মাইক্রোসফট . /en-us/library/bb934196.aspx অনুসারে BOUNDING_BOX কেবল জিউমেট্রি_জিআরআইডির জন্য ব্যবহার করা যেতে পারে, জিওগ্রাফি_জিআরআইডি নয়
কেলসো

1
আপডেট উত্তর। BOUNDING_BOX সেট করা যায় বলে GEOMETRY ধরণটি আরও দ্রুত হওয়া উচিত।
ভৌগোলিক

1

বাফারউইথ টোলারেন্সের সাহায্যে বাফারকে সহজ করার কথা বিবেচনা করুন । পয়েন্টগুলি শক্তভাবে প্যাক করা থাকলে সিস্টেমটিকে চিহ্নিত করতে হবে যে কোনও বিন্দু সীমানার উভয় পাশে রয়েছে কিনা। লাইনটি যত সহজ, মেশিনের যত কম কাজ করতে হবে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.