2009-07-01 11 views
0

Donc un site sur lequel je travaille migre vers un nouveau flux de données. Le flux de données actuel est alimenté par un site FTP et me est présenté dans deux fichiers dénomés. Ceci est ensuite poussé dans deux tables dans un serveur MS SQL 2005 que le site utilise alors pour exécuter toutes les recherches et ainsi de suite (site immobilier). Le problème est, le nouveau flux de données est normalisé, il n'y a pas qu'un seul fichier, mais 12. Tous ces fichiers ont été fusionnés dans une vue pour imiter les anciennes tables héritées. C'est lent car chaque rangée doit avoir ses données démormilisées de "a, d, e" à "Range, Refrigerator, Dishwasher". Il y a au maximum 17 de ces changements par ligne qui doivent être faits. Donc, ma pensée était de faire les transformations une fois, et les enregistrer dans une table en tant que valeurs statiques et non à travers la vue. Cela fonctionne mais il faut plus de 40 minutes pour obtenir les données dans des tableaux vides. Il faut 1 heure 45 minutes pour mettre à jour les lignes nécessaires et insérer les nouvelles lignes. La clé primaire ici est un char (8) pour tout. J'ai également une date à jour pour chaque rangée. De quoi ai-je besoin pour accélérer ce processus? Quels changements dois-je apporter au serveur, aux groupes de fichiers, aux index, aux tables, etc.?Sql 2005 Table à Table fusionner avec certaines données de transformation

Aussi quelques autres informations, chaque ligne est juste autour de 7K, le serveur est en cours d'exécution SQL 2005 Workgroup Edition, j'ai à la fois un dev et une boîte de production afin que je puisse facilement tester n'importe quoi. Toute aide serait sollicitée, mon but est d'obtenir 10 à 20 minutes, pas 47 minutes.

