[Info-vax] CRTL and RMS vs SSIO

Arne Vajhøj arne at vajhoej.dk
Wed Oct 13 20:31:57 EDT 2021


On 10/13/2021 4:53 PM, Dave Froble wrote:
> On 10/13/2021 1:59 PM, Arne Vajhøj wrote:
>> On 10/13/2021 11:09 AM, Dave Froble wrote:
>>> On 10/13/2021 10:04 AM, Arne Vajhøj wrote:
>>>> On 10/12/2021 9:52 PM, Dave Froble wrote:
>>>>> On 10/12/2021 5:10 PM, Arne Vajhøj wrote:
>>>>>> On 10/12/2021 4:42 PM, Dave Froble wrote:
>>>>>>> On 10/12/2021 3:55 PM, Arne Vajhøj wrote:
>>>>>>>> But the money math has changed.
>>>>>>>>
>>>>>>>> I would say that over the last 30 years:
>>>>>>>>
>>>>>>>> RDBMS license cost changed from expensive to free options available
>>>>>>>>
>>>>>>>> RDBMS hardware resource cost changed from expensive to 
>>>>>>>> insignificant
>>>>>>>>
>>>>>>>> writing and maintaining code to manage IDX file cost is more or 
>>>>>>>> less
>>>>>>>> constant
>>>>>>>
>>>>>>> Are you suggesting writing and maintaining code for RDBMS is any
>>>>>>> different?
>>>>>>
>>>>>> You need much less code because the database software does
>>>>>> so much.
>>>>>>
>>>>>> It is a tradeoff - you write much less code but the generic code
>>>>>> in the RDBMS use more CPU and memory.
>>>>>
>>>>> Excuse me, I'm just a dummy, come down out of the hills.  But:
>>>>>
>>>>> 1) Open file
>>>>> 2) Access data
>>>>> 3) Do some work
>>>>> 4) Write/Update data
>>>>> 5) Done
>>>>>
>>>>> and
>>>>>
>>>>> 1) Access database
>>>>> 2) Access data
>>>>> 3) Do some work
>>>>> 4) Write/Update data
>>>>> 5) Done
>>>>>
>>>>> Guess I don't see much difference.
>>>>
>>>> That is because you describe *what* is being done not *how* it is done.
>>>>
>>>> In general you can expect:
>>>>
>>>> data maintenance - replacing a lot of application code with few 
>>>> lines of
>>>> SQL
>>>
>>> You claim that, but I just don't see it.
>>>
>>>> applications with simple queries - slightly less code
>>>>
>>>> application code with complex queries - a lot less code
>>>>
>>>> adhoc just get some numbers - replacing a lot of application code with
>>>> few lines of SQL
>>>
>>> Don't see that.
>>>
>>> Also, I've noticed that doing some things with SQL can be much more
>>> complex.
>>
>> Here is an example of some (Python) code using SQL to
>> join, select, aggregate, sort and limit some data.
>>
>> import sqlite3
>>
>> con = sqlite3.connect('test.db')
>> c = con.cursor()
>> c.execute('''SELECT customers.name,SUM(orderlines.price) AS totalsales
>>              FROM customers
>>              LEFT JOIN orders ON customers.customer_id = 
>> orders.customer_id
>>              LEFT JOIN orderlines ON orders.order_id = 
>> orderlines.order_id
>>              WHERE orders.status = 'Delivered'
>>              GROUP BY customers.name
>>              HAVING totalsales > 10
>>              ORDER BY totalsales DESC
>>              LIMIT 3''')
>> for row in c.fetchall():
>>     print('%s : %d' % (row[0], row[1]))
>> con.commit()
>> con.close()
>>
>> I believe that it would take a lot more code to
>> retrieve data from index-sequential files and
>> do the work on the data.
> 
> Not a lot, however the sorting by customer name would entail some 
> additional code.
> 
> However, reading the order file, doing the selection, look-up customer 
> record, and release to record sort, then read back sorted records is not 
> "a lot more" code.

I tried writing it in Pascal using index-sequential files.

program cmplx(input,output);

const
    MAX_ORDERLINES_PER_ORDER = 100;

type
    orderline = record
                   item : packed array [1..50] of char;
                   price : integer;
                end;
    customer = record
                  customer_id : [key(0)] integer;
                  name : packed array [1..50] of char;
                  address : packed array [1..100] of char;
               end;
    order = record
               order_id : [key(0)] integer;
               customer_id : [key(1)] integer;
               ref : packed array [1..50] of char;
               status : packed array [1..25] of char;
               no_orderlines : integer;
               orderlines : array [1..MAX_ORDERLINES_PER_ORDER] of 
orderline;
            end;

const
    MAX_CUSTOMERS = 10000;

type
    extcustomer = record
                     basis : customer;
                     total_sales : integer;
                  end;
    extcustomerlist = array [1..MAX_CUSTOMERS] of extcustomer;

var
    no_xc : integer;
    xc_list : extcustomerlist;

procedure load_data;

var
    fc : file of customer;
    fo : file of order;
    c : customer;
    o : order;
    i : integer;

begin
    open(fc, 'customer.isq', old, organization := indexed, access_method 
:= keyed);
    open(fo, 'order.isq', old, organization := indexed, access_method := 
keyed);
    resetk(fc, 0);
    no_xc := 0;
    while not eof(fc) do begin
       c := fc^;
       no_xc := no_xc + 1;
       xc_list[no_xc].basis := c;
       xc_list[no_xc].total_sales := 0;
       resetk(fo, 1);
       findk(fo, 1, c.customer_id);
       while not(ufb(fo)) and not(eof(fo)) and (fo^.customer_id = 
c.customer_id) do begin
          o := fo^;
          if o.status = 'Delivered' then begin
             for i := 1 to o.no_orderlines do begin
                xc_list[no_xc].total_sales := xc_list[no_xc].total_sales 
+ o.orderlines[i].price;
             end;
          end;
          get(fo);                  ;
       end;
       get(fc);
    end;
    close(fo);
    close(fc);
end;

procedure sort_data;

var
    i, j : integer;
    tmp : extcustomer;

begin
    for i := 1 to no_xc do begin
       for j := (i + 1) to no_xc do begin
          if xc_list[i].total_sales < xc_list[j].total_sales then begin
             tmp := xc_list[i];
             xc_list[i] := xc_list[j];
             xc_list[j] := tmp;
          end;
       end;
    end;
end;

procedure dump_data;

var
    i : integer;

begin
    for i := 1 to min(no_xc, 3) do begin
       if xc_list[i].total_sales > 10 then begin
          writeln(xc_list[i].basis.name,' ',xc_list[i].total_sales);
       end;
    end;
end;

begin
    load_data;
    sort_data;
    dump_data;
end.

Arne





More information about the Info-vax mailing list