簡體   English   中英

重新設計數據庫以減少查詢執行時間[SQL Server Express]

[英]Redesign my database to reduce the query execution time [SQL Server Express]

我有下表:

Network_id: varchar(15) (it's an IP-Address)
mask:       tinyint     (values: 1-32)
AS:         bigint      (values: 0-400000)

該表大約有80萬行。

我有一個IP地址作為輸入,我試圖找出它屬於哪個網絡。

我嘗試了很多方法。

方法一:

我將表的結構轉換為:

start_ip, end_ip

並編寫了一個存儲過程以查明一個IP地址是否在2個ip地址之間,然后編寫了另一個存儲過程,該存儲過程使用CURSOR來迭代表的記錄並調用第一個過程,當命中時它將中斷並返回選擇的記錄。

此方法大約需要15到20秒才能達到要求,有時在得到結果之前會遇到超時錯誤。

因此,我嘗試了方法二:

方法二

我試圖將IP地址分離為tinyint類型的xyzt,並試圖選擇一條記錄,其中x,y,z,t的條件具有特定值。

相同的時間和相同的結果

方法三:

我對這種方法有一個想法,但是我沒有實現它。

我們可以創建5個級別的樹

  • IP地址:xyzt
  • 級別0到級別1:將x值保留在邊緣上。
  • 級別1到級別2:在邊緣保留y值。
  • 級別2到級別3:將z值保留在邊緣上。
  • 3級到4級:將t值保留在邊緣。
  • 級別5的葉子在每個葉子內都保留有AS號和掩碼。

我認為這種方式對我有很大幫助,但是我沒有找到在數據庫設計中實現它的方法。

將理解將在數據庫中實現的任何其他想法,或者關於如何實現第三種方法的想法。

您想從“網絡”的角度看問題。

通過使用“基本”網絡地址(IPv4為32位)和“掩碼”來定義表,該掩碼可讓您知道范圍。

然后,您可以執行類似(偽代碼)的操作:

   select networkName
     from networkDefinition n
    where (n.ip = n.mask <bitwise and> <search address>
    order by n.mask descending

我在sql server中設計了一個ip-geolocation數據庫,並且通過按ip地址聚集的單個表能夠獲得出色的性能,例如:

create table ip2location (
   ip_start binary(4) not null,
   location_id int not null,
   primary key clustered (ip_start))

我只假定范圍是連續的,並且具有location_id為“未知”,而不是使用ip_start和ip_end列

查找給定IP地址的位置可以快速實現以下查詢:

select top 1 location_id from ip2location
where ip_start <= @some_ip order by ip_start desc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM