I'm fully in Sync with @Dmitry Maslennikov 
Uniqueness is the TOP priority. 
Though you can switch it off for rare cases by the class parameter 
 MANAGEDEXTENT.

Concerning access speed, naming is not really relevant.
Top level of global storage is a sorted hierarchical directory structure that points to the globals.
So, on average, any global has - with actual storage speed -  the same access time.
And global directory is mostly permanently cached in Global buffers.

BTW: You can list this directory using ^$GLOBAL()

set dir="^$GLOBAL("""")"
for  write dir,! set dir=$QUERY(@dir) quit:dir=""

Just as you, I start my CSP also from good old Studio

the EXIT button is inside <bod>y<form> ....<button>..   </form></body>
in upload
 

<!-- Copyright (c) 2001 InterSystems Inc. ALL RIGHTS RESERVED. -->
<csp:class description="Demo of how to upload a file from the browser.">
<html>

<head>
</head>

<body bgcolor="#CCCCFF">

<!-- display standard sample template using a custom tag -->
<isc:SAMPLE title="Upload a file Sample">
This sample uses an '&lt;input type=file&gt;' element in a form to upload a file
from the web browser to CSP. Pick a file and hit the submit button to try it.
</isc:SAMPLE>

<!-- HTML Form to submit the file. You must specify the enctype="multipart/form-data" -->
<!-- for this to work -->
<form enctype="multipart/form-data" method="post" action="upload.csp">
	Enter a file to upload here: <input type=file size=30 name=FileStream>
	<p>
	<ul><input type="submit" value="Upload file"></ul>
	<p>
	<button onclick="window.close()" style="width: 100px; height: 40px; font-size: 18px;"> Exit </button>
</form>

<!-- As form is submitted to this page look to see if we have the stream in the %request object -->
<csp:if condition='($data(%request.MimeData("FileStream",1)))'>
	<hr><br>
	Submitted filename: <b>#(..EscapeHTML(%request.MimeData("FileStream",1).FileName))#</b><br>
	Size of file: <b>#(..EscapeHTML(%request.MimeData("FileStream",1).Size))#</b><br>
	Mime Section: <b>#(..EscapeHTML(%request.MimeData("FileStream",1).MimeSection))#</b><br>
	Type of stream: <b>#(..EscapeHTML($classname(%request.MimeData("FileStream",1))))#</b><br>
	Content Type: <b>#(..EscapeHTML(%request.MimeData("FileStream",1).ContentType))#</b><br>
	<br>
	First 200 characters of stream:<br>
	<ul>
	<script language="Cache" runat="server">
		New bytes
		Set bytes=%request.MimeData("FileStream",1).Read(200)
		Set bytes=##class(%CSP.Utils).DecodeData(bytes)
		Write bytes,!
	</script>
	</ul>
</csp:if>

</body>
</html>

while your calling JS script is best located in <head>......</head>

<html>
<head>
<title>Demo for David</title>
<script language="JavaScript" type="text/javascript">
function importExtract()
{
	var url='upload.csp' ;
	var options = 'popup,status=yes,scrollbars=yes,resizable=yes,width=750,height=250' ;
	newwindow=window.open(url,'UPLOAD',options);
    newwindow.focus();
	alert('back');
	}
</script>
</head>
<body>
<h3>Demo for David</h3>
<Input type="button" value="Import Client Consultation Extract"
         onclick="importExtract();"/>
</body>
</html>

Well, you have to do it yourself.
Suggestion: Keep a list of the indices processed and skip all followers
For the list you need a small Stored Procedure that you add to
your SQL SELECT in the WHERE clause.

CREATE PROCEDURE SQLUSER.DUPL(value VARCHAR, id INTEGER)
RETURNS INTEGER
LANGUAGE OBJECTSCRIPT
{
 set used=$d(^||dupl(value))
 set ^||dupl(value,id)=$i(^||dupl(value))  
 quit used
}

And in the SELECT

SELECT id, sickindex, . . . . . 
FROM your.data 
WHERE DUPL(sickindex,id) < 1

As a side effect, you create a list of affected indices.
I used a PPG to avoid the need to clear it before use.
If you are interested in the duplicate, you need to change the global name
and add some cleanup before use  

 

Hi Jean,

Taking a look into ##class(%Library.PosixTime)  you see that you shouldn't be concerned on efficiency
It's pretty obvious that the implementation is missing a selectable precision.
so

  • set stripped = $P(str,".",1)

Is similar effective as 

  • set stripped = $E(str,1,19) 

It's not perfect but will be correct and lasting for almost the next 8000 years 😉

In SMP (System Management Portal), you step to EXLORER and then step into SQL
where you select your TABLE. and can rebuild index


Furthermore, every persistent class  has by default
• classmethod %BuildDeferredIndices
• classmethod %BuildIndices
• classmethod %BuildIndicesAsync

Next variant : use $SYSTEM.OBJ.ValidateIndices()
Details described here  Fix broken index 8 years ago, still valid
 

Due to limited practice in ZEN I transferred your example to straight CSP and JS

<html>
<head>
<title>Demo for David</title>
<script language="JavaScript" type="text/javascript">
function importExtract()
{
	var url='upload.csp' ;
	var options = 'popup,status=yes,scrollbars=yes,resizable=yes,width=750,height=250' ;
	newwindow=window.open(url,'UPLOAD',options);
    newwindow.focus();
	alert('back');
	}
</script>
</head>
<body>
<h3>Demo for David</h3>
<Input type="button" value="Import Client Consultation Extract"
         onclick="importExtract();"/>
</body>
</html>

in upload.csp I just added this BUTTON to the end ot the main form

	<button onclick="window.close()" style="width: 100px; height: 40px; font-size: 18px;"> Exit </button>
</form>

1.  Use $$DIR^TRACE(dir)  you haven't set a suitable directory
2.  Use $$ON^TRACE(5352)  ; the job you want to trace ==> open file
3:  USE $$OFF ^TRACE(5352) to stop trace ==> close file
4.Now ^TRACE should show the file

I traced my own studio session:

START:1810291850,0,%SYS.BINDSRV,2,1
STACK: [ 0] D - SuperServer+112^%SYS.SERVER +1
STACK: [ 1] D - SuperConnect+34^%SYS.DBSRV +1
STACK: [ 2] D - Dispatch+14^%SYS.BINDSRV +1
DO:1812736542,0,%SYS.BINDSRV,39
ARG:[ 0] INT: 0
ARG:[ 1] INT: 1
ARG:[ 2] INT: 1
DO:1812736624,0,%SYS.BINDSRV,625
ARG:[ 0] INT: 0
ARG:[ 1] INT: 0
DO:1812736631,0,%SYS.BINDSRV,258
ARG:[ 0] INT: 0
ARG:[ 1] INT: 0
QUIT:1812736638,291
DO:1812736642,0,%SYS.BINDSRV,627

Not sure for Caché 2017 
BUT
Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2018.1.5 (Build 659U) Mon Mar 22 2021 07:12:43 EDT
Has ^TRACE in %SYS
with enough $v(..) and $ZU(..) to look promising 

 W $ZU(5)
%SYS
%SYS>D ^TRACE
 
TRACE utility for Cache. You can signal a process to write a record of all
procedure, function, or subroutine calls to a file. Then use this utility to 
interpret and display the trace. The trace file is named: CacheTrace_'pid'.txt 

Use $$DIR^TRACE(dir) to set the directory where the file(s) should be written
(process must have create/write access to the directory). $$DIR^TRACE() returns
the current directory for trace files. 

Use $$ON^TRACE(pid) to start the trace and $$OFF^TRACE(pid) to end the 
recording. Then just run ^TRACE to see the results. 

Process ID for trace file: 

So  %SYS>d ^TRACE might be a useful start

This utility traces the execution of a process.  Traced processes write events
to a trace file with details about the routine line where the event occurred
and, if applicable, the global reference.  The events available for tracing
correspond to the metrics availabe in performance monitoring tools (PERFMON,
%SYS.MONLBL etc).  Raw data is written to iristrace_<pid>.txt in the
configured directory, and is then parsed and displayed by this utility.
 
 
Trace file directory:   not set
Trace file size limit: unlimited
Trace events selected:  RtnLoad, GloRef, BlockWait, NCacheMiss, DirBlkRd
   UpntBlkRd, BpntBlkRd, DataBlkRd, BdataBlkRd, MapBlkRd, OthBlkRd
 
1) Configure Trace
2) Trace Process (Foreground)
3) Start Background Trace
4) Stop Background Trace
5) Display Trace Files
6) Delete All Trace Files
 
Option?

It might be great to remove the related refences also
from official documentation
Py
https://docs.intersystems.com/components/csp/docbook/Python-Native/v1.0.0/irisnative.iris.html#irisnative.iris.function

Nodes.js
https://docs.intersystems.com/components/csp/docbook/NodeJS-Native/v2019.2/external-_intersystems-iris-native_.Iris.html

Java
https://docs.intersystems.com/iris20201/csp/docbook/DocBook.UI.Page.cls?KEY=BJAVNAT_call#BJAVNAT_call_function

.NET
https://docs.intersystems.com/iris20201/csp/docbook/DocBook.UI.Page.cls?KEY=BNETNAT_call#BNETNAT_call_function

Also Class reference for 2025.1
https://docs.intersystems.com/iris20251/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&CLASSNAME=%25Net.DB.Iris#Function

like this:
Calls a function (label^routine), passing zero or more arguments and returning the function's return value. Trailing arguments may be omitted, causing default values to be used for those arguments.

This method throws an exception when an error condition is encountered.

routineName

input

The name of the routine that implements the function to be called.

functionName

input

The name of the function to be invoked.

args

input...

The arguments to be passed to the method.

 

return

The value returned by the functionName function.


  • Such a misleading documentation roughly 1.5 years behind reality is not so impressive
  • It took days to find this out.  😖