[SQL] Export van MSSQL naar MYSQL via PHP

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
Hallo tweakers,

Het volgende probleem:

Ik wil graag een mssql view overzetten naar een mysql tabel via PHP. Deze staan beide op 2 verschillende servers. Op de mssql database heb ik alleen leesrechten, op de mysql database heb ik alle rechten.

In de mssql view zitten 1.6mj records. De manier waarop ik het nu doe is het 1-op-1 overzetten. In een foreach loop lees ik de records 1 voor 1 uit en schrijf ze in dezelfde loop weg op de mysql database. Het probleem hierbij is dat dit heel lang duurt (10.000 records duurt ongeveer 50 sec).

Uit ervaring weet ik dat het importeren van een csv bestand direct in de mysql database van deze grootte ong. 50 seconden in totaal duurt.

Nu is de vraag, hoe krijg ik de mssql data in een .csv bestand via php. Vriend google zegt eigenlijk altijd om de records 1 voor 1 uit te lezen en op te slaan in een bestand, maar dan loop ik weer tegen hetzelfde probleem aan.

Ik heb niet de toegang over de commandline en de Microsoft Management studio is geen oplossing (het moet een geautomatiseerd proces zijn).

Resume: De vraag is: Hoe exporteer ik in 1x een tabel/view van een mssql database naar een .csv bestand via php zonder de records 1 voor 1 uit te lezen.

Heeft er iemand anders een suggestie? Ik weet niet of er nog behoefte is aan meer detail informatie (versie nummers etc) dan hoor ik dat graag dan zoek ik ze op en voeg ze toe.

Alvast bedankt,

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

MySQL Workbench? Navicat?
Maakt beide geen gebruik van PHP maar zijn allicht vele malen sneller.

Edit:
Hell, als je Navicat Premium hebt, kan je ook gewoon connecten met beide DB's tegelijk en dan direct overpompen, zonder eerst een kopie te maken en die dan later terug te gaan zetten.
Not sure of MySQL Workbench dat ook kan, maar die is gratis. (http://dev.mysql.com/downloads/workbench/)

[ Voor 61% gewijzigd door McKaamos op 26-03-2016 01:56 ]

Iemand een Tina2 in de aanbieding?


Acties:
  • 0 Henk 'm!

  • Douweegbertje
  • Registratie: Mei 2008
  • Laatst online: 11-10 16:28

Douweegbertje

Wat kinderachtig.. godverdomme

Je kan kijken of je xp_cmdshell kan uitvoeren. De query als txt output krijgen en deze importen. Alles kan op zich wel.

bijv. http://stackoverflow.com/...oft-sql-server-equivalent

Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
McKaamos schreef op zaterdag 26 maart 2016 @ 01:53:
MySQL Workbench? Navicat?
Maakt beide geen gebruik van PHP maar zijn allicht vele malen sneller.

Edit:
Hell, als je Navicat Premium hebt, kan je ook gewoon connecten met beide DB's tegelijk en dan direct overpompen, zonder eerst een kopie te maken en die dan later terug te gaan zetten.
Not sure of MySQL Workbench dat ook kan, maar die is gratis. (http://dev.mysql.com/downloads/workbench/)
Je oppert nu 2 mogelijkheden waarvoor dank. Maar die staan recht tegenover mijn requirements dat het a) via PHP moet en b) een geautomatiseerd proces (gaat nl. via een cronjob).
Douweegbertje schreef op zaterdag 26 maart 2016 @ 02:14:
Je kan kijken of je xp_cmdshell kan uitvoeren. De query als txt output krijgen en deze importen. Alles kan op zich wel.

bijv. http://stackoverflow.com/...oft-sql-server-equivalent
Thnx, maar ik heb niet de beschikking over de commandline.

[ Voor 22% gewijzigd door Onoffon op 26-03-2016 09:04 ]

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 00:11
Als de tabel zo groot is (en waarschijnlijk nog groeit) en snelheid een probleem wordt, is het dan niet een optie om het proces eens te herzien?

Wellicht kun je via een timestamp of hash een incremental load doen in plaats van iedere keer een full load? Je synchroniseert dan alleen de nieuwe / veranderde records.

[ Voor 8% gewijzigd door Morrar op 26-03-2016 09:20 . Reden: Typo's door telefoon ]


Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
Morrar schreef op zaterdag 26 maart 2016 @ 09:18:
Als de tabel zo groot is (en waarschijnlijk nog groeit) en snelheid een probleem wordt, is het dan niet een optie om het proces eens te herzien?

Wellicht kun je via een timestamp of hash een incremental load doen in plaats van iedere keer een full load? Je synchroniseert dan alleen de nieuwe / veranderde records.
Dat was ook mijn 1e ingeving, herzien. Maar helaas is dat niet altijd een optie vanwege budgettaire of compliancy redenenen.

Incremental is zeker een goed idee en ga ik even bekijken, maar mijn 1e ingeving is dat ook dit een tijdrovend proces wordt... Ik moet nog steeds alle al dan niet geindexeerde records ophalen, vergelijken en wegschrijven. De bottleneck zit volgens mij in het PHP stuk waar ik de vergelijking of actie moet doen, daar gaat het mis qua tijd.

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • Bossie
  • Registratie: Juli 2001
  • Laatst online: 18:53
Onoffon schreef op zaterdag 26 maart 2016 @ 09:31:
[...]


Dat was ook mijn 1e ingeving, herzien. Maar helaas is dat niet altijd een optie vanwege budgettaire of compliancy redenenen.

Incremental is zeker een goed idee en ga ik even bekijken, maar mijn 1e ingeving is dat ook dit een tijdrovend proces wordt... Ik moet nog steeds alle al dan niet geindexeerde records ophalen, vergelijken en wegschrijven. De bottleneck zit volgens mij in het PHP stuk waar ik de vergelijking of actie moet doen, daar gaat het mis qua tijd.
Doe het dan niet in php?
Misschien kun je iets meer context geven over het geheel en waarom de genoemde mogelijkheden niet kunnen vanwege budget/compliancy.

Als de vraag dit forum gestekd word, zal het budget wel 0 zijn :+

We're just enthusiastic about what we do. -- Steve Jobs, 1985; Battle.net: Bossie#2919


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
:'(
Onoffon schreef op vrijdag 25 maart 2016 @ 23:59:
De manier waarop ik het nu doe is het 1-op-1 overzetten. In een foreach loop lees ik de records 1 voor 1 uit en schrijf ze in dezelfde loop weg op de mysql database. Het probleem hierbij is dat dit heel lang duurt (10.000 records duurt ongeveer 50 sec).
Doe je dit in één transactie? Worden indices realtime geüpdatet? Wat is de bottleneck, cpu/disk/netwerk?
Nu is de vraag, hoe krijg ik de mssql data in een .csv bestand via php. Vriend google zegt eigenlijk altijd om de records 1 voor 1 uit te lezen en op te slaan in een bestand, maar dan loop ik weer tegen hetzelfde probleem aan.
Om deze uitspraak te doen, moet je eerst weten wat "hetzelfde probleem" is.

Acties:
  • 0 Henk 'm!

  • ShitHappens
  • Registratie: Juli 2008
  • Laatst online: 13:25
Kijk anders even naar een programma als FullConvert oid. Die is vrij rap met het omzetten van dat soort databases en kan dat eventueel ook volgens een schedule doen.

Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Onoffon schreef op vrijdag 25 maart 2016 @ 23:59:
Ik wil graag een mssql view overzetten naar een mysql tabel
Waarom van de VIEW een TABLE maken?
Kan je niet de MsSQL TABLE's kopiëren naar MySQL?

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 02-10 19:40

Gé Brander

MS SQL Server

https://www.simple-talk.c...cp-and-stored-procedures/

Meer over BCP:
MSDN: bcp Utility

Kan je hier niet wat mee?

Oh nee (geen commandline):
Onoffon schreef op vrijdag 25 maart 2016 @ 23:59:
Ik heb niet de toegang over de commandline en de Microsoft Management studio is geen oplossing (het moet een geautomatiseerd proces zijn).
Maar heb je wel een commandline op een andere machine? Je kan dan gewoon BCP gebruiken hoor.

[ Voor 70% gewijzigd door Gé Brander op 26-03-2016 21:18 ]

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Je requirments zijn dat je php moet gebruiken ?

is dit huiswerk ?

Iperf


Acties:
  • 0 Henk 'm!

  • mookie
  • Registratie: Juni 2002
  • Laatst online: 15-06 08:37

mookie

Heerlijk Helder

maak je verbinding met mssql via odbc_connect etc?
Ik moet een soortgelijk iets doen voor een oude oracle tabel.
Oude gegevens kunnen daarbij ook wijzigen dus doe ik altijd een volledige kopie van de tabel.
Maar voor de inserts maak ik semi batch inserts.

Dus met een while(odbc_fetch_row($result)) loop lees ik records uit in een array.
(array wordt wel een MB of 100 in RAM maar is voor mij geen probleem... wel even je PHP config nakijken op het maximale geheugen gebruik)
Naderhand maak ik een INSERT INTO (veld,veld,veld) VALUES (veld,veld,veld), (veld,veld,veld), (veld,veld,veld) etc.
Ik doe op die manier telkens een 1000 records omdat ik dan binnen mijn maximale mysql query grootte van 1MB blijf. (Ook iets om eerst even bij jouw setup na te kijken).

1 query die op die manier 1000 records invoegt gaat vele malen sneller dan 1000 keer een query die slechts 1 record/row toevoegd.
Los telkens een paar seconden terwijl 1000 inserts in 1 query slechts een seconde lopen.

Vieze oplossing maar werkt verders stabiel en prima.

Overigens: hoe krijg ik deze data via php in een csv? lijkt me makkelijk... gewoon in je foreach lus de data dumpen in een tekst bestand met file_put_contents().
Eventueel ook proberen om hier wederom meerdere regels ineens te schrijven zorgt er ook voor dat je disks niet overloaded raken omdat het bestand telkens geopend en gesloten wordt.
(Niet van toepassing op windows server 2012 en hoger trouwens, die schijnt hem niet meteen te sluiten, maar goed...)

[ Voor 18% gewijzigd door mookie op 26-03-2016 21:28 ]

mookie


Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
DJMaze schreef op zaterdag 26 maart 2016 @ 21:06:
[...]

Waarom van de VIEW een TABLE maken?
Kan je niet de MsSQL TABLE's kopiëren naar MySQL?
Nee, ik heb alleen leesrechten op de view.
Fish schreef op zaterdag 26 maart 2016 @ 21:14:
Je requirments zijn dat je php moet gebruiken ?

is dit huiswerk ?
Nee, dit is legacy en beperkte middelen van de werkgever 😩.

[ Voor 34% gewijzigd door Onoffon op 27-03-2016 01:33 ]

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 18:39
Maar heb je al uitgezocht of de traagheid daadwerkelijk vanuit PHP komt? Wellicht is er sprake van een verkeerd geconfigureerde index icm. met de definitie van de view waardoor het probleem aan de SQL kant ligt en dan is het trekken aan een dood paard.
Ligt de uitdaging aan de PHP kant, kan ligt de oplossing mogelijk in het gebruik van bijvoorbeeld PDO. Je php opgeving draait niet op een systeem waar je BCP kunt gebruiken?

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Onoffon schreef op zondag 27 maart 2016 @ 01:30:
[...]
Nee, dit is legacy en beperkte middelen van de werkgever 😩.
Tijd om even met je werkgever te babbelen dan, want dit is niet de manier waarop je dit soort zaken oplost. Er kan heus wel gepraat worden met leverancier X van database Y zodat er een nette en goed werkbare oplossing ingericht kan worden.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Nu online

The Eagle

I wear my sunglasses at night

Weet niet waar je frontend op draait, maar vanuit mysql moet jij gewoon een databaselink op kunnen zetten naar je mssql doos. Kwestie van ff inrichten en dan kun je gewoon vanuit mysql selects draaien op de mssql doos. Andersom kan ook trouwens. Google ff over hoe en wat, je gaat iets van een odbc of jdbc nodig hebben, maar lastig is het niet.

Alternatief: zoek een stukje code wat insert statements genereert (naar flatfile) vanuit de mssql db. Heb je ook met twee sec googlen gevonden. Moet je aan mysql kant wellicht nog wat aanpassen voor de juiste syntax, maar veel kan dat niet zijn.
Voorbeeldje: http://stackoverflow.com/...erver-table-that-includes

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Onoffon schreef op zondag 27 maart 2016 @ 01:30:
Ik heb alleen leesrechten op de view.
Dit is legacy en beperkte middelen van de werkgever.
Dat is echt geen manier van werken. Ik zou eens stevig met de werkgever babbelen.
Als hij dan nog steeds vindt dat het moet, dan maak ik wel een omweg.
Hij moet dan wel nooit komen zeuren en ook niet vragen hoeveel tijd het kost.
Anders zeg ik gewoon nou een uurtje of 10 tot 200, geen idee, wordt gewoon te veel beperkt in de mogelijkheden.

Maak je niet druk, dat doet de compressor maar


Acties:
  • +1 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
sig69 schreef op zondag 27 maart 2016 @ 12:53:
[...]

Tijd om even met je werkgever te babbelen dan, want dit is niet de manier waarop je dit soort zaken oplost. Er kan heus wel gepraat worden met leverancier X van database Y zodat er een nette en goed werkbare oplossing ingericht kan worden.
DJMaze schreef op zondag 27 maart 2016 @ 15:14:
[...]

Dat is echt geen manier van werken. Ik zou eens stevig met de werkgever babbelen.
Als hij dan nog steeds vindt dat het moet, dan maak ik wel een omweg.
Hij moet dan wel nooit komen zeuren en ook niet vragen hoeveel tijd het kost.
Anders zeg ik gewoon nou een uurtje of 10 tot 200, geen idee, wordt gewoon te veel beperkt in de mogelijkheden.
Bedankt voor jullie input maar de rol en het functioneren van mijn werkgever staat hier niet ter discussie en is geen onderdeel van het vraagstuk. Als je geen nuttig antwoord hebt op mijn daadwerkelijke vraag heb ik leiver niet dat je reageert. Ja, ik snap ook wel dat mijn werkgever hier een grotere bijdrage in moet leveren. Maar dat is nu eenmaal niet zo om diverse redenen.

De beste manier is om dit geborgd te regelen en dat is ook het uiteindelijke doel, maar dit kan nog maanden duren, in deze maanden kan ik nog steeds een positieve bijdrage leveren aan de doelstellingen van het bedrijf door andere oplossingen te verzinnen, daarvoor ben ik ook aangenomen...
mookie schreef op zaterdag 26 maart 2016 @ 21:26:
maak je verbinding met mssql via odbc_connect etc?
Ik moet een soortgelijk iets doen voor een oude oracle tabel.
Oude gegevens kunnen daarbij ook wijzigen dus doe ik altijd een volledige kopie van de tabel.
Maar voor de inserts maak ik semi batch inserts.

Dus met een while(odbc_fetch_row($result)) loop lees ik records uit in een array.
(array wordt wel een MB of 100 in RAM maar is voor mij geen probleem... wel even je PHP config nakijken op het maximale geheugen gebruik)
Naderhand maak ik een INSERT INTO (veld,veld,veld) VALUES (veld,veld,veld), (veld,veld,veld), (veld,veld,veld) etc.
Ik doe op die manier telkens een 1000 records omdat ik dan binnen mijn maximale mysql query grootte van 1MB blijf. (Ook iets om eerst even bij jouw setup na te kijken).

1 query die op die manier 1000 records invoegt gaat vele malen sneller dan 1000 keer een query die slechts 1 record/row toevoegd.
Los telkens een paar seconden terwijl 1000 inserts in 1 query slechts een seconde lopen.

Vieze oplossing maar werkt verders stabiel en prima.

Overigens: hoe krijg ik deze data via php in een csv? lijkt me makkelijk... gewoon in je foreach lus de data dumpen in een tekst bestand met file_put_contents().
Eventueel ook proberen om hier wederom meerdere regels ineens te schrijven zorgt er ook voor dat je disks niet overloaded raken omdat het bestand telkens geopend en gesloten wordt.
(Niet van toepassing op windows server 2012 en hoger trouwens, die schijnt hem niet meteen te sluiten, maar goed...)
Ah, kijk hier heb ik wat aan. In mijn beperkte gedachtegang zette ik de gegevens 1-op-1 over per loop, maar het is natuurlijk veel efficienter om meerdere inserts per query te doen. Ik ga hier even mee aan de slag

[ Voor 38% gewijzigd door Onoffon op 29-03-2016 07:39 ]

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Onoffon schreef op dinsdag 29 maart 2016 @ 07:35:
de rol en het functioneren van mijn werkgever staat hier niet ter discussie en is geen onderdeel van het vraagstuk.
Ik begrijp dat je dat interpreteerde uit mijn antwoord. Dat was niet de bedoeling.
Het was eerder bedoelt als een gesprek over de tijd die je krijgt om het vraagstuk op te lossen.


Over de file_put_contents: ik doe dat anders:
PHP:
1
2
3
4
$fp = fopen('file.csv');
while (odbc_fetch_into($result_id, $result_array)) {
    fputcsv($fp, $result_array);
}


En qua inserts zou ik zorgen dat er geen indices zitten op de tabel, en deze later eventueel toevoegen.

De verschillende manieren kosten gewoon tijd om te testen, en komt dus mijn eerste punt weer naar boven: heb je genoeg tijd gekregen om alle opties te onderzoeken?

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 18:39
Onoffon schreef op dinsdag 29 maart 2016 @ 07:35:
Bedankt voor jullie input maar de rol en het functioneren van mijn werkgever staat hier niet ter discussie en is geen onderdeel van het vraagstuk. Als je geen nuttig antwoord hebt op mijn daadwerkelijke vraag heb ik leiver niet dat je reageert.
Mensen die tegen een probleem aanlopen hebben vaak een behoorlijke narrow view op het probleem. De vragen die hier gesteld worden zijn er ook meer helderheid te krijgen. Door je af te zetten tegen die vraagstellers ipv inhoudelijk te reageren doe je precies dat, waarvan je vindt dat wij dat niet mogen doen.

Overigens zie ik geen enkel probleem in het feit dat je alleen maar een view tot je beschikking hebt, als die view maar snel genoeg is.

[ Voor 9% gewijzigd door StevenK op 29-03-2016 15:33 ]

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • +1 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
StevenK schreef op dinsdag 29 maart 2016 @ 15:32:
[...]

Mensen die tegen een probleem aanlopen hebben vaak een behoorlijke narrow view op het probleem. De vragen die hier gesteld worden zijn er ook meer helderheid te krijgen. Door je af te zetten tegen die vraagstellers ipv inhoudelijk te reageren doe je precies dat, waarvan je vindt dat wij dat niet mogen doen.

Overigens zie ik geen enkel probleem in het feit dat je alleen maar een view tot je beschikking hebt, als die view maar snel genoeg is.
Ik zie niet wat de rol van mijn werkgever is t.o.v de vraag die ik stel?? De werkgevers vraag rijst alleen omdat ik wat achtergrond informatie wil geven, maar blijkbaar is dat al te veel out of scope. Wat als het wel een huiswerkvraag was?

In werkelijkheid is het nog een stuk complexer maar daar ga ik helemaal niet over beginnen want dan krijg ik helemaal geen antwoord op mijn vraag.

En over 'narrow view' gesproken, hoe kan het dat op basis van 2 posts van mij de conlusie wordt getrokken dat de oplossing bij mijn werkgever moet liggen? Zonder ook maar enige achtergrond informatie?

Dat valt me hier veel vaker op, ongetwijfeld allemaal goed bedoeld maar heel vaak komen er antwoorden die niets met de originele vraagstelling te maken hebben. Als ik zeg dat de werkgever mij niet kan helpen vanwege legacy en beperkte middelen dan is dat zo, een post op tweakers gaat mij niet in 1x wakker schudden en bedenken van o ja, laat ik eens met mijn werkgever hierover praten?! Ik verzin dat antwoord niet, dat is gewoon een feit.

Dit gezegd hebbende, dit komt aanvallend over maar zo is het absoluut niet bedoeld. Ik wou alleen dat mensen zich meer focussen op de desbetreffende vraag en minder op het gedeelte waarom die vraag ontstaat...

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Onoffon schreef op dinsdag 29 maart 2016 @ 19:47:
[...]


Ik zie niet wat de rol van mijn werkgever is t.o.v de vraag die ik stel?? De werkgevers vraag rijst alleen omdat ik wat achtergrond informatie wil geven, maar blijkbaar is dat al te veel out of scope. Wat als het wel een huiswerkvraag was?

In werkelijkheid is het nog een stuk complexer maar daar ga ik helemaal niet over beginnen want dan krijg ik helemaal geen antwoord op mijn vraag.

En over 'narrow view' gesproken, hoe kan het dat op basis van 2 posts van mij de conlusie wordt getrokken dat de oplossing bij mijn werkgever moet liggen? Zonder ook maar enige achtergrond informatie?

Dat valt me hier veel vaker op, ongetwijfeld allemaal goed bedoeld maar heel vaak komen er antwoorden die niets met de originele vraagstelling te maken hebben. Als ik zeg dat de werkgever mij niet kan helpen vanwege legacy en beperkte middelen dan is dat zo, een post op tweakers gaat mij niet in 1x wakker schudden en bedenken van o ja, laat ik eens met mijn werkgever hierover praten?! Ik verzin dat antwoord niet, dat is gewoon een feit.

Dit gezegd hebbende, dit komt aanvallend over maar zo is het absoluut niet bedoeld. Ik wou alleen dat mensen zich meer focussen op de desbetreffende vraag en minder op het gedeelte waarom die vraag ontstaat...
Daarom heet het ook een discussie forum. Mensen denken hier graag buiten de gezetten lijnen voor een effectievere oplossing. We horen zo vaak "het kan niet" terwijl het achteraf wel kan.

Beter stel je je vraga op een ander forum waar men wat slaafser je vraag beantwoord. je hebt hebt over php als requirement alsof je niets anders mag gebruiken. je mag kenneliijk wel iets anders gebruiken, maar er zijn maar beperkte middelen. zeg dat dan. dan kunnen mensen mischien wel met goedkopere of gratis oplossingen komen die mischien wel beter hun werk doen

Iperf


Acties:
  • +1 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
Fish schreef op dinsdag 29 maart 2016 @ 19:54:
[...]


Daarom heet het ook een discussie forum. Mensen denken hier graag buiten de gezetten lijnen voor een effectievere oplossing. We horen zo vaak "het kan niet" terwijl het achteraf wel kan.

Beter stel je je vraga op een ander forum waar men wat slaafser je vraag beantwoord. je hebt hebt over php als requirement alsof je niets anders mag gebruiken. je mag kenneliijk wel iets anders gebruiken, maar er zijn maar beperkte middelen. zeg dat dan. dan kunnen mensen mischien wel met goedkopere of gratis oplossingen komen die mischien wel beter hun werk doen
Ik geef toch niet voor niets aan wat mijn requirements zijn? Wat is daar niet duidelijk aan? Enige optie is PHP. En waarom? Omdat de gehele applicatie gebouwd is op PHP en mijn te bouwen functionaliteit misschien maar 5% behelst. We gaan niet voor 5% functionaliteit (die relatief gezien ook minder business value heeft dan de overige 95%) van programmeer taal wijzigen.

Ik snap dat mensen hier graag buiten de gezette lijnen wil denken, daar ben ik ook voorstander van. Maar alleen ik weet of dat in dit geval mogelijk is en dat is het alleen als je binnen de requirements bliijft.

Als laatste nabrander, wat voor zin heeft het om nadat de melding is gedaan: 'kan niet vanwege beperkte middelen en legacy' toch te meldden, goh, misschien moet je toch maar eens met je werkgever praten. Really? Wat geven jullie de indruk dat ik dit nog niet gedaan heb?

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • Fish
  • Registratie: Juli 2002
  • Niet online

Fish

How much is the fish

Onoffon schreef op dinsdag 29 maart 2016 @ 20:03:
[...]

..
Als laatste nabrander, wat voor zin heeft het om nadat de melding is gedaan: 'kan niet vanwege beperkte middelen en legacy' toch te meldden, goh, misschien moet je toch maar eens met je werkgever praten. Really? Wat geven jullie de indruk dat ik dit nog niet gedaan heb?
Tokkie to me ?

Iperf


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ik denk dat de snelste manier is om een dump te maken van de database, bijvoorbeeld door een csv-file te genereren, maar wellicht kan mssql een lower-level dump maken. Dit zou via php goed te doen moeten zijn. Vervolgens kan je de csv-file weer inlezen. Dit kan je zelf programmeren, maar php en mysql hebben genoeg functionaliteit om csv-file snel te importeren. Ik gebruik zelf onderstaande php-code wel eens:
PHP:
1
$r=mysql_query("LOAD DATA LOCAL INFILE 'blahblah.csv' REPLACE INTO TABLE `table_name` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'; ") or die(mysql_error());

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Onoffon
  • Registratie: April 2006
  • Laatst online: 10:20
KabouterSuper schreef op dinsdag 29 maart 2016 @ 20:16:
Ik denk dat de snelste manier is om een dump te maken van de database, bijvoorbeeld door een csv-file te genereren, maar wellicht kan mssql een lower-level dump maken. Dit zou via php goed te doen moeten zijn. Vervolgens kan je de csv-file weer inlezen. Dit kan je zelf programmeren, maar php en mysql hebben genoeg functionaliteit om csv-file snel te importeren. Ik gebruik zelf onderstaande php-code wel eens:
PHP:
1
$r=mysql_query("LOAD DATA LOCAL INFILE 'blahblah.csv' REPLACE INTO TABLE `table_name` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'; ") or die(mysql_error());
Precies, het importeren doe ik nu inderdaad ook al zo. Ik zit alleen met de manier van het aanmaken van de .csv. Maar ik heb een aantal goede tips gelezen hier waar ik mee aan de slag kan.

Just a simple thought....


Acties:
  • 0 Henk 'm!

  • Room42
  • Registratie: September 2001
  • Niet online
sig69 schreef op zondag 27 maart 2016 @ 12:53:
[...] Er kan heus wel gepraat worden met leverancier X van database Y zodat er een nette en goed werkbare oplossing ingericht kan worden.
offtopic:
Want jij kent die gasten, natuurlijk. 8)7

Als een mod me hier op mijn flikker geeft, is het volledig terecht, maar dit soort (niet persoonlijk op sig69 gericht!) reacties word ik zo moe van. Precies zoals Onoffon zelf al aangeeft, worden er weer aannames en conclusies getrokken zonder enige kennis van zaken. Als je de situatie niet kent, vraag er dan naar maar doe geen uitspraken over iets dat je niet kunt weten. Zou de wereld een stuk vriendelijker maken, denk ik!

[ Voor 46% gewijzigd door Room42 op 29-03-2016 20:33 ]

"Technological advancements don't feel fun anymore because of the motivations behind so many of them." Bron


Acties:
  • +1 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Onoffon schreef op dinsdag 29 maart 2016 @ 20:03:
[...]


Ik geef toch niet voor niets aan wat mijn requirements zijn? Wat is daar niet duidelijk aan? Enige optie is PHP. En waarom? Omdat de gehele applicatie gebouwd is op PHP en mijn te bouwen functionaliteit misschien maar 5% behelst. We gaan niet voor 5% functionaliteit (die relatief gezien ook minder business value heeft dan de overige 95%) van programmeer taal wijzigen.
Wacht eens even, je bedoelt dat dit niet een eenmalige exercitie is maar je wilt het vaker doen (Voor een eenmalig iets is programmeertaal niet van belang vind ik altijd)? Hoe vaak dan?

Maar first of all staat er nog een vraag van GlowMouse open die zo ongeveer het meest essentiele van het hele stuk is : Waar zit de traagheid in? En hoe heb je dat vastgesteld?

Want als de traagheid gewoon in de mssql view zit dan ben je linksom of rechtsom gewoon f*cked, je gaat het niet sneller krijgen de view opgebouwd kan worden.
Maar wellicht zit het hem in de manier waarop je de records ophaalt en wegschrijft.
Misschien moet je gewoon niets naar disk schrijven maar alles in memory laten.

En om even terug te komen op je commentaar op mensen die reageren, als mensen zich zouden houden aan jouw vraagstelling dan was er geen antwoord mogelijk, want je vraagstelling is dan namelijk :
Resume: De vraag is: Hoe exporteer ik in 1x een tabel/view van een mssql database naar een .csv bestand via php zonder de records 1 voor 1 uit te lezen.
En daar valt behalve een eigen complete sql-driver schrijven geen antwoord op te geven, want elke php-driver leest de records 1 voor 1 uit.

Dus ipv anderen af te snauwen zou ik nog eens goed naar de al gegeven vragen kijken en die gewoon beantwoorden dan valt er best uit te komen, alleen zal jij wel even moeten aangeven waar nu het probleem zit.

Acties:
  • 0 Henk 'm!

  • The Eagle
  • Registratie: Januari 2002
  • Nu online

The Eagle

I wear my sunglasses at night

Ik zit ineens te denken, misschien kan het aan de mysql kant ook wel zonder programmeren of inserts.
Zie https://sqlexpertz.wordpr...sing-csv-engine-and-file/ en http://www.fromdual.com/csv-storage-engine
Feitelijk gebruik je een csv flatfile als soort van "external" table. Je kunt er niet op schrijven, maar als ik TS een beetje door de regels door lees lijkt dat ook niet de bedoeling :)

Hoef je hem aan de mssql kant alleen maar met het juiste format te genereren, maar dat moet volgens mij wel te doen zijn :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Nu online
Interessante oplossing :). Maar als het alsnog een half uur duurt om de csv file te genereren heb je er alleen nog niet veel aan.

[ Voor 33% gewijzigd door sig69 op 29-03-2016 22:31 ]

Roomba E5 te koop


Acties:
  • +1 Henk 'm!

  • mookie
  • Registratie: Juni 2002
  • Laatst online: 15-06 08:37

mookie

Heerlijk Helder

@Gomes12
php drivers lezen niet elk record 1 voor 1 uit. Niet allemaal tenminste.
De ODBC driver die verbinding maakt met MSSQL weet ik niet zeker, maar als ik een sloot records ophaal uit een mysql database of via ODBC uit een oracle database dan worden wel alle records ineens teruggegeven en in het geheugen geplaatst. Met fetch_result, fetch_into, fetch_assoc e.d. functies loop je met pointers door dat enorme blok geheugen waarmee je vervolgens records vanuit dat enorme blok geheugen in array's kunt kopieren. Het meest voorkomende stukje mysql code op internet (inclusief de mooide 'or die') is waarschijnlijk iets als:

