Avatar billede gadebarnet Nybegynder
10. marts 2005 - 14:23 Der er 23 kommentarer og
3 løsninger

søgning i tabel med 10 mill + poster.

JEg har denne:

select * from tbl_stat_login where convert(char(10),str_dato,112) = '20040609'


Men det tager jo en krig når der er 10 mill+ poster...

ER der en metode til at kunne gøre det hurtigere ?
Avatar billede bennytordrup Nybegynder
10. marts 2005 - 14:25 #1
Hvordan ligger data i str_Dato? Hvis det er en datetime, så behøver du ikke den der convert.

Har du index på str_Dato.

Har du brug for alle felterne?
Avatar billede gadebarnet Nybegynder
10. marts 2005 - 14:47 #2
Det er en datetime. (jeg bruger bare convert for at være sikker, sløver det ?)

Nej, intet index. (Det var også min egen tanke at lave det, men hvor meget giver det?)

Ja, alle felter... (der er kun 3)
Avatar billede bromer Nybegynder
10. marts 2005 - 14:48 #3
Du vinder RIGTIG meget ved at definere et index på det. Du skal bare være opmærksom på at det også koster lidt i performence når du indsætter eller opdaterer en række. Men du vinder rigtig meget når du laver et select.
Avatar billede bennytordrup Nybegynder
10. marts 2005 - 14:58 #4
Hvis du kun har tre felter, så bør du også overveje et covering index, dvs. et index på alle tre felter. Det betyder, at al nødvendig information til forespørgslen ligger i indexet, og derved slipper SQL Server for at skulle læse på de fysiske datasider.
Avatar billede bromer Nybegynder
10. marts 2005 - 15:00 #5
Med forbehold for at jeg ikke kender de interne funktioner i MS SQL særlig godt så ved jeg at der i database teorien findes nogle meget stærke index på dato-strukturer, hvor man laver index over et range af datoer i en træ struktur.
Avatar billede gadebarnet Nybegynder
10. marts 2005 - 15:18 #6
Jeg kan ikke helt finde ud af det med index (har jeg fundet ud af) så gen hjælp hertil ville være MAX
Avatar billede bromer Nybegynder
10. marts 2005 - 15:25 #7
Okay. Hvis du ikke ved det så er der generelt god hjælp at finde på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_tsqlcon_6lyk.asp.  Der kan du finde "CREATE INDEX" i venstre menu.

Uden at jeg har afprøvet det kan du vel lave en:

CREATE INDEX str_dato_idx ON tbl_stat_login (str_dato)
Avatar billede bromer Nybegynder
10. marts 2005 - 15:25 #8
Avatar billede janus_007 Nybegynder
10. marts 2005 - 18:04 #9
Hov stop det hjælper intet at lave et index på den slags søgninger når leftclausen bliver convertet. Så drop dit index på den datetimecol.. det er bare spild af plads.

Men du kan gøre flere smarte ting.. Du kunne eks.vis oprette en hjælpetabel der holdt styr på et evt. minimum og maximum id på hver dato noget i retning af

create table tbl_stat_helper
(
min_id int,
max_id int,
datestamp int
)

Populer det med flg. sql:
insert into tbl_stat_helper
select min(id), max(id), convert(varchar, str_dato, 112)
from tbl_stat_login group by  convert(varchar, str_dato, 112)

Denne tabel skal så naturligvis vedligeholdes en gang i døgnet.

Når du så skal udvælge noget fra din tbl_stat_login, gør du sådan her:
select * from tbl_stat_login sl
inner join tbl_stat_help sh
on sl.id between sh.min_id and sh.max_id
where sh.datestamp = 20040609

Jeg formoder du har en primary key.. derfor bruger jeg bare id ! - Hvis ikke så navngiv den efter din primary key i tabellen tbl_stat_login

Der er en del andre måder som sagt at løse det på, men forsøg at starte med det jeg har vist dig. Og 10M+ er intet at tale om for mssql - bare rolig mand :O)
Avatar billede bromer Nybegynder
10. marts 2005 - 19:06 #10
janus_007> Jeg er godt klar over at det ikke hjælper når der bliver foretaget en convert, men det er heller ikke nødvendigt at lave en convert, så hvorfor ikke bare droppe den istedet for at droppe index'et.
Avatar billede janus_007 Nybegynder
10. marts 2005 - 21:38 #11
Du fortalte tidligere at det er en datetime dvs. med både dato og tid og det giver noget ala 2004-12-05 12:45:12.376 - altså med høj precision.

