 
Introduction
Bien qu’il soit hasardeux, voire dangereux, de comparer deux technologies si différentes que Sybase ASE et Sybase IQ, il apparaît pratique dans certains cas de pouvoir intégrer leurs caractéristiques propres en les mettant en relief par le biais d’une comparason méthodique (architecture, verrouillage, transactions, commandes, etc.).
Les professionnels d’une technologie désirant aborder l’autre pourront ainsi obtenir quelques équivalences, si tant est qu’il puisse y en avoir, ils auront au moins un point d’entrée vers la notion abordée.
Le parallèle est aussi réalisé entre les deux moteurs pour souligner les options et paramétrages systèmes du moteur IQ qui le rendent compatible et interopérable avec le moteur ASE (langage, typage…). Cette interopérabilité facilite notamment les passerelles entre les deux moteurs pour les chargements de données, la consultation de l’historique de Sybase IQ depuis un serveur Sybase ASE et cette interopérabilité est grandement exploitéee par l’option Real Time Loading for IQ de Sybase Replication Server.
Architecture
Caractéristiques générales
| Thème | ASE | IQ | 
|---|---|---|
| Exploitation | Transactionnel (OLTP) On Line Transactional Processing | Décisionnel (Datawarehouse) | 
| Stockage des données | Stockage en lignes Chaque page de données contient une ligne entière, méthode la plus efficace pour extraire et ecrire un petit nombre d’information, caractéristique du transactionnel. | Stockage en colonnes
Chaque page de données contient les
informations d’une seule colonne : méthode
la plus efficace pour filtrer ou extraire
un très grand nombre d’informations,
caractéristique du décisionnel.
Pour cette raison, les paramètres relatifs
aux stockage en ligne comme le mode de
verrouillage (locking scheme), les paramètres max rows per page,expected row sizesont
sans équivalent sous IQ. | 
| Compression | Non | Double compression naturelle : 
 | 
| Système | 1 moteur : 
 | 2 moteurs : 
 | 
| OLAP | Non | Supporté | 
| Dialectes SQL | 1 language SQL : 
 | 2 languages SQL : 
 | 
| Processus | 1 processus par 'engine', threads internes au sein de chaque processus. | 1 processus unique 'multithreadé'. | 
| Architecture | 1 instance = plusieurs bases  Équivalence de master+sybsys*: métadonnées
(metadata) + structures et procédures systèmes. 
Les procédures et objets utilisateurs sont
enregistrés dans les bases utilisateurs. | 1 instance = 1 base  Les bases multiples sont possibles, mais non
recommandés.
Le catalogue SYSTEM contient les métadonnées,
structures, procédures systèmes ET les objets
utilisateur (vues, procédures stockées…). | 
| Supports physiques de stockage | devicePossibilité de créer des devices sous forme de
fichiers ou de raw device. | dbspacePour le catalogue, le dbspace est obligatoirement
un fichier. Pour les dbspace utilisateur, le
support peut être un fichier ou un raw device. | 
| Journalisation | Certaines opérations peuvent ne pas être
journalisées ( fast bcp, select into… ) | Pas d’opération non journalisée | 
Indexes
| Thème | ASE | IQ | 
|---|---|---|
| Types | 2 types d’index différents : 
 | 7 indexes diférents 
 | 
| Usage | create indexAPRÈS chargement des données | create indexAVANT chargement des données | 
| Liste des indexes | sp_helpindex TABLE / sysindexes | sysiqvindex / sysiqidx | 
Verrouillage
| Thème | ASE | IQ | 
|---|---|---|
| Écriture | Écriture simultanée sur une table possible moyennant verrouillage. | Non supporté (IQ n’est pas un moteur OLTP !). Les ordres d’écriture sont mis en file d’attente ou en erreur. | 
| Lecture | Les lecteurs sont bloqués par une écriture en cours Avantages : garantie transactionnelle implicite du périmètre. Inconvénients : contention possible. | Les lecteurs lisent la dernière version
disponible (snaphots) 
Avantages : pas de contention de verrous.
Inconvénients : pas de garantie transactionnelle
de type ACID. Les différentes versions
des snapshots doivent être maintenues en mémoire
tant qu’un lecteur n’a pas lancé la commande commit. Des problèmes d’allocation d’espace
peuvent se produire. | 
| Niveau d’isolation (Isolation level) | Isocation level 1 ( read committed)
par défaut. Seules les données validées sont
lues. | Isolation level 3 par défaut ( serializable). | 
Sécurité
| Thème | ASE | IQ | 
|---|---|---|
| Comptes / Rôles | dbowner (propriétaire des objets) : dbo. 
Le catalogue utilisateur (sysobjects,sysindexes…) est stocké dans la base
utilisateur et appartient au propriétaire
dbo de la base | dbowner (propriétaire des objets) : object owner,schema. 
Les objets du catalogue appartiennent au
comptesys. | 
| SA | Administrateur système : compte sa, rôle sa_role | Administrateur système : DBA | 
| SSO (Security Officer) | Rôle sso | Pas d’équivalent DBA | 
| DDL | grant create table, grant create view… | Rôle resource | 
| Vues systèmes | sysdevices, tables MDA… : propriétaire sa
(dbo de la base master). | Propriétaire sys | 
Partitions
| Thème | ASE | IQ | 
|---|---|---|
| Partitions | Le partitionnement physique aléatoire (round robin) permettant entre autres la mise en œuvre de stratégies de parallélisation existe depuis les versions ASE 11.5 (1998…). Depuis la version 15.0 (2006), le partitionnement sémantique est possible (partitionnement par intervalles, par liste, par valeurs de hachage : RANGE, LIST, HASH). | Disponible à partir de Sybase IQ 15.0 Le partitionnement sémantique est inutile à moins de 1 To de données. Le partitionnement sémantique sous IQ a plus été imaginé pour le cycle de vie des applications. Les partitions les plus anciennes et les moins accédées sont déplacées sur des espaces de stockage moins puissants et moins coûteux que les partitions les plus récentes et les plus accédées. Une caractéristique du moteur IQ consiste à remplacer l’I/O par un usage CPU intensif. Par nature donc, IQ est consommateur de ressources de calcul. Les stratégies de partitionnement dans un SGBD classique ont deux axes de fonctionnement. Dans le cadre sémantique, on offre une possibilité de filtrer sur un ensemble identifié de données. On procède par élimination de partitions : les données ne peuvent être triées que sur un axe unique dans cette technique. Le deuxieme cadre, historique, est le partitionnement de type "round robin" qui vise à créer une structure où les données sont réparties dans des sous ensembles de taille réduite. L’interrogation de ces structures est réalisée en utilisant toutes les ressources disponibles grâce à du parallélisme : c’est une technique utilisable en mode batch. À propos du moteur IQ : dans le cas du partitionnement sémantique, le stockage en colonnes, les Fast Projection et les bitmaps limitent par nature le besoin d’avoir à éliminer des partitions. Dans le partitionnement aléatoire (round robin), il va falloir composer avec la puissance de la machine, celle-ci étant déjà fortement mise à contribution par IQ par nature. Pour ces raisons, en deça d’un volume important, le partitionnement ne s’avère pas forcément être une option indispensable. | 
Exploitation des données
Typage
| Thème | ASE | IQ | 
|---|---|---|
| bit | 1=true, 0=false | identique | 
| Types chaîne | nchar/nvarchar/unichar/univarchar | char/varchar | 
| char | < 2K(ou4,8,16).
Dépend de la taille de page du serveur | char< 32K | 
| varchar | <2K(ou4,8,16).
Dépend de la taille de page du serveur | varchar, stocké en réalité comme uncharavec l’optionTRIM_TRAILING_BLANKS | 
| long varchar | non supporté | < 512 T | 
| datetime | datetime(millisecondes arrondies au 1/300)
Format par défaut :MMM-DD-YYYY | timestamp / datetime(alias detimestamp) 
Attention, le typetimestampIQ est
un typedatetimecontrairement à ASE
Format par défaut :YYYY-MM-DD | 
| date | date | date | 
| time | time | time | 
| timestamp | varbinary, ne représente pas une date
mais une version de données | datetimesous IQ | 
| numeric | numericPrécision par défaut :18,0 | numeric Précision par défaut :30,6 | 
| real | real: 4 octets | real: 4 octets | 
| double | double: 8 octets | double: 8 octets | 
| float | float: 8 octets | float: 4 octets 
Équivalent au type "real" : voir l’optionFLOAT_AS_DOUBLEpour la compatibilité avec ASE | 
| text/image | text/image: 2 Gb | long varchar < 512 T | 
| Java | java | Non supporté | 
| Types disponibles | sp_datatype_info | sp_iqdatatype null,null,'SYSTEM' | 
Chargements de données
| Thème | ASE | IQ | 
|---|---|---|
| Chargements massifs | bcp Commande externe permettant de charger dans
une table toute structure texte délimitée. | load tableCommande interne à l’instance permettant de
charger dans une table toute structure texte
délimitée. | 
| Données distantes (CIS) | select from proxy_tablePermet d’adresser tout type de données
distantes : ASE, IQ, fichier texte, mais aussi,
moyennant des connecteurs sous licences,
Oracle, MSSQL, DB2… | select from proxy_table Permet nativement d’adresser des données ASE
et IQ distantes. Des interfaces ODBC et JDBC
permettent tout type de connexion hétérogene
(Oracle, DB2…). | 
| Insert location | Non | insert location... 
Syntaxe spécifique à IQ permettant des
chargements massifs performants à partir de
données en provenance d’un serveur ASE
ou d’un serveur IQ. | 
Procédures
| Thème | ASE | IQ | 
|---|---|---|
| Création | Types de données définis par le premier ordre selectretourné à l’appelant | Types de données déclarés par RESULTen langage Watcom-SQL 
Compatibilité Transact-SQL assurée pour garantir
la création de procédures stockées identique à
un serveur ASE. | 
| Passage de paramètres | in : @val type out : @val type output | IN val type OUT val typeLe caractère@est optionnel sous IQ (mais
supporté) | 
| Déclaration de variables | La déclaration de variables peut avoir lieu
n’importe où dans le code.  | Une variable créée avec la commande CREATE VARIABLEpersiste durant la
session même si elle est créée dans un blocBEGIN .. END.Les syntaxes ASESETetSELECTsont supportées
pour les affectations de variables.
Les variables créées avec la commandeDECLAREne
sont persistantes que dans le blocBEGIN .. ENDdans lequel elles sont déclarées. | 
| Allocation |  | Utiliser de préférence la commandeSET.
Pour la commandeSELECT, la clausefrom dummyest optionnelle mais importante. Si elle est omise,
la compatibilité Transact-SQL fonctionne mais la
requête est parsée par la couche ASA avec un
surcoût. | 
| Conversion de language | Sans objet (un seul langage : Transact-SQL) | La fonction TransactSQL(commande)transforme
une commande Watcom-SQL en Transact-SQL.La fonction WatcomSQL(commande)transforme de
la syntaxe Transact-SQL en langage Watcom SQL
La fonctionSQLDialect(commande)retourne le
type de syntaxe (Transact-SQL ou Watcom). | 
| Gestion d’erreur | La gestion d’erreur affecte la variable globale @@erroret exécute l’instruction suivante.
 | La gestion d’erreur affecte SQLSTATEetSQLCODEet quitte le programme.L’instruction ON EXCEPTION RESUMEsimule le
