14. januar 2004 - 14:30Der er
11 kommentarer og 2 løsninger
MS SQL vs. Oracle mht. SQL syntakst
Hej.
Jeg har en større applikation der som et forsøg skal prøve at køre på Oracle. Normalt bruges MS SQL Server 7 som database og SQL'en er derfor mere eller mindre tilpasses MS SQL Server. Jeg har derfor mine tvivl vedr. om det i det hele taget vil virke på Oracle.
Jeg er ikke så nervøs for sådan noget som LEFT/RIGHT, INNER/OUTER joins, men hvad med sub-select - kan Oracle klare det? Hvad med ting som SUM() og MAX() ? Vil nedenstående SQL sætninger umiddelbart virke på Oracle? Hvis nej, skal der en lille eller større ændring til?
SELECT Init,Status FROM APV_Week_Header WHERE (Status=1 OR Status=2) AND IWeek = 1 AND IYear = 2000 AND Init IN (SELECT Init FROM APV_User_Info WHERE ExpenseDep IN (SELECT ExpenseDep FROM APV_User_Department) AND ExpenseDep IN (SELECT ExpenseDep FROM APV_ExpenseDep_Admin WHERE Init = 'ABC')) ORDER BY Init
SELECT WH.IWeek AS Week, WH.IYear AS Year, MAX(DISTINCT WD.DESCRIPTION) AS Description, WD.DKE AS DKE, MAX(DISTINCT WD.CODE) AS Code, SUM(WD.HOURS) AS Hours, WE.Task_Name FROM APV_Week_Header AS WH INNER JOIN APV_Week_Data AS WD ON WH.ID = WD.ID LEFT JOIN APV_Week_Etc WE ON WH.ID = WE.WeekID WHERE (WH.INIT = 'ABC') AND (WH.IYear BETWEEN 2000 AND 2001) AND (WD.DKE LIKE '%DKE-100%') AND (WD.DESCRIPTION LIKE '%noget%') GROUP BY WH.IWeek, WH.IYear, WD.DKE, WE.Task_Name ORDER BY Year, Week, DKE
Er der evt. andre ting jeg skal være opmærksom på?
Umiddelbart kan jeg ikke se noget, som ikke burde virke. Oracle er en af de databaser med absolut størst "ordforråd" indenfor SQL, men den har en del sjove "hjemmelavede" syntakser, man lige skal tage højde for.
Men de to queries ovenover burde, efter min bedste vidende, fungere.
Du kan bruge TOAD fra Quest Software - det er noget af det bedste der findes til Oracle.
Mht joins - du skal være obs på, at kun Oracle 9i understøtter INNER / OUTER syntaksen. I tidligere versioner skal du skrive om til den gamle syntaks med (+) for outer join.
Performance mæssigt kan der være nogle ting der er anderledes - MSSQLs query optimizer benytter flere index i valg af plan - Oracle benytter kun 1 index. Og statistikker på index i Oracle opdateres ikke automatisk - det skal du selv håndtere.
Oracle er absolut ikke nemmere at drifte end MsSQL - tværtom!
trer: Jeg prøver lige at finde ud af hvilken version af Oracle det evt. skal køre på. Men hvis vi nu siger at det version 9i eller nyere (hvis der findes en nyere ;)), vil ovenstående SQL sætninger så virke uden at de skal skrives om? (det er mest det jeg er ude efter!)
jeg vil blot bekræfte trer/avlund - det er ikke noget i ovenstående, som ikke burde virke.
Du skal dog være meget opmærksom på performance. Oracle's optimizer virker helt sikkert MEGET anderledes en MS'. Hvis du begynder at få performance problemer, så skal din kode skrives om - og du skal selv sørge for vedligeholdelse af statistikker.
Og Oracle 9i release 2 (9.2.0.4) er den nyeste - med mindre der er kommet en ny patch indenfor de sidste 2 måneder.
Performance mæssigt er følgende en meget dårlig kode - i hvert fald i oracle - i stedet for at bruge en IN - så bør der bruges et almindeligt join. Jeg kan se, at det godt kan laves som et rent join imellem 4 tabeller:
SELECT Init,Status FROM APV_Week_Header WHERE (Status=1 OR Status=2) AND IWeek = 1 AND IYear = 2000 AND Init IN (SELECT Init FROM APV_User_Info WHERE ExpenseDep IN SELECT ExpenseDep FROM APV_User_Department) AND ExpenseDep IN (SELECT ExpenseDep FROM APV_ExpenseDep_Admin WHERE Init = 'ABC'))
og hvis jeg gætter rigtigt, så er mange af IN unødvendige - Init = 'ABC' i inderste select gør formentlig, at yderste Init også er ABC - men jeg gætter!
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.