|
| 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
| |
|
|