Bonjour à tous,
Je suis sur un gros développement, et je n'arrive pas à trouver une solution pour optimiser la récupération de donnée
J'ai une db qui contient entre-autre 6 tables
- Stock
- Lignes_v
- Pieds_v
- Lignes_a
- Pieds_a
- Lignes_d
Sur ses tables, je dois extraire des données :
Voici ma requete
Voici ma fonction dispoadate
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 declare @depot char(10),@date date set @depot = '0000000001' set @date = '20120101' select *, dbo.dispoadate(s_id,@depot,@date) from stock
Tous les champs contenu dans les where, ou au niveau des jointures sont indexés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 CREATE FUNCTION [dbo].[DISPOADATE] ( @id_article char(10), @id_depot char(10), @date date ) RETURNS float AS BEGIN declare @ret float declare @dispo float declare @tot_v float declare @tot_a float declare @tot_d float select @tot_v=sum(q) from lignes_v (NOLOCK) inner join pieds_v (NOLOCK) on ((pieds_v.id=lignes_v.id) and (pieds_v.journal=lignes_v.journal) and (pieds_v.piece=lignes_v.piece)) where id_article > '' and (id_article=@id_article) and (type<=2) and (pieds_v.date>@date) and (pieds_v.id_depot=@id_depot) group by id_article select @tot_a=sum(q) from lignes_a (NOLOCK) inner join pieds_a (NOLOCK) on ((pieds_a.id=lignes_a.id) and (pieds_a.journal=lignes_a.journal) and (pieds_a.piece=lignes_a.piece)) where id_article > '' and (id_article=@id_article) and (type<=2) and (pieds_a.date>@date) and (pieds_a.id_depot=@id_depot) group by id_article select @tot_d=sum(q) from lignes_d (NOLOCK) where id_art > '' and (id_art=@id_article) and (date>@date) and (id_depot=@id_depot) group by ID_ART select @ret = isnull(@dispo,0)+isnull(@tot_v,0)-isnull(@tot_a,0)-isnull(@tot_d,0) return isnull(@ret,0) END
Sur une petit nombre de donnée cela fonctionne parfaitement, mais dès que j'arrive sur une base de donnée plus significative, le temps de réponse est beaucoup trop important.
Exemple => une base de donnée comportant +-160000 record dans la table stock, et +-7 millions de lignes dans lignes_v, après une heure de traitement, il ne me retournait que 30000 lignes.
J'ai essayer de partir sur des vues au niveau de mes tables lignes_v,lignes_a et lignes_d, mais je ne vois pas trop comment faire pour rendre la vue "dynamique" vus que la date est un paramètre.
Avez-vous des idées pour rendre se traitement possible?
Merci d'avance
Partager