code:
1
2
3
4
$sql= "select * from tabel";
$result = mysql_query($sql) or die('Query failed: ' . mysql_error());
while ($row = mysql_fetch_array($result, MYSQL_ASSOC )){ $myarray[]=$row; }
mysql_free_result($result);


Bij de result=mysql_query wordt de query uitgevoert en de gehele result set in een geheugen blok gezet. Tijdens de while row wordt dit geheugen gebruik zo'n beetje verdubbelt aangezien je alles nogmaals opslaat. Na de mysql_free_result wordt het eerste geheugenblok weer vrijgegeven.

Maar als je wat tijden wilt meten kun je in php vrij makkelijk voor grove inschatting de tijd opslaan door vooraf
code:
1
$time_start = microtime(true);

te plaatsen en achteraf
code:
1
echo microtime(true) - $time_start;

te plaatsen.
Dat kun je dan doen voor en na het executen van de query, na het uitlezen van het geheugen in een array middels fetch_array of welke fetch functie dan ook, en tijdens het inserten van de records in de mysql database. Dan zie je grofweg in ieder geval hoe lang een bepaald deel van het script heeft gedraait.

mookie


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
mookie schreef op dinsdag 29 maart 2016 @ 22:48:
dan worden wel alle records ineens teruggegeven en in het geheugen geplaatst
En daarom heb je bij MySQL in PHP de optie om het unbuffered te doen http://php.net/mysqli_use_result
En eigenlijk komt dat door MyISAM, je werkt niet in een beveiligde transaction en er is een table lock, geen record lock.
Daardoor moet elke volgende query in de queue wachten.

[ Voor 7% gewijzigd door DJMaze op 29-03-2016 22:58 ]

Maak je niet druk, dat doet de compressor maar

Pagina: 1