comportement Transact-SQL
 | 
Tables temporaires
| Thème | ASE | IQ | 
|---|---|---|
| Globales | Correspond à la création d’une table physique
dans la base tempdb. 
Elle est effacée au redémarrage de l’instance
(configurable, model et/ou traceflag ) .
Chaque utilisateur ayant les permissions sur
cet objet voit les données communes. Exemple : User1 peut insérer les données
dans la table globale.Exemple : User2 peut voir le contenu de la table globale 
 | La table temporaire est créée une seule fois. 
Elle persiste après le redémarrage de
l’instance.
Chaque utilisateur possède sa version de la
table temporaire.
Le contenu de la table est vidé après chaque commit, configurable avec
l’optionON COMMIT PRESERVE ROWSExemple : User1 peut insérer les données dans
la table globale. Attention, les lignes sont
vidées apres l’ordrecommitSi la table est recréée avec l’option ON COMMIT PRESERVE ROWS, alors
comme son nom l’indique les données seront
préservées.Néanmoins, un deuxième utilisateur, ne verra que sa propre version des données 
 | 
| Locales | Ces tables temporaires sont locales
à la session utilisateur courante et invisible
pour les autres connexions. 
Elle est supprimée lors de la déconnexion de
l’utilisateur (ou lors d’une commande de
suppression explicite ).  | Elles sont locales à la session utilisateur courante
et invisible pour les autres connexions. 
Elle est supprimée lors de la déconnexion de
l’utilisateur (ou lors d’une commande de
suppression explicite ).
2 syntaxes pour IQ : ou | 
Divers
| Thème | ASE | IQ | 
|---|---|---|
| Truncate | truncate= DDL
(Data Definition Language) | truncate= DML
(Data Manipulation Language)
La commanderollbackest possible | 
| Compteur automatique | identityL’insertion et/ou la mise à jour implicite est
possibleL’usage d’une instructionselect identity_col into ...maintient
le caractère 'identity' de la colonne | DEFAULT AUTOINCREMENT(identitysupporté
pour compatibilité) 
L’insertion et/ou la mise à jour implicite est
possibleL’usage d’une instructionselect identity_col into ...ne propage pas
le caractère 'AUTO INCREMENT' | 
| Computed columns (colonnes calculées) | Oui | Non | 
| defaults/rule | create default/create rule | create domain Les valeurs par défaut sont supportées à partir de
la version IQ 12.7 | 
| Déclencheurs (triggers) |  | Non supportés pour les tables. Seuls les triggers systèmes sont supportés. | 
| Create table (NULL/NOT NULL) | Si le caractère NULLouNOT NULLest omis,NOT NULLest appliqué par défaut | Si le caractère NULLouNOT NULLest omis,NULLest appliqué par défaut | 
Langage SQL
Jointures / group
| Thème | ASE | IQ | 
|---|---|---|
| Subquery on clause | Oui | Non | 
| Full outer join | Non supporté | Oui 
 | 