Som jeg ser det så søger du efter en dato, derfor kan du ikke undvære din convert til "kun" dato :O)
Avatar billede janus_007 Nybegynder
10. marts 2005 - 21:39 #12
Sorry gadebarnet fortalte :O)
Avatar billede bromer Nybegynder
10. marts 2005 - 22:10 #13
Det er korrekt, men findes der ikke specielle index's til dato typer?
Avatar billede janus_007 Nybegynder
11. marts 2005 - 00:59 #14
Nej ikke i MSSQL :O(
Avatar billede bromer Nybegynder
11. marts 2005 - 01:05 #15
Nedtur
Avatar billede ldanielsen Nybegynder
14. marts 2005 - 12:52 #16
Hør her, for det første skal der ikke være nogen CONVERT, og for det andet skal der naturligvis være et index.

gadebarnet, hvad er det vi snakker om, laver du ASP?
Avatar billede janus_007 Nybegynder
14. marts 2005 - 13:35 #17
ldanielsen -> Læs min løsning, det er den bedste måde at arbejde med datoer på medmindre du evt. laver et index over en computed column ;O)

Hygge
Avatar billede gadebarnet Nybegynder
14. marts 2005 - 14:47 #18
yes sir. Det er ASP
Avatar billede ldanielsen Nybegynder
14. marts 2005 - 21:06 #19
OK

Så kan du gøre sådan
Dim strDato, strSQL
strDato = "2004-06-09"

strSQL = "DECLARE @dato datetime; SET @Dato = CONVERT(datetime, '" & strDato & "', 120); SELECT * FROM tbl_stat_login WHERE str_dato = @Dato"

osv ...

På den måde konverterer du strengen til datetime én gang, og din SELECT kan køre uden at konvertere, og derfor udnytte indexet. Bemærk dog at du kun får rækker ud hvor klokkeslættet er som i @Dato: 00:00:00.000
Avatar billede janus_007 Nybegynder
14. marts 2005 - 23:47 #20
ldanielsen -> Det var da en besynderlig løsning, som du skriver giver den jo kun rækker hvor klokkeslettet  00:00:00.000, hvem kan da bruge den slags til noget?
Avatar billede gadebarnet Nybegynder
15. marts 2005 - 00:04 #21
Hvis nu at jeg selv finder på en løsning, som jeg vil lave ud fra hvad i har skrevet, er det så cool, at i alle deler point ?
Avatar billede bromer Nybegynder
15. marts 2005 - 00:06 #22
det styer du bare selv :)
Avatar billede gadebarnet Nybegynder
15. marts 2005 - 00:09 #23
Det gjorde jeg da bare :)

tak for hjælpen
Avatar billede ldanielsen Nybegynder
15. marts 2005 - 09:59 #24
Janus_007 >

Løsningen giver alle poster hvor str_dato er lig '20040609' som ønsket. Hvad er det besynderlige?

Jeg gør bare opmærksom på at denne query ikke giver alle poster hvor datoen er fra samme dag. Den giver kun poster hvor datoen er PRÆCIS som '20040609', hvilket vil sige 9. Jan 2004 kl. 0:00.0000
Avatar billede janus_007 Nybegynder
15. marts 2005 - 10:34 #25
Ja præcis på klokkeslettet som du skriver. Det som queryen skulle returnere var alle rækker på en given dato og ikke et givent millisekund. Det var bare det jeg fandt lidt besynderligt at du foreslog.
Avatar billede ldanielsen Nybegynder
15. marts 2005 - 11:28 #26
Hvis gadebarnet har tænkt sig at han vil have alle poster på samme dag, og hvis str_dato kan have klokkeslæt der ikke er 0:00.000, så har vi lavet det helt forkert fra starten.

I givet fald skal det så være sådan, med DATEDIFF:

strSQL = "DECLARE @dato datetime; SET @Dato = CONVERT(datetime, '" & strDato & "', 120); SELECT * FROM tbl_stat_login WHERE DATEDIFF(dd, str_dato, @Dato) = 0"

gadebarnet > det her må du tage stilling til, ok?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester