Comparaison Sybase ASE vs Sybase IQ


1- 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.

2- Architecture

2-1- Caractéristiques générales

Thème ASE IQ
Exploitation Transactionnel (OLTP, On Line Transactional Processing) Décisionnel (Datawarehouse)
Stockage des données Stockage par ligne

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 par colonne

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 size sont sans équivalent sous IQ.

Compression Non Double compression naturelle :
  • logique (fast projection, bitmaps)
  • physique (compression de pages)
Système 1 moteur :
  • ASE
2 moteurs :
  • IQ pour le stockage et la restitution
  • ASA (connectivité, parse, securité, CIS)

Sybase a séparé la logique purement décisionnelle de la maintenance et l'administration, raison pour laquelle on trouve une couche SQL Anywhere ou ASA (Adaptive Server Anywhere) à côté du moteur IQ proprement dit. A l'origine c'est la couche ASE qui était associée au moteur IQ.

OLAP Non Supporté
Dialectes SQL 1 language SQL :
  • Transact SQL
2 languages SQL :
  • Watcom SQL (natif ASA , recommandé)
  • Transact-SQL (pour compatibilité)
Processus 1 processus par 'engine', threads internes au sein de chaque processus. 1 processus unique 'multithreadé'.
Architecture 1 instance = plusieurs bases


Architecture ASE

É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


Architecture IQ

Les multiples bases 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 device

Possibilité de créer des devices sous forme de fichiers ou de raw-device.

dbspace

Pour 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

2-2- Indexes

Thème ASE IQ
Types 2 types d'index différents :
  • Indexes btree (nonclustered indexes)
  • Indexes btree "clusterisés" (clustered indexes). Les données sont triées sur la clé d'index. La dernière page d'index est la page de données.
7 indexes diférents
  • FP (Fast Projection par défaut, 'lookup table')
  • LF (Low Fast , btree + bitmap)
  • HG (High Group , btree + bitmap + Group Array)
  • HNG (High Non Group : bitwize)
  • DATE
  • TIME
  • DTTM
  • WORD (Word : +/- 'fulltext', equivalent au HG)
Usage create index APRÈS chargement des données create index AVANT chargement des données
Liste des indexes sp_helpindex TABLE / sysindexes sysiqvindex / sysiqidx

2-3- 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).

2-4- 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.

Les objets du catalogue appartiennent au compte sys.

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

2-5- Partitions

Thème ASE IQ
Partitions Le partitionnement physique aléatoire (round robin) permettant entre autres la mise en oeuvre 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.

3- Exploitation des données

3-1- Typage

Thème ASE IQ
bit 1=true, 0=false identique
Types chaine nchar/nvarchar/unichar/univarchar char/varchar
char <2K (ou 4,8,16). Dépend de la taille de page du serveur char<32K
varchar <2K (ou 4,8,16). Dépend de la taille de page du serveur varchar, stocké en réalité comme un char avec l'option TRIM_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 de timestamp )

Attention, le type timestamp IQ est un type datetime contrairement à 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 datetime sous IQ
numeric numeric

Pré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'option FLOAT_AS_DOUBLE pour la compatibilité avec ASE

text/image text/image : 2 Gb long varchar < 512 T
Java java datatype Non supporté
Types disponibles sp_datatype_info sp_iqdatatype null,null,'SYSTEM'

3-2- 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

bcp BASE..test in file.csv -c -t';'
-S ... -U ... -P ...
load table

Commande interne à l'instance permettant de charger dans une table toute structure texte délimitée

LOAD TABLE test
(
a date('YYYY/MM/DD') null('0000/00/00'),
     FILLER(1),
b,
c
)
FROM 'file.csv'
DELIMITED BY ';'
ROW DELIMITED BY '\n'
QUOTES off
ESCAPES off
FORMAT ascii
WITH CHECKPOINT ON
PREVIEW ON
;
        commit;
Données distantes (CIS) select from proxy_table

Permet d'adresser tout type de données distantes : ASE, IQ, fichier texte, mais aussi - moyennant connecteurs - 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.

3-3- Procédures stockées

Thème ASE IQ
Création Types de données définis par le premier ordre select retourné à l'appelant

create proc sp_test
AS
BEGIN
select a from test
END
go
Types de données déclarés par RESULT en langage Watcom-SQL

Compatibilité Transact-SQL assurée pour garantir la création de procédures stockées identique à un serveur ASE.

create proc sp_test ()
RESULT ( a varchar(10) )
BEGIN
select a from test;
END;
Passage de paramètres in : @val type

out : @val type output

drop proc sp_test
go
create proc sp_test ( @param int )
AS
BEGIN
select a from test
where b=@param
END

exec sp_test 2
a
----------
aaa
bbb
IN val type

OUT val type

drop proc sp_test;

create proc sp_test ( IN param int)
RESULT ( a varchar(10) )
BEGIN
select a from test where b=param;
END;

sp_test 2
a
----------
aaa
bbb

Le 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.

declare @var type
Une variable créée avec la commande CREATE VARIABLE persiste durant la session même si elle est créée dans un bloc BEGIN .. END.

create variable var type;

Les syntaxes ASE SET et SELECT sont supportées pour les affectations de variables.

Les variables créées avec la commande DECLARE ne sont persistantes que dans le blobc BEGIN .. END dans lequel elles sont déclarées.

declare variable_name data-type;
Allocation
set @var=val, select @var=val
set @var=val, select @var=val from dummy

Utiliser de préférence la commande 'SET'.

Pour la commande 'SELECT' , la clause 'from dummy' est 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.

select TransactSQL('create variable @a int')
 from dummy;
-------------------------
declare @a integer

La fonction WatcomSQL(commande) transforme de la syntaxe Transact-SQL en langage Watcom SQL

La fonction SQLDialect(commande) retourne le type de syntaxe (Transact-SQL ou Watcom).

Gestion d'erreur La gestion d'erreur affecte la variable globale @@error et exécute l'instruction suivante.

create proc sp_test
as
begin
declare @a int
create table #tmp ( a int not null)

insert #tmp ( a ) values ( @a )
select getdate() 'Date',
  @@error '@@error'
end

Msg 515, Level 16, State 3
Server 'MIP_U1_ASE', Procedure 'sp_test',
 Line 7 Attempt to insert NULL value
into column 'a', table '#tmp';
column does not allow nulls.
Update fails.
Command has been aborted.

Date                @@error
------------------- -----------
Nov 30 2009   3:45AM        515
        
La gestion d'erreur affecte SQLSTATE et SQLCODE et quitte le programme.

create proc sp_test
as
begin
declare @a int
create table #tmp ( a int not null)
insert into #tmp ( a ) values ( @a )

select  getdate() as 'Date',
        @@error   as 'error'
from dummy
end;

(sa)> sp_test
Could not execute statement.
Tried to insert a null value into a
non-null field a on row 1.
--
db_sqlins.cxx 12375)
SQLCODE=-1002005, ODBC 3 State="HY000"
Line 1, column 1

L'instruction 'ON EXCEPTION RESUME' simule le comportement Transact-SQL

create proc sp_test ()
ON EXCEPTION RESUME
begin
declare @a int;
create table #tmp ( a int not null);
insert into #tmp ( a ) values ( @a );
select  getdate() as 'Date',
        SQLSTATE as 'QLSTATE',
        SQLCODE as 'SQLCODE'
from dummy;
end;
commit;

(sa)> sp_test()
Date                       SQLSTATE SQLCODE
-------------------------- ------- -----------
Nov 30 2009   3:59AM 00000  0

(1 row affected)
        

3-4- Tables temporaires

Thème ASE IQ
Globales Correspond à la création d'un 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.

create table tempdb..temptable ( a int )
go

Exemple : User 1 peut insérer les données dans la table globale.

USER 1> insert tempdb..temptable values ( 1 )
go
USER 1> select a from temptable
USER 1> a
        ------
             1
go

Exemple : User 2 peut voir le contenu de la table globale

USER 2>
USER 2> select a from temptable
USER 2> a
        ------
             1
go
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 : ON COMMIT PRESERVE ROWS)

create global temporary table temptable ( a int ) ;

Exemple : User 1 peut insérer les données dans la table globale. Attention, les lignes sont vidées apres l'ordre commit

USER 1> insert temptable values ( 1 ) ;
USER 1> select a from temptable;
USER 1> a
        ------
             1
USER 1> commit
USER 1> select a from temptable;
USER 1> a
        ------
0 rows ...
        

Si 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.

USER 1> drop table temptable ;
USER 1> create global temporary table
temptable ( a int ) ON COMMIT PRESERVE ROWS;
USER 1> insert temptable values ( 1 )
USER 1> commit
USER 1> select a from temptable
USER 1> a
        ------
             1

Néanmoins, un deuxième utilisateur, ne verra que sa propre version des données

USER 2> select a from temptable
USER 2> a
        ------

0 row ...
        
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 ) .

create table #temptable ( a int )
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 :

create table #temptable ( a int )

ou

declare local temporary table
temptable ( a int )

3-5- Divers

Thème ASE IQ
Truncate Truncate = DDL truncate = DML. La commande rollback est possible
Compteur automatique Identity

L'insertion et/ou la mise à jour implicite est possible

create table test ( a INT identity )
insert test ( a ) values ( 1 )    --> ERR

SET IDENTITY_INSERT test on
insert test ( a ) values ( 1 )    --> OK
insert test ( a ) values ( null ) --> ERR
update test set a=2 where a = 1   --> ERR

SET IDENTITY_UPDATE test on
update test set a=2 where a = 1   --> OK

SET IDENTITY_UPDATE test off
SET IDENTITY_INSERT test off

L'usage d'une instruction select identity_col into ... maintient le caractère 'identity' de la colonne

DEFAULT AUTOINCREMENT (identity supporté pour compatibilité)

L'insertion et/ou la mise à jour implicite est possible

create table test ( a INT DEFAULT AUTOINCREMENT )
insert test ( a ) values ( 1 )      --> ERR

SET TEMPORARY OPTION IDENTITY_INSERT = test
insert test ( a ) values ( 1 )      --> OK
insert test ( a ) values ( null )   --> OK
update test set a=2 where a is null --> OK

L'usage d'une instruction select 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)
create trigger tr_i_test
on test
for insert
as
  if exists ( select a from
  inserted where a > 10 )
  begin
        print 'super'
  end
go
insert test ( a ) values ( 1 )
--
insert test ( a ) values ( 20 )
super

sp_help / sp_depends / sp_helptext
Non supportés pour les tables.

Seuls les triggers systèmes sont supportés.

Create table (NULL/NOT NULL) Si le caractère NULL ou NOT NULL est omis, NOT NULL est appliqué par défaut

create table test ( a varchar(10) )
sp_help 'test'
Si le caractère NULL ou NOT NULL est omis, NULL est appliqué par défaut

create table test ( a varchar(10) )
sp_iqhelp 'test'

4- Langage SQL

4-1- Jointures / group by

Thème ASE IQ
Subquery on clause Oui Non
Full outer join Non supporté Oui

create table t1 ( a int, b varchar(10) )
insert t1 ( a, b ) values ( 1, 'aa' )
insert t1 ( a, b ) values ( 2, 'bb' )
create table t2 ( a int, b varchar(10) )
insert t2 ( a, b ) values ( 2, 'cc' )
insert t2 ( a, b ) values ( 3, 'dd' )
select * from t1

select  t1.a, t1.b,
        t2.a, t2.b
from t1
join t2 on t2.a=t1.a
a      b      a      b
------ ------ ------ ------
2      bb     2     cc

select  t1.a, t1.b,
        t2.a, t2.b
from t1
full outer join t2 on t2.a=t1.a
a      b      a      b
------ ------ ------ ------
1      bb    (NULL) (NULL)
2      bb     2     cc
(NULL) (NULL) 3     dd
Join index Non supporté Oui

CREATE JOIN INDEX "jidx_test"
FOR   "SCH"."test"
FULL JOIN "SCH"."data"
ON "test"."TST_ID" = "data"."DAT_TST_ID";
union in subquery Oui

select d.col1, d.col2
from (         
        select a.col1, a.col2 
          from tablea a
        union all
        select b.col1, b.col2
          from tableb b 
        ) d
Non, déconseillé
group by Oui Oui
group by all Oui

drop table test

create table test( a varchar(10), b int )

insert test ( a, b ) values ( 'aaa', 1 )
insert test ( a, b ) values ( 'aaa', 1 )
insert test ( a, b ) values ( 'aaa', 2 )
insert test ( a, b ) values ( 'bbb', 2 )
insert test ( a, b ) values ( 'bbb', 3 )
insert test ( a, b ) values ( 'ccc', 3 )

select  a,
        count(1) 'nb',
        sum(b) 'tot'
from    test
where  b > 2
group by  a
order by 1

a     nb    tot
----- --- ---
bbb     1   3
ccc     1   3

select  a,
        count(1) 'nb',
        sum(b) 'tot'
from    test
where  b > 2
group by all a
order by 1

a     nb  tot
----- --- ---
aaa     0   0
bbb     1   3
ccc     1   3
Non supporté
Projected non group column Oui

drop table test

create table test( a varchar(10),
   b int , c date)

insert test ( a, b, c ) values
( 'aaa', 1 , '20091201')
insert test ( a, b, c ) values
( 'aaa', 1 , '20091202')
insert test ( a, b, c ) values
( 'aaa', 2 , '20091203')
insert test ( a, b, c ) values
( 'bbb', 2 , '20091204')
insert test ( a, b, c ) values
( 'bbb', 3 , '20091205')
insert test ( a, b, c ) values
( 'ccc', 3 , '20091206')
go

select  a,
        count(1) 'nb',
        sum(b) 'tot'
from test
group by a
having sum(b) >= 4
order by 1

a    nb  tot
---- --- ---
aaa    3   4
bbb    2   5

select a, count(1) 'nb', sum(b) 'tot' ,
        c
from test
group by a
having sum(b) >= 4
order by 1

a   nb tot c
---------------------
aaa  3   4 2009-12-01
aaa  3   4 2009-12-02
aaa  3   4 2009-12-03
bbb  2   5 2009-12-04
bbb  2   5 2009-12-05
        
Non
Compute by Compute by

create table test ( a varchar(10), b int )
go
insert test ( a, b ) values ( 'aaaa', 1 )
insert test ( a, b ) values ( 'aaaa', 2 )
insert test ( a, b ) values ( 'aaaa', 3 )
insert test ( a, b ) values ( 'bbbb', 4 )
insert test ( a, b ) values ( 'bbbb', 5 )
insert test ( a, b ) values ( 'cccc', 6 )
go
select a, b
from test
order by 1
compute sum(b), avg(b) by a
go

 a          b
 ---------- -----------
 aaaa                 1
 aaaa                 2
 aaaa                 3
            sum
            -----------
                      6
            avg
            -----------
                      2
 a          b
 ---------- -----------
 bbbb                 4
 bbbb                 5
            sum
            -----------
                      9
            avg
            -----------
                      4
 a          b
 ---------- -----------
 cccc                 6
            sum
            -----------
                      6
            avg
            -----------
                      6
        
La commande compute by en elle même n'est pas supportée, les commandes OLAP (ROLLUP) permettent d'obtenir des résultats équivalents.

4-2- 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 NULL se teste avec IS [NOT] NULL

Par défaut diffère de la norme ANSI (set ansinull off). null=null => vrai

declare @a varchar(10)
select @a=null

select count(1) where @a=null -- 1
select count(1) where @a is null -- 1

set ansinull on

select count(1) where @a=null -- 0
select count(1) where @a is null -- 1
Par défaut respecte la norme ANSI (set ansinull on). null=null => faux

declare @a varchar(10)
select @a=null

select count(1) where @a=null -- 0
select count(1) where @a is null -- 1

set ansinull off
select count(1) where @a=null -- 1
select count(1) where @a is null -- 1
0 length string zero length string != NULL

Chaîne vide = un caractère espace

create table test ( a varchar(10) )

insert test ( a ) values ( '' )

select datalength(a) 'dl',
ascii(a) 'as'
from test
dl   as
---- ---
1    32
zero length string != NULL

Valeur réelle

create table test ( a varchar(10) )

insert test ( a ) values ( '' )

select datalength(test.a) 'dl',
ascii(test.a) 'as'
from test
dl   as
---- ---
0    0

4-3- Syntaxe SQL de base

Thème ASE IQ
Quotes double_quote est equivalent à Simple_quote

" = '

double_quote est différent de Simple_quote

" != ' sauf si set quoted_identifier 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 dummy.

Il est syntaxiquement possible d'omettre la clause FROM, 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

4-4- Fonctions SQL

Thème ASE IQ
Recherche de texte patindex

declare @a varchar(10)
select @a='ceci est un test'
select 'a',
        patindex('%i%',@a,using chars),
        patindex('%i%',@a,using bytes)
--- --- ---
a     4   4

declare @b univarchar(10)
select @b='ceci est un test'
select 'b',
        patindex('%i%',@b,using chars),
        patindex('%i%',@b,using bytes)

 --- --- ---
b     4   7
patindex , sans les options USING CHARACTERS ni USING BYTES

declare @a varchar(10)
select @a='ceci est un test'
select 'a',
        patindex('%i%',@a),
        patindex('%i%',@a)
--- --- ---
a     4   4

locate

declare @x varchar(20)
select @x='aa/bb/cc/dd/ee'
select locate(@x, '/', 1) 'a', locate(@x, '/', -1) 'b' a b -------- --------- 3 12
Fonctions ASE curunreservedpgs, data_pgs, host_id, hos_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

drop table test;
create table test( a varchar(10));

insert test ( a ) values ( 'aaa');
insert test ( a ) values ( 'bbb');
insert test ( a ) values ( 'ccc');
insert test ( a ) values ( 'ddd');
insert test ( a ) values ( 'eee');
insert test ( a ) values ( 'fff');

select a, rowid("test") from test;

a     rowid(test)
----- -----------
aaa         1
bbb         2
ccc         3
ddd         4
eee         5
fff         6

select a from test where rowid("test")< 3;
a
-----
aaa
bbb
Transtypage convert/cast convert/cast
Minuscule/Majuscule lower/upper

declare @x varchar(10)
select @x='un TEST'
select upper(@x) 'a', lower(@x) 'c'
a          c
---------- ----------
UN TEST    un test
lcase/ucase

Compatibilité Transact-SQL : lower/upper autorisés

declare @x varchar(10)
select @x='un TEST'
select upper(@x) 'a', ucase(@x) 'b', lower(@x) 'c',lcase(@x) 'd' a b c d ------- ------- ------- ------- UN TEST UN TEST un test un test
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.

4-5- Fonctions de manipulation des dates

Thème ASE IQ
dateadd Oui Oui
date +/- int : Non

Utiliser dateadd

declare @x date, @y int
select @x='20091129', @y=1
select dateadd(day,@x,@y) 'demain'

demain
-----------------------
2009-11-30 00:00:00.000
Oui

Résultat de type datetime

declare @x date, @y int
select @x='20091129', @y=1
select @x+@y 'demain'

demain
-----------------------
2009-11-30 00:00:00.000
date + time Non supporté

Utiliser dateadd

Oui

résultat de type datetime

declare @x datetime, @y datetime
select @x='20091129', @y='03:01:02'
select @x+@y 'demain'
demain
-----------------------
2009-11-29 03:01:02.000

4-6- Commandes select into

Thème ASE IQ
select into : table Oui Oui.

Attention, syntaxe qui permet aussi l'affectation de variables

select into : # Oui Oui
select into : existing table Oui Non
select into : proxy table Oui Non
Updatable views Oui Oui

5- Administration

5-1- Gestion de la base

Thème ASE IQ
Création
disk init name=data_device,
        physname='data_device.dat',
        size='100M'
disk init name=log_device,
        physname='log_device.dat',
        size='10M'
create database userdb
        on data_device=100
        log on log_device=10
create database 'userdb.db'
        log on  'userdb.log'
        IQ_PATH 'userdb.iq'

pour assurer une compatibilité avec ASE, ajouter les options CASE RESPECT et BLANK PADDING ON

Ajout d'espace
disk init name=data_device2,
        physname='data_device2.dat',
        size='100M'
alter database userdb
        on data_device2=100
