/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Kan det ikke gøres smartere ? [MSSQL]
Fra : Rune B


Dato : 17-10-02 15:19


Jeg har fiflet en lille user-function sammen for at kunne gemme en IP-adresse,
streng (15byte) som et tal (4 byte, signed integer) felt, og dermed spare en
del bytes.

eg. INSERT INTO ... (intergerfelt) VALUES (dbo.ip2int('122.23.234.7'))

Med mange inserts bliver den dog lidt belastende for CPU ...
så kan det ikke gøres smartere ?


Rune



CREATE FUNCTION dbo.ip2int (@inChar varChar(15))
RETURNS int AS
BEGIN
DECLARE @pos1 int
DECLARE @pos2 int
DECLARE @pos3 int
DECLARE @bin1 binary(1)
DECLARE @bin2 binary(1)
DECLARE @bin3 binary(1)
DECLARE @bin4 binary(1)
DECLARE @returnint int

SET @pos1 = CHARINDEX('.', @inChar) + 1
SET @pos2 = CHARINDEX('.', @inChar, @pos1 + 1) + 1
SET @pos3 = CHARINDEX('.', @inChar, @pos2 + 1) + 1

SET @bin1 = dbo.str2bin(SUBSTRING(@inChar, 1, @pos1 - 2 ) )
SET @bin2 = dbo.str2bin(SUBSTRING(@inChar, @pos1 , @pos2 - @pos1 -1 ) )
SET @bin3 = dbo.str2bin(SUBSTRING(@inChar, @pos2 , @pos3 - @pos2 - 1) )
SET @bin4 = dbo.str2bin(SUBSTRING(@inChar, @pos3 , LEN(@inChar) -
(@pos3-1) ) )

SET @returnint = CAST(@bin1 + @bin2 + @bin3 + @bin4 AS INT)
RETURN(@returnint)
END


CREATE FUNCTION dbo.str2bin (@inChar varChar(3))
RETURNS binary(1) AS
BEGIN
DECLARE @retBin Binary(1)
SET @retBin = CAST(CAST(@inChar AS int) AS Binary(1))
RETURN(@retBin)
END






 
 
Jens Gyldenkærne Cla~ (18-10-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 18-10-02 10:53

Rune B skrev:

> Jeg har fiflet en lille user-function sammen for at kunne
> gemme en IP-adresse, streng (15byte) som et tal (4 byte,
> signed integer) felt, og dermed spare en del bytes.

Har du pladsmangel på sql-serveren? Hvis du skal bruge ip-nummeret
som tal kan jeg godt forstå at du vil konvertere det - ellers ville
jeg ubetinget gemme det som det er.

Hvis du bruger VBScript eller lignende til at tilføje data kan du
bruge split-funktionen her til at dele ip-nummeret i fire heltal.
Det er formentlig hurtigere end charindex-funktionerne du bruger
pt.


--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Peter Lykkegaard (18-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 18-10-02 10:54

Som svar på skriblerier forfattet af Jens Gyldenkærne Clausen

> Rune B skrev:
>
>> Jeg har fiflet en lille user-function sammen for at kunne
>> gemme en IP-adresse, streng (15byte) som et tal (4 byte,
>> signed integer) felt, og dermed spare en del bytes.
>
> Har du pladsmangel på sql-serveren?

Ja det var ikke lige dér jeg ville kaste mine dyrebare timer

mvh/Peter Lykkegaard



Rune B (18-10-2002)
Kommentar
Fra : Rune B


Dato : 18-10-02 13:54


"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns92AB78E25CDCDjcdmfdk@gyrosmod.dtext.news.tele.dk...
Rune B skrev:

>> Jeg har fiflet en lille user-function sammen for at kunne
>> gemme en IP-adresse, streng (15byte) som et tal (4 byte,
>> signed integer) felt, og dermed spare en del bytes.

> Har du pladsmangel på sql-serveren? Hvis du skal bruge ip-nummeret
> som tal kan jeg godt forstå at du vil konvertere det - ellers ville
> jeg ubetinget gemme det som det er.

Det er ikke pladsbekymringer, men performance i den efterfølgende
bearbejdning af data der er et issue.
Når der skal indexseres JOIN'es osv. er en int vel hurtigere...


> Hvis du bruger VBScript eller lignende til at tilføje data kan du
> bruge split-funktionen her til at dele ip-nummeret i fire heltal.
> Det er formentlig hurtigere end charindex-funktionerne du bruger
> pt.

Det ender det vist også med, måske endda clientside...


Rune



Peter Lykkegaard (18-10-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 18-10-02 15:45

Som svar på skriblerier forfattet af Rune B

> Det er ikke pladsbekymringer, men performance i den efterfølgende
> bearbejdning af data der er et issue.
> Når der skal indexseres JOIN'es osv. er en int vel hurtigere...
>
Jeps, men alt ting skal jo opvejes mod hinanden
Har du overvejet hvordan det skal gå hvis du en dag skal fixe en exportfil
eller på anden har brug for den "rigtige" ip-adresse direkte fra tabellen

Udover det så bør du overveje brugen af databærende attributter i joins
(primary/foreign key)
Normalt bruger man i disse tilfælde en generisk værdi
Der kommer sikkert en dag hvor du skal ændre ip-adressen og hvordan går det
så med dine relaterede tabeller

mvh/Peter Lykkegaard



Rune Baess (19-10-2002)
Kommentar
Fra : Rune Baess


Dato : 19-10-02 06:45


"Peter Lykkegaard" <polonline@hotmail.com> wrote:

> > Det er ikke pladsbekymringer, men performance i den efterfølgende
> > bearbejdning af data der er et issue.
> > Når der skal indexseres JOIN'es osv. er en int vel hurtigere...

> Jeps, men alt ting skal jo opvejes mod hinanden
> Har du overvejet hvordan det skal gå hvis du en dag skal fixe en exportfil
> eller på anden har brug for den "rigtige" ip-adresse direkte fra tabellen

Ja, funktionen der renderer det "rigtige" IPnummer fra int er hurtig nok

> Udover det så bør du overveje brugen af databærende attributter i joins
> (primary/foreign key)
> Normalt bruger man i disse tilfælde en generisk værdi
> Der kommer sikkert en dag hvor du skal ændre ip-adressen og hvordan går det
> så med dine relaterede tabeller

De skal ikke bruges som egentlige keys, formålet er primært statistik / log.

Rune



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408526
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste