私はMaxMindの無料データベースを使用してIP検索を行っています。私は次の表にデータを変換します:検索のスピードアップ
CREATE TABLE [dbo].[GeoBlocks](
[StartIPNum] [varchar](50) NULL,
[EndIPNumb] [varchar](50) NULL,
[LocationNum] [varchar](50) NULL,
[PostalCode] [varchar](50) NULL,
[Latitude] [varchar](50) NULL,
[Longitude] [varchar](50) NULL)
このルックアップテーブルには約3.5Mのレコードがあります。
私の目標は、IPは、私のストアドプロシージャは、次のようになります
StartIPNumとEndIPNumの間で記録見つけることによって、IPのためのLocationNum(小数点形式)を決定することです: パラメータ:@DecimalIP BIGINT を
select GeoBlocks.StartIPNum ,@DecimalIP as DecimalIp
,GeoBlocks.Postalcode ,GeoBlocks.Latitude as Latitude
,GeoBlocks.Longitude as Longitude
from GeoBlocks
where @DecimalIP between GeoBlocks.StartIPNum and GeoBlocks.EndIPNumb
StartIPNumとEndIPNumで一意のインデックスを作成しました。
ただし、これを実行すると、SQLサーバーはクエリのWhere部分のテーブルスキャンを実行します。このクエリは650〜750msかかる。 (私のサーバー上のほとんどのクエリは0-2msかかります)
どのようにこのクエリをスピードアップしますか?
追加サンプルデータ:StartIPNum EndIPNumb LocationNum PostalCode Latitude Longitude
1350218632 1350218639 2782113 48.2000 16.3667
1350218640 1350218655 2782113 48.2000 16.3667
1350218656 1350218687 2782113 48.2000 16.3667
1350218688 1350218751 2782113 48.2000 16.3667
1350218752 1350218783 2782113 48.2000 16.3667
IPV4アドレスを使用している場合は、それらを 'BIGINT'値に変換して適切なインデックスを使用できます。アルファベット順にソートされた文字列の "小数"(?!)の値は、あなたが望むことをしないかもしれません。いくつかのサンプルデータはどうですか?ヒント:適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO
私はsql-serverとtsqlでタグ付けしました。 SQLServerは2014 –
@haboです。あなたのコメントの最初の部分を回答として投稿することをお勧めします。私はあなたにスポットがあると思う。 – Bohemian