I have this command
using (FbCommand cmd = new FbCommand(@"SELECT MIN(STAVKA.TREN_STANJE) FROM STAVKA RIGHT OUTER JOIN DOKUMENT ON STAVKA.VRDOK = DOKUMENT.VRDOK AND STAVKA.BRDOK = DOKUMENT.BRDOK WHERE(STAVKA.MAGACINID = @MID) AND(STAVKA.ROBAID = @RID) AND(DOKUMENT.FLAG < 2)", con))
{
cmd.Parameters.AddWithValue("@MID", magacinId);
cmd.Parameters.Add("@RID", FbDbType.Integer);
foreach(Int_Double stavka in stavkePocetnogStanjaSaKolicinama)
{
cmd.Parameters["@RID"].Value = stavka._int;
using (FbDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
double v = (dr[0] is DBNull) ? 0 : Convert.ToDouble(dr[0]);
double t = stavka._double;
if (smanjuj && !povecavaj)
{
if (v >= 0)
stavka._double -= v;
}
else if (smanjuj && povecavaj)
stavka._double -= v;
else if (!smanjuj && povecavaj)
{
if (v < 0)
stavka._double -= v;
}
else
{
MessageBox.Show("Doslo je do greske! - SvediPocetnoStanjeNaMinimum");
return;
}
}
}
}
}
Where the SQL statement is:
SELECT MIN(STAVKA.TREN_STANJE)
FROM STAVKA
RIGHT OUTER JOIN DOKUMENT
ON STAVKA.VRDOK = DOKUMENT.VRDOK AND STAVKA.BRDOK = DOKUMENT.BRDOK
WHERE (STAVKA.MAGACINID = @MID)
AND (STAVKA.ROBAID = @RID)
AND (DOKUMENT.FLAG < 2)
Problem is that using (FbDataReader dr = cmd.ExecuteReader())
takes about 3-4 seconds to run which would be okay if there are few times to run it but there is around 4k times needed to run so that is 16k seconds (4hrs)
How does these two table works is:
I have one document (DOKUMENT
) which is one row and it has multiple items (STAVKA
) which are connected to DOKUMENT
(have document type (VRDOK
) and document number (BRDOK
)).
Now for each item (STAVKA.ROBAID
) i select (STAVKA.TREN_STANJE
) but DOCUMENT.FLAG
which contains that STAVKA
must have flag < 2
Example:
STAVKA TABLE
STAVKAID | VRDOK | BRDOK | TREN_STANJE | ROBAID |
1 | 1 | 10 | 6 | 3 |
2 | 1 | 14 | 12 | 3 |
3 | 1 | 18 | 3 | 3 |
4 | 1 | 21 | 8 | 3 |
5 | 1 | 23 | 7 | 3 |
DOKUMENT TABLE
VRDOK | BRDOK | FLAG
1 | 10 | 1
1 | 14 | 3
1 | 18 | 1
1 | 21 | 1
1 | 23 | 4
So when i run SQL statement it need to select MIN(TREN_STANJE)
from STAVKA
WHERE ROBAID = @RID (3 in this case)
BUT FLAG
of that document (as you can see same columns in DOKUMENT
and STAVKA
) must be < 2
How could i speed this up?
Structure of STAVKA
table is:
CREATE TABLE "STAVKA"
(
"STAVKAID" INTEGER NOT NULL,
"VRDOK" SMALLINT NOT NULL,
"BRDOK" INTEGER NOT NULL,
"MAGACINID" SMALLINT NOT NULL,
"ROBAID" INTEGER NOT NULL,
"VRSTA" SMALLINT,
"NAZIV" VARCHAR(50),
"NABCENSAPOR" NUMERIC(15,4),
"FAKTURNACENA" NUMERIC(15,4),
"NABCENABT" DOUBLE PRECISION,
"TROSKOVI" NUMERIC(15,4),
"NABAVNACENA" NUMERIC(15,4) NOT NULL,
"PRODCENABP" NUMERIC(15,4) NOT NULL,
"KOREKCIJA" DOUBLE PRECISION,
"PRODAJNACENA" NUMERIC(15,2) NOT NULL,
"DEVIZNACENA" NUMERIC(15,4) NOT NULL,
"DEVPRODCENA" NUMERIC(15,4),
"KOLICINA" NUMERIC(15,3) NOT NULL,
"NIVKOL" NUMERIC(15,3) NOT NULL,
"TARIFAID" VARCHAR(3),
"IMAPOREZ" SMALLINT,
"POREZ" NUMERIC(15,2) NOT NULL,
"RABAT" NUMERIC(15,2) NOT NULL,
"MARZA" NUMERIC(15,2) NOT NULL,
"TAKSA" NUMERIC(15,4),
"AKCIZA" NUMERIC(15,2),
"PROSNAB" NUMERIC(15,4) NOT NULL,
"PRECENA" NUMERIC(15,4) NOT NULL,
"PRENAB" NUMERIC(15,4) NOT NULL,
"PROSPROD" NUMERIC(15,4) NOT NULL,
"MTID" VARCHAR(10),
"PT" CHAR(1) NOT NULL,
"ZVEZDICA" VARCHAR(6),
"TREN_STANJE" NUMERIC(15,3),
"POREZ_ULAZ" NUMERIC(15,2) NOT NULL,
"SDATUM" DATE,
"DEVNABCENA" NUMERIC(15,4),
"POREZ_IZ" NUMERIC(15,2) NOT NULL,
"X4" NUMERIC(15,3),
"Y4" NUMERIC(15,3),
"Z4" NUMERIC(15,3),
"CENAPOAJM" NUMERIC(15,2),
"KGID" INTEGER,
CONSTRAINT "STAVKAPRIMARYKEY" PRIMARY KEY ("STAVKAID")
);
Structure of DOKUMENT
is:
CREATE TABLE "DOKUMENT"
(
"VRDOK" SMALLINT NOT NULL,
"BRDOK" INTEGER NOT NULL,
"INTBROJ" VARCHAR(15),
"KODDOK" SMALLINT NOT NULL,
"FLAG" SMALLINT,
"DATUM" DATE NOT NULL,
"LINKED" VARCHAR(10),
"MAGACINID" SMALLINT NOT NULL,
"PPID" INTEGER,
"FAKTDOBIZV" VARCHAR(15),
"PLACEN" SMALLINT NOT NULL,
"DATROKA" DATE,
"NUID" SMALLINT,
"NRID" SMALLINT,
"VALUTA" VARCHAR(3) NOT NULL,
"KURS" NUMERIC(15,4) NOT NULL,
"ZAPID" SMALLINT NOT NULL,
"UPLACENO" NUMERIC(15,2) NOT NULL,
"TROSKOVI" NUMERIC(15,2) NOT NULL,
"DUGUJE" NUMERIC(15,2) NOT NULL,
"POTRAZUJE" NUMERIC(15,2) NOT NULL,
"POPUST" NUMERIC(15,2) NOT NULL,
"RAZLIKA" NUMERIC(15,2),
"DODPOREZ" NUMERIC(15,2),
"POREZ" NUMERIC(15,2),
"PRODVREDBP" NUMERIC(15,2) NOT NULL,
"KUPAC" VARCHAR(50),
"OPISUPL" VARCHAR(30),
"VRDOKIN" SMALLINT,
"BRDOKIN" INTEGER,
"VRDOKOUT" SMALLINT,
"BRDOKOUT" INTEGER,
"MAGID" SMALLINT,
"POPUST1DANA" INTEGER,
"POPUST1PROCENAT" NUMERIC(15,2),
"POPUST2DANA" INTEGER,
"POPUST2PROCENAT" NUMERIC(15,2),
"POPUST3DANA" INTEGER,
"POZNABROJ" CHAR(2),
"POPUST3PROCENAT" NUMERIC(15,2),
"KONTRBROJ" CHAR(2),
"MTID" VARCHAR(10),
"REFID" SMALLINT,
"STATUS" SMALLINT,
"PPO" SMALLINT,
"PRENETI_POREZ" NUMERIC(15,2),
"AKVRDOK" SMALLINT,
"AKBRDOK" INTEGER,
"ALIASIZ" SMALLINT,
"ALIASU" SMALLINT,
"PREVOZROBE" SMALLINT,
"DATUM_PDV" DATE,
"NDID" SMALLINT,
"NABVREDNOST" NUMERIC(15,2),
"SAT_START" VARCHAR(8),
"SAT_END" VARCHAR(8),
"KNJIZNAOZ" NUMERIC(15,2),
"POVRATNICE" NUMERIC(15,2),
"SINHRO" SMALLINT,
"STORNO" NUMERIC(15,2),
"SMENAID" SMALLINT NOT NULL,
"POR_ODB" NUMERIC(15,2),
CONSTRAINT "DOKUMENTPRIMARYKEY" PRIMARY KEY ("VRDOK", "BRDOK")
);