আমি গ্রাহক ডাটাবেসটিকে নতুন করে ডিজাইন করছি এবং তথ্যের একটি নতুন টুকরো আমি স্ট্যান্ডার্ড ঠিকানা ক্ষেত্রগুলির (স্ট্রিট, সিটি, ইত্যাদি) সহ সঞ্চয় করতে চাইছি এটি ঠিকানার ভৌগলিক অবস্থান। আমার মনে একমাত্র ব্যবহারের ক্ষেত্রে ব্যবহারকারীদের গুগল মানচিত্রে স্থানাঙ্কগুলি ম্যাপ করার অনুমতি দেওয়া হয় যখন অন্যথায় ঠিকানাটি পাওয়া যায় না, যা প্রায়শই ঘটে যখন অঞ্চলটি নতুনভাবে বিকশিত হয় বা কোনও প্রত্যন্ত / গ্রামীণ স্থানে থাকে।
আমার প্রথম প্রবণতা ছিল অক্ষাংশ এবং দ্রাঘিমাংশ দশমিক মান হিসাবে সংরক্ষণ করা, কিন্তু তার পরে আমি মনে করি যে এসকিউএল সার্ভার ২০০৮ আর 2 এর একটি geography
ডেটা টাইপ রয়েছে। আমার একেবারে ব্যবহার করার অভিজ্ঞতা নেই geography
এবং আমার প্রাথমিক গবেষণা থেকে আমার দৃশ্যের জন্য এটি অত্যধিক দক্ষ বলে মনে হচ্ছে।
উদাহরণস্বরূপ, অক্ষাংশ এবং দ্রাঘিমাংশ হিসাবে সংরক্ষণিত হিসাবে কাজ করার জন্য decimal(7,4)
, আমি এটি করতে পারি:
insert into Geotest(Latitude, Longitude) values (47.6475, -122.1393)
select Latitude, Longitude from Geotest
তবে সাথে geography
, আমি এটি করব:
insert into Geotest(Geolocation) values (geography::Point(47.6475, -122.1393, 4326))
select Geolocation.Lat, Geolocation.Long from Geotest
যদিও এটা না যে আরো জটিল, কেন অ্যাড জটিলতা যদি আমি করতে হবে না?
আমি ব্যবহারের ধারণাটি ত্যাগ করার আগে, আমার geography
কিছু বিবেচনা করা উচিত? অক্ষাংশ এবং দ্রাঘিমাংশ ক্ষেত্রগুলিকে সূচীকরণ করে কোনও স্থানিক সূচক ব্যবহার করে কোনও অবস্থান অনুসন্ধান করা কি দ্রুত হবে? geography
আমি যে সম্পর্কে অবগত নই তা ব্যবহার করার সুবিধা রয়েছে? অথবা, উল্টো দিকে, এমন কোন সতর্কতা রয়েছে যা সম্পর্কে আমার জানা উচিত যা আমাকে ব্যবহার থেকে নিরুৎসাহিত করবে geography
?
হালনাগাদ
@ এরিক ফিলিপস সঙ্গে সান্নিধ্য অনুসন্ধানের ক্ষমতা নিয়ে এসেছিলেন geography
, যা খুব দুর্দান্ত।
অন্যদিকে, একটি দ্রুত পরীক্ষা দেখায় যে select
অক্ষাংশ এবং দ্রাঘিমাংশ প্রাপ্ত করার জন্য একটি সাধারণ ব্যবহার করার সময় উল্লেখযোগ্যভাবে ধীর হয় geography
(নীচে বিশদ)। , এবং অন্য এসও প্রশ্নের গৃহীত উত্তরের বিষয়ে একটি মন্তব্য geography
আমাকে ফাঁস করেছে:
@ সাফুআ আপনাকে স্বাগতম একটি সিডেনোট হিসাবে একটি অযোগ্য জিওগ্রাফি ডেটাটাইপ কলামে একটি স্থানিক সূচক ব্যবহার করা খুব যত্নশীল হতে হবে। কিছু গুরুতর পারফরম্যান্স সমস্যা রয়েছে, সুতরাং আপনার স্কিমাটি পুনর্নির্মাণ করতে হবে এমনকি এমনটিই জিওগ্রাফি কলামটি নন-ন্যাবেল করুন। - টমাস 18 জুন 11:18 এ জুন
সব মিলিয়ে পারফরম্যান্স এবং জটিলতায় ট্রেড-অফ বনাম সান্নিধ্য অনুসন্ধানের সম্ভাবনাটি বিবেচনা করে, আমি geography
এই ক্ষেত্রে ব্যবহারটি ত্যাগ করার সিদ্ধান্ত নিয়েছি ।
আমি যে পরীক্ষার দৌড়েছি তার বিবরণ:
আমি দুটি সারণী তৈরি করেছি, একটি ব্যবহার করে geography
এবং অন্যটি decimal(9,6)
অক্ষাংশ এবং দ্রাঘিমাংশের জন্য ব্যবহার করে :
CREATE TABLE [dbo].[GeographyTest]
(
[RowId] [int] IDENTITY(1,1) NOT NULL,
[Location] [geography] NOT NULL,
CONSTRAINT [PK_GeographyTest] PRIMARY KEY CLUSTERED ( [RowId] ASC )
)
CREATE TABLE [dbo].[LatLongTest]
(
[RowId] [int] IDENTITY(1,1) NOT NULL,
[Latitude] [decimal](9, 6) NULL,
[Longitude] [decimal](9, 6) NULL,
CONSTRAINT [PK_LatLongTest] PRIMARY KEY CLUSTERED ([RowId] ASC)
)
এবং প্রতিটি টেবিলে একই অক্ষাংশ এবং দ্রাঘিমাংশ মানগুলি ব্যবহার করে একটি একক সারি sertedোকানো হয়েছে:
insert into GeographyTest(Location) values (geography::Point(47.6475, -122.1393, 4326))
insert into LatLongTest(Latitude, Longitude) values (47.6475, -122.1393)
পরিশেষে, নিম্নলিখিত কোডটি চালানোতে দেখা যায় যে, আমার মেশিনে, অক্ষাংশ এবং দ্রাঘিমাংশ নির্বাচন করা ব্যবহার করার সময় প্রায় 5 গুণ ধীর হয় geography
।
declare @lat float, @long float,
@d datetime2, @repCount int, @trialCount int,
@geographyDuration int, @latlongDuration int,
@trials int = 3, @reps int = 100000
create table #results
(
GeographyDuration int,
LatLongDuration int
)
set @trialCount = 0
while @trialCount < @trials
begin
set @repCount = 0
set @d = sysdatetime()
while @repCount < @reps
begin
select @lat = Location.Lat, @long = Location.Long from GeographyTest where RowId = 1
set @repCount = @repCount + 1
end
set @geographyDuration = datediff(ms, @d, sysdatetime())
set @repCount = 0
set @d = sysdatetime()
while @repCount < @reps
begin
select @lat = Latitude, @long = Longitude from LatLongTest where RowId = 1
set @repCount = @repCount + 1
end
set @latlongDuration = datediff(ms, @d, sysdatetime())
insert into #results values(@geographyDuration, @latlongDuration)
set @trialCount = @trialCount + 1
end
select *
from #results
select avg(GeographyDuration) as AvgGeographyDuration, avg(LatLongDuration) as AvgLatLongDuration
from #results
drop table #results
ফলাফল:
GeographyDuration LatLongDuration
----------------- ---------------
5146 1020
5143 1016
5169 1030
AvgGeographyDuration AvgLatLongDuration
-------------------- ------------------
5152 1022
সবচেয়ে অবাক করার বিষয়টি হ'ল এমনকি যখন কোনও সারি নির্বাচিত না হয়, উদাহরণস্বরূপ যেখানে কোথায় RowId = 2
নেই, তা নির্বাচন geography
করা এখনও ধীর ছিল:
GeographyDuration LatLongDuration
----------------- ---------------
1607 948
1610 946
1607 947
AvgGeographyDuration AvgLatLongDuration
-------------------- ------------------
1608 947