| Join index | Non supporté | Oui  | 
| Union in subquery | Oui  | Non, déconseillé | 
| group by | Oui | Oui | 
| group by all | Oui 
 | Non supporté | 
| Projected non group column | Oui 
 | Non | 
| Compute by | Compute by
 | La commande compute byen elle même n’est pas
supportée, les commandes OLAP (ROLLUP) permettent
d’obtenir des résultats équivalents. | 
Traitement des valeurs NULL et des chaînes vides
| Thème | ASE | IQ | 
|---|---|---|
| Gestion des valeurs NULL | Si jamais il y avait besoin de le rappeler :
la valeur NULLse teste avecIS [NOT] NULL Par défaut diffère de la norme ANSI
(set ansinulloff).null=null =>vrai | Par défaut respecte la norme ANSI
( set ansinull on).null=null =>faux | 
| 0 length string | zero length string != NULLChaîne vide = un caractère espace
 | zero length string != NULL Valeur réelle
 | 
Syntaxe SQL de base
| Thème | ASE | IQ | 
|---|---|---|
| Quotes | double_quoteest equivalent àsimple_quote" = ' | double_quoteest différent desimple_quote " != 'sauf siset quoted_identifierest appliqué | 
| Concaténation | Concaténation de chaînes : + | Concaténation de chaînes : +ou|| | 
| Validation de commande | Commande : go | Commande : ; | 
| Date du jour | select getdate() | select getdate() from dummyIl est syntaxiquement possible d’omettre la
clauseFROM, néanmoins les performances en
sont dégradées. Dans ce cas en effet la requête
est interprétée par le moteur ASA, non par IQ | 
Fonctions SQL
| Thème | ASE | IQ | 
|---|---|---|
| Recherche de texte | patindex
 | patindex, sans les optionsUSING CHARACTERS, niUSING BYTES
 locate
 | 
| Fonctions ASE | curunreservedpgs,data_pgs,host_id,host_name,lct_admin,reserved_pgs,rowcnt,valid_name,valid_user,ptn_data_pgs,index_colorder | N/A | 
| Contains | Oui, uniquement dans l’option FullText (FTS) de Sybase ASE. | Oui, index WORD | 
| Taille d’une chaîne | len | length | 
| tsequal (comparaison de timestamp) | tsequal | Non | 
| rownum | Non supporté | rowid
 | 
| Transtypage | convert/cast | convert/cast | 
| Minuscule/ Majuscule | lower/upper
 | lcase/ucase Compatibilité Transact-SQL :lower/upperautorisés
 | 
| udf (User Defined Functions) | Les fonctions udf sont supportées à partir de Sybase ASE 15.0.2 | Les fonctions udf sont supportées. 
Même restriction que pour ' select ... from dummy',
la couche ASA est sollicitée, donc plus lente. | 
Fonctions de manipulation des dates
| Thème | ASE | IQ | 
|---|---|---|
| dateadd | Oui | Oui | 
| date +/- int : | Non 
Utiliser dateadd
 | Oui 
Résultat de type datetime 
 | 
| date + time | Non supporté 
Utiliser dateadd | Oui 
Résultat de type datetime 
 | 