alter dbspace IQ_MAIN
        add file 'userdb2.iq'
        size 100M
Gestion des devices disk init, disk mirror, disk refit, disk resize N/A
Devices sp_helpdevice / master..sysdevices sysdbfile / sysiqdbspace

select convert(int,(block_count/256)) 'Mb' ,
 * from sysiqdbfile
Casse Gérée au niveau de l'instance, dépend de l'odre de tri installé au niveau serveur ('sort order'). L'ordre de tri est reconfigurable (par défaut Case sensitive).

Les règles s'appliquent de la même manière pour les données et identifiants

sp_helpsort
Gérée à la création de la base (create database ... CASE respect|ignore ). LNon reconfigurable.

Les identifiants sont insensibles à la casse.

select Value from sa_db_properties()
where PropName='CaseSensitive'

5-2- Surveillance, administration

Thème ASE IQ
Liste des processus sp_who sp_iqwho

sp_iqclient_lookup / sp_iqconnection / sp_iqcontext

sa_conn_activity

État du serveur sp_server_info

sp_sysmon

sp_iqstatus

sp_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_databases

select name from master..sysdatabases

Non supporté.

Si l'on considère qu'une base est un schéma, alors :

select distinct Table_owner
from sp_iqtable()
Taille d'une table sp_spaceused SECURITY_ANALYTICS sp_spaceinfo 'table SMF.SECURITY_ANALYTICS'

sp_iqtablesize 'SMF.SECURITY_ANALYTICS'

Configuration d'une instance sp_configure

Permet de voir et modifier les options au niveau serveur

sp_configure 'engines'

Table système : sysconfigures

sp_iqcheckoptions

Cette commande n'est que de la consultation, pour modifier un paramètre : 'set [ public ] option'

Tables systèmes : sysconfigures / sysoptions

Les options sous IQ peuvent être définies au niveau public, utilisateur ou temporaire (à la session courante).

Estimation de taille sp_estspace

sp_estspace SECURITY_ANALYTICS, 5000000
sp_iqestspace

sp_iqestspace 'SMF.SECURITY_ANALYTICS', 5000000
Liste des objets sp_help

select name from sysobjects where type='U'

select name from sysobjects where type='V'

select name from sysobjects where type='P'

sp_iqhelp

sp_iqhelp null,null,'table' / sp_iqtable

sp_iqhelp null,null,'view' / sp_iqview

sp_iqhelp null,null,'procedure' / sp_iqprocedure

Caractéristiques d'une colonne sp_help

sp_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_iqindexsize

sp_iqindexinfo 'table SMF.SECURITY_ANALYTICS'
sp_iqindexsize 'SMF.SECURITY_ANALYTICS.
   ASIQ_IDX_T936_C100_FP'
Utilisateurs sp_helpuser

Table système sysusers

Non supporté

Tables systèmes sys.sysuser et sysusers

Historique des sauvegardes Non implémenté select * from syshistory
Statistiques Tables mda, variables @@cpu ... sp_iqstatistics
Transactions sp_transactions sp_iqtransaction
Base de données sp_helpdb sa_db_info / sa_db_properties

5-3- Serveurs distants

Thème ASE IQ
Remote server (serveurs distants) sp_addserver

exec sp_addserver DAS_U1_ASE,
    ASEnterprise, DAS_U1_ASE
go

exec sp_addexternlogin DAS_U1_ASE,sa,
   sa,xxxx
go

connect to DAS_U1_ASE
go

use dali_assets
go

exec sp_help
go

disconnect
go

sp_dropserver DAS_U1_ASE
go
create server

create server DAS_U1_ASE class 'ASAJDBC'
using 'FRDAS301:30300';

create externlogin sa to DAS_U1_ASE
remote login sa
identified by xxx;

exec sp_remote_tables DAS_U1_ASE,
    null,null,dali_assets;

drop server DAS_U1_ASE;
Recherche de serveurs sp_helpserver select * from sys.sysservers

5-4- 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, sysservers, syssrvroles, sysusages sysviews, systab

Annexe

Historique

Version Date Commentaires
1.0 01/2010 Version initiale

Liens

Sybase ASE 15.0.3 Books Online
Sybase IQ 15.1 Books Online