Modifier, On m'a demandé d'afficher la vue, voici l'un des fichiers fusionnés. Avoir des problèmes en affichant l'autre, semble les muscler tous ensemble après la prochaine Union tous.


 select LN,null as [PropertyType],ST,CTGF,TYP,UD,null as [LAG],null as [LO],null as [OFFICE_PHONE],null as [AGENT_FORM_NAME], 
        null as [OFFICE_FORM_NAME],LP,HSN,CP,STR,null as [UN],CIT,ZP,ADI,AR,null as [AREA_Name],SUB,CNY,RMS,BR,BTH,MBB,CARS,dbo.listLookupToString(gar,'a,Attached,b,Detached,c,1 Car Garage,d,1.5 Car Garage,e,2 Car Garage,f,2.5 Car Garage,g,3 Car Garage,h,3+ Car Garage,m,Garage Door Opener(s) (Auto),n,Transmitter(s),o,Carport,p,Heated,q,Leased,r,Owned,s,Underground,u,None,v,Deeded Sold Separately,w,On-Site,x,Off-Site,z,Tandem') as GAR,PKN, 
        PAR,FP,BLT,LSZ,ACR,WF,BMT,MOD,TAX,TXY,ASM,MBS,dbo.listLookupToString(MBF,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as MBF,B2S,dbo.listLookupToString(B2F,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as B2F,B3S,dbo.listLookupToString(B3F,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as B3F,B4S,dbo.listLookupToString(B4F,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as B4F,LRS,dbo.listLookupToString(LRF,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as LRF,DRS,dbo.listLookupToString(DRF,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as DRF,KTS,dbo.listLookupToString(KTF,'c,Carpet,h,Hardwood,p,Parquet,v,Vinyl,t,Ceramic Tile,o,Other') as KTF,FRS,FRF,REMARKS_INTERNET,REMARKS, 
        null as [RE1],null as [RE2],null as [RE3],null as [RE4],null as [RE5],null as [RE6],null as [RE7],null as [RE8],null as [RE9], 
        null as [RE10],A1N,A1S,A1F,A2N,A2S,A2F,A3N,A3S,A3F,A4N,A4S,A4F,A5N,A5S,A5F,GS,GSD,JH,JHD,HS,HSD,OT,OSD,FEA,dbo.listLookupToString(OTR,'a,1st Floor Bedroom,b,Darkroom,c,Den/Office/Study,d,Enclosed Balcony,e,Exercise Room,f,Family Room,g,Gallery/Foyer,h,Great Room,i,In-Law Arrangement,j,Kitchen Second,k,Library,l,Loft,m,Maids Room,n,Porch - Enclosed,o,Porch - Screened,p,Recreation,q,Sitting Room,r,Sunroom/Florida Room,t,Utility/Laundry - 1st Floor,u,Utility/Laundry - 2nd Floor,v,Workshop') as OTR,STY,TPE, 
        null as [TPC],null as [TMU],null as [TMF],DIR,null as [DR1],null as [DR2],null as [DR3],null as [UFL],null as [FLN],ASF, 
        null as [PTA],null as [CAA],EXP,null as [UFE],null as [TNU],null as [UF1],null as [RM1],null as [BR1],null as [BT1], 
        null as [UF2],null as [RM2],null as [BR2],null as [BT2],null as [UF3],null as [RM3],null as [BR3],null as [BT3],null as [UF4], 
        null as [RM4],null as [BR4],null as [BT4],null as [GRI],null as [NOI],null as [AP1],null as [AP2],null as [AP3],null as [AP4], 
        null as [AZN],null as [SLN],null as [ASQ],null as [TLA],null as [RU],null as [LT],null as [AML],null as [BIM],null as [CUU], 
        null as [FMT],null as [LND],null as [LOCAT],null as [PTU],null as [GSI],null as [TAE],null as [GSA],null as [TO], 
        null as [UNT],null as [SUBTPE],null as [RP],null as [MIN],null as [MAX],null as [BSQ],null as [BAG],null as [BUT], 
        null as [APT],null as [OFC],null as [STO],null as [DID],null as [NDK],null as [CEMXF],null as [CEMXI],null as [CEMIF], 
        null as [CEMII],null as [HT],null as [GD],null as [PARK],null as [DBL],null as [MK],PHOTOCOUNT as [NBR_PHOTOS], 
        null as [SUPP_PHOTOS],SP,CLOSED_DATE 
from rets_de where st<>'CLSD' 

Répondre

1

Pouvez-vous poster votre opinion actuelle qui tire toutes ces données ensemble?

Cela ressemble à un changement de vos tables pour déclarer les clés primaires comme étant en cluster et l'utilisation de certaines instructions JOIN bien écrites aiderait vos requêtes à s'exécuter beaucoup plus rapidement sans trop de travail. Aussi, à chaque fois que vous utilisez SQL Server, à moins que vous ayez besoin de verrouiller une table, assurez-vous de lancer la sélection avec NOLOCK, car cela peut donner plus de vitesse si vous chargez des données et que vous sélectionnez ensemble de tables en même temps. Ex:

SELECT X, Y, Z 
FROM Table AS t WITH(NOLOCK) 

Après avoir examiné votre demande, il semble que vous êtes probablement ralentir parce que vous appelez toutes les fonctions de ListLookupToString sur la place, qui doit être appelée pour chaque ligne. La meilleure façon, plus rapide, de le faire est avec des tables normalisées et JOINING à travers les tables. J'ai pris l'une des recherches et montré comment le convertir ci-dessous.

Recherche actuelle:

dbo.listLookupToString(gar,'a,Attached,b,Detached,c,1 Car Garage,d,1.5 Car Garage,e,2 Car Garage,f,2.5 Car Garage,g,3 Car Garage,h,3+ Car Garage,m,Garage Door Opener(s) (Auto),n,Transmitter(s),o,Carport,p,Heated,q,Leased,r,Owned,s,Underground,u,None,v,Deeded Sold Separately,w,On-Site,x,Off-Site,z,Tandem') as GAR 

Créer la table de recherche

CREATE TABLE GarageLookup (GarageID VARCHAR(4), GarageTypeName VARCHAR(64)) 
INSERT INTO GarageLookup (GarageID, GarageTypeName) VALUES('a', 'Attached') 
INSERT INTO GarageLookup (GarageID, GarageTypeName) VALUES('b', 'Detached') 
/* Insert all rows into GarageLookup that are in the Lookup function currently */ 

Utilisez la table de recherche dans le SELECT au lieu de la fonction de recherche

SELECT /*Everything ommitted to be brief*/ 
     gl.GarageTypeName 
FROM rets_de AS r WITH(NOLOCK) 
JOIN GarageLookup AS gl WITH(NOLOCK) ON r.gar = gl.GarageID 
+0

J'ai posté une partie de la vue dans la question puisqu'elle était plus longue que les 600 caractères autorisés. – Josh

+0

Je pensais à ça avant de faire l'UDF, mais j'étais dans un moment critique. Vous pouvez également avoir plusieurs valeurs à rechercher puisque le fichier r.gar est une liste d'identifiants séparés par des virgules pour GarageLookup.Je pensais que vous auriez dû utiliser un UDF ou une sous-requête pour cette façon ou une autre alors je viens d'écrire la partie UDF. – Josh

+0

Malheureusement, je pense que vous trouverez que si vous avez commenté le fichier UDF de vos choix, tout sera beaucoup plus rapide. Étant donné que vous effectuez plusieurs recherches pour chaque ligne, vous pouvez essayer de faire en sorte que votre UDF n'ait pas besoin d'analyser les valeurs de chaîne à chaque fois et de créer autant de fonctions UDF que nécessaire, une par analyse de la liste. transmis et utiliser en interne une table de recherche - ne pas avoir à analyser une liste délimitée par des virgules 10 fois pour chaque ligne devrait accélérer un peu les choses. – Relster

Questions connexes