আমার দুটি টেবিল রয়েছে যেখানে আমি সঞ্চয় করি:
- একটি আইপি পরিসীমা - দেশ দেখার সারণী
- বিভিন্ন আইপি থেকে আসা অনুরোধগুলির একটি তালিকা
আইপিগুলি লুকিং bigint
পারফরম্যান্সের উন্নতির জন্য সংরক্ষণ করা হয়েছিল ।
এটি টেবিল কাঠামো:
create table [dbo].[ip2country](
[begin_ip] [varchar](15) NOT NULL,
[end_ip] [varchar](15) NOT NULL,
[begin_num] [bigint] NOT NULL,
[end_num] [bigint] NOT NULL,
[IDCountry] [int] NULL,
constraint [PK_ip2country] PRIMARY KEY CLUSTERED
(
[begin_num] ASC,
[end_num] ASC
)
)
create table Request(
Id int identity primary key,
[Date] datetime,
IP bigint,
CategoryId int
)
আমি প্রতি দেশটিতে অনুরোধের ব্রেকডাউন পেতে চাই, তাই আমি নিম্নলিখিত কোয়েরিটি সম্পাদন করি:
select
ic.IDCountry,
count(r.Id) as CountryCount
from Request r
left join ip2country ic
on r.IP between ic.begin_num and ic.end_num
where r.CategoryId = 1
group by ic.IDCountry
আমার টেবিলে প্রচুর রেকর্ড রয়েছে: প্রায় 200,000 ইন IP2Country
এবং কয়েক মিলিয়ন Request
, সুতরাং ক্যোয়ারিতে কিছুটা সময় লাগে takes
এক্সিকিউশন পরিকল্পনার দিকে তাকিয়ে, সর্বাধিক ব্যয়বহুল অংশ হ'ল একটি ক্লাস্টারড ইনডেক্স সিক ইনডেক্স পিকে_আইপি 2 দেশটিতে, যা বহুবার কার্যকর করা হয় (অনুরোধে সারিগুলির সংখ্যা)।
এছাড়াও, আমি যে বিষয়টি সম্পর্কে কিছুটা অদ্ভুত বোধ left join ip2country ic on r.IP between ic.begin_num and ic.end_num
করি তা হ'ল অংশ (অনুসন্ধানটি করার আরও ভাল উপায় আছে কিনা তা জানেন না)।
টেবিল কাঠামো, কিছু নমুনা ডেটা এবং ক্যোয়ারী এসকিউএলফিডেলে উপলব্ধ: http://www.sqlfiddle.com/#!3/a463e/3 (দুর্ভাগ্যক্রমে আমি মনে করি না যে সমস্যাটি পুনরুত্পাদন করতে আমি অনেকগুলি রেকর্ড সন্নিবেশ করতে পারি, তবে এটি আশা করি একটি ধারণা দেয়)।
আমি (স্পষ্টতই) এসকিউএল পারফরম্যান্স / অপ্টিমাইজেশনে বিশেষজ্ঞ নই, সুতরাং আমার প্রশ্নটি: এই কাঠামো / ক্যোয়ারীটি যে আমি অনুপস্থিত তা পারফরম্যান্স-ভিত্তিতে উন্নত করার কোনও স্পষ্ট উপায় আছে কি?
begin_ip
এবং ধরে রাখতে বিবেচনা করব end_ip
।
ip2country (begin_num, end_num)
?
give me the first record that has a begin_num < ip in asc order of begin_num
( যেমন আমি ভুল হলে আমাকে সংশোধন করুন) এর মতো আপনার ক্যোয়ারী সম্পর্কে ধারণাটি বৈধ হতে পারে এবং কর্মক্ষমতা উন্নত করতে পারে।
begin_num
, তারপরে end_num
সেটের মধ্যে স্ক্যান করে কেবল একটি রেকর্ড খুঁজে পায়।
begin_num
। আমাকেA BETWEEN B AND C
প্রায়শই প্রায় যোগ দিতে হয় এবং ক্লান্তিকর আরবিএআর যোগদান না করে এটি অর্জনের কোনও উপায় আছে কিনা তা জানতে আগ্রহী।