Commandes select into
| Thème | ASE | IQ | 
|---|---|---|
| select into : table | Oui | Oui Attention, syntaxe qui permet aussi l’affectation de variables | 
| select into : #temp | Oui | Oui | 
| select into : existing table | Oui | Non | 
| select into : proxy table | Oui | Non | 
| Updatable views | Oui | Oui | 
Administration
Gestion de la base
| Thème | ASE | IQ | 
|---|---|---|
| Création |  | pour assurer une compatibilité avec ASE, ajouter
les optionsCASE RESPECTetBLANK PADDING ON | 
| Ajout d’espace |  |  | 
| Gestion des devices | disk init,disk mirror,disk refit,disk resize | N/A | 
| Devices | sp_helpdevice / master..sysdevices | sysdbfile / sysiqdbspace | 
| Casse | Gérée au niveau de l’instance, dépend de
l’ordre de tri installé au niveau serveur
(' sort order'). L’ordre de tri est
reconfigurable (par défautCase sensitive). 
Les règles s’appliquent de la même manière
pour les données et identifiantssp_helpsort | Gérée à la création de la base
( create database ... CASE respect|ignore).
Non reconfigurable. 
Les identifiants sont insensibles à la casse. | 
Surveillance, administration
| Thème | ASE | IQ | 
|---|---|---|
| Liste des processus | sp_who | sp_iqwho sp_iqclient_lookup / sp_iqconnection /
sp_iqcontextsa_conn_activity | 
| État du serveur | sp_server_infosp_sysmon | sp_iqstatussp_iqsysmon(IQ 12.7/15.0)
IQ Utilities (IQ 12.x) | 
| Verrous | sp_lock | sp_iqlocks | 
| Taille de base | sp_helpdb | sp_iqdbspaceinfo / sp_iqdbspaceobjectinfo  | 
| Liste des bases | sp_databasesselect name from master..sysdatabases | Non supporté. 
Si l’on considère qu’une base est un schéma :  | 
| Taille d’une table | sp_spaceused SECURITY_ANALYTICS | sp_spaceinfo 'table SMF.SECURITY_ANALYTICS' sp_iqtablesize 'SMF.SECURITY_ANALYTICS' | 
| Configuration d’une instance | sp_configurePermet de voir et modifier les options au niveau
serveurTable système :sysconfigures | sp_iqcheckoptions Cette commande n’est que de la consultation, pour
modifier un paramètre :set [ public ] optionTables systèmes :sysconfigures / sysoptionsLes options sous IQ peuvent être définies au niveau
public, utilisateur ou temporaire
(à la session courante). | 
| Estimation de taille | sp_estspace | sp_iqestspace | 
| Liste des objets | sp_help | sp_iqhelpsp_iqhelp null,null,'table'sp_iqtablesp_iqhelp null,null,'view'sp_iqviewsp_iqhelp null,null,'procedure'sp_iqprocedure | 
| Caractéristiques d’une colonne | sp_helpsp_columns | sp_iqcolumn sp_iqrowdensity 'table SMF.SECURITY_ANALYTICS' | 
| Catalogue des objets | sysobjects | sysobjects / sysiqobjects | 
| Taille des indexes | sp_spaceused TABLE, 1 | sp_iqindexinfo / sp_iqindexsizesp_iqindexinfo 'table SMF.PORTFOLIO'sp_iqindexsize 'SMF.PORTFOLIO.ASIQ_IDX_FP' | 
| Utilisateurs | sp_helpuserTable systèmesysusers | Non supporté 
Tables systèmes sys.sysuseretsysusers | 
| Historique des sauvegardes | Non implémenté |  | 
| Statistiques | Tables mda, variables @@cpu… | sp_iqstatistics | 
| Transactions | sp_transactions | sp_iqtransaction | 
| Base de données | sp_helpdb | sa_db_info / sa_db_properties | 
Serveurs distants
| Thème | ASE | IQ | 
|---|---|---|
| Remote server (serveurs distants) | sp_addserver | create server | 
| Recherche de serveurs | sp_helpserver | select * from sys.sysservers | 
Tables systèmes
| Thème | ASE | IQ | 
|---|---|---|
| Tables systèmes equivalentes et/ou simulées | syscolumns,syscomments,sysindexes,systypes,sysusers,syslogins | ok | 
| sysobjects | sysobject,sysobjects | |
| Tables/vues systèmes spécifiques | sysalternates,sysconstraints,sysdepends,syskeys,syslogs,sysprocedures,sysprotects,sysreferences,sysroles,syssegments,systhresholds,syscharsets,sysconfigures,syscurconfigs,sysdatabases,sysdevices,sysengines,syslanguages,syslocks,sysloginroles,sysmessages,sysprocesses,sysremotelogins,ysservers,syssrvroles,sysusages | sysviews,systab |