<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-497787815177352569</atom:id><lastBuildDate>Fri, 10 Apr 2026 05:37:05 +0000</lastBuildDate><category>announcement</category><category>SQL code</category><category>latest EBFs</category><category>The fRiDaY File</category><category>Dilbert</category><category>server setup and admin</category><category>performance and tuning</category><category>testimonial</category><category>Foxhound</category><category>off topic</category><category>The Thursday Quote</category><category>housekeeping</category><category>SQLA</category><category>Database Deadpool</category><category>HANA</category><category>Design</category><category>Did You Know</category><category>SQL search</category><category>database migration</category><category>Dilberts</category><category>patches</category><category>performance</category><category>xkcd</category><title>SQL Anywhere</title><description>SQL Anywhere&lt;sup&gt;®&lt;/sup&gt; Does Things The Way They Should Be Done.</description><link>http://sqlanywhere.blogspot.com/</link><managingEditor>noreply@blogger.com (Breck Carter)</managingEditor><generator>Blogger</generator><openSearch:totalResults>885</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-5092257942588632555</guid><pubDate>Wed, 16 Jun 2021 19:22:00 +0000</pubDate><atom:updated>2021-06-19T10:10:41.137-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">server setup and admin</category><title>OEM Authentication</title><description>&lt;p style=&quot;clear: both;&quot;&gt;
&lt;h3&gt;Catch 22&lt;/h3&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
OEM authentication is explained in the SQL Anywhere Help, but that explanation can only be understood by someone who already understands OEM authentication.

&lt;h3&gt;John Yossarian&#39;s Explanation&lt;/h3&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
This blog post came in the form of an email from a client who offered to help me set Foxhound up to work for clients who use the OEM Edition of SQL Anywhere.

&lt;p style=&quot;clear: both;&quot;&gt;
This explanation from John Yossarian (not his real name) was so clear, concise and helpful that I asked for (and received) permission to publish it here.

&lt;p style=&quot;clear: both;&quot;&gt;
Breck

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;
from:    John Yossarian &amp;lt;jy@stark.co.uk&amp;gt;
to:      Breck Carter &amp;lt;breck.carter@gmail.com&amp;gt;
date:    Jun 12, 2021, 4:28 PM
subject: Authenticated OEM SQL Anywhere Connections

The three parts of the authentication business are 
  a) licencing the server engine 
  b) authenticating the database and 
  c) authenticating the connection.
 
When you go into the authentication business SAP give you three keys - the keys are all different but match 
each other and the publishing company &amp; application names (ie they won&#39;t work with other keys):

- an install key: you use this with dblic.exe -k to create OEM lic files (just like a normal install key) - but 
  we can then redistribute those engines. (this bit isn&#39;t your problem of course)

- a database key: this is used once on a database to make it an Authenticated database which will work on 
  the server created with the install key - the setting is persistent. This is done with a SET OPTION command; e.g.

  SET OPTION PUBLIC.DATABASE_AUTHENTICATION=&#39;Company=Stark;Application=Winterfell;Signature=XXXXXXXXXX-XXXXXXXXXX&#39;; 

  This step needs SET ANY SECURITY OPTION rights.

- a connection key: This is used by connections to the database. Each connection has a 30 second (or so) grace 
  period to set a temporary Connection_authentication option; e.g.

  SET TEMPORARY OPTION CONNECTION_AUTHENTICATION=&#39;Company=Stark;Application=Winterfell;Signature=YYYYYYYYYY-YYYYYYYYYY&#39;

- a non-authenticated connection to an authenticated database running on an OEM engine is allowed to connect 
  but after thirty seconds is strictly read-only.
 
So, if you wanted to support authenticated servers fully, you would need users to supply both the database key 
and the connection key, in the set-up process &amp; then use them as above.  
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

</description><link>http://sqlanywhere.blogspot.com/2021/06/oem-authentication.html</link><author>noreply@blogger.com (Breck Carter)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1489792500079146496</guid><pubDate>Mon, 08 Feb 2021 18:39:00 +0000</pubDate><atom:updated>2021-02-08T15:20:13.622-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL code</category><title>Embedding Highcharts In SQL Anywhere</title><description>&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;padding-left: 1em; &quot;&gt;
&lt;a href=&quot;#intro&quot;&gt;Introduction&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;#hello&quot;&gt;Hello, Chart! Is Embedded In SQL Anywhere&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;#how&quot;&gt;How Hello, Chart! Works&lt;/a&gt;
&lt;br&gt;
&lt;a href=&quot;#also&quot;&gt;See Also...&lt;/a&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;hr&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;h3 id=&quot;intro&quot;&gt;Introduction&lt;/h3&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;a href=&quot;https://www.highcharts.com/&quot;&gt;Highcharts&lt;/a&gt; is a bare-metal browser-based JavaScript API for adding interactive charts to HTML pages. 

&lt;p style=&quot;clear: both;&quot;&gt;
Highcharts is powerful, well documented and (relatively) easy to use, plus it&#39;s been around a long time (2009), it&#39;s popular and it&#39;s commercially successful.

&lt;p style=&quot;clear: both;&quot;&gt;
Here&#39;s the Highcharts version of Hello, World!:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
&lt;div style=&quot;padding: 0.5em; border-style: solid; border-width: 1px;&quot;&gt;

&lt;!-- Start Demo, Chart! code in blog post... --&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://code.highcharts.com/highcharts.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://code.highcharts.com/modules/data.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
const chartXHR = new XMLHttpRequest();
chartXHR.onload = function() { // asynchronous callback event handler for chartXHR.send()
   if ( chartXHR.status === 200 ) { // HTTP status OK
      Highcharts.chart ( &quot;chartDiv&quot;, { // tell Highcharts where to put the chart
         chart: {
            type: &quot;line&quot;
         },
         data: {
            csv: chartXHR.responseText // tell Highcharts where to get the data
         },
         title: {
            text: &quot;Chart&quot;
         },
         xAxis: {
            title: {
               text: &quot;Chart Timestamp&quot;
            }
         },
         yAxis: {
            title: {
               text: &quot;Chart Percent&quot;
            }
         },
      } );
   } else {
      document.getElementById ( &quot;chartDiv&quot; ).innerHTML = &quot;HTTP Status &quot; + chartXHR.status 
         + &#39;&lt;p&gt;Try the &lt;a href=&quot;https://www.bcarter.com/blog/Highcharts/static.html&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;&lt;u&gt;Static, Chart! demo&lt;/u&gt;&lt;/b&gt;&lt;/a&gt; instead.&#39;;
      console.log ( &quot;ERROR: chartXHR.status = &quot;, chartXHR.status );
   }
};

function showDataSet ( dataSet ) { 
   // See https://github.com/Rob--W/cors-anywhere/#documentation
   const requestUrl 
      = &quot;https://cors-anywhere.herokuapp.com/&quot; // proxy server to suppress CORS error
      + &quot;https://www.bcarter.com/blog/Highcharts/demochart&quot; + dataSet + &quot;.csv&quot;; // static file
   chartXHR.open ( &quot;GET&quot;, requestUrl, true ); 
   chartXHR.send(); // this will eventually trigger chartXHR.onload
};
&lt;/script&gt;

&lt;b&gt;Demo, Chart!&lt;/b&gt;
&lt;p&gt;
&lt;button onClick=&quot;showDataSet ( 1 );&quot;&gt;Show Data Set 1&lt;/button&gt;
&lt;button onClick=&quot;showDataSet ( 2 );&quot;&gt;Show Data Set 2&lt;/button&gt;
&lt;div id=&quot;chartDiv&quot; style=&quot;margin-top: 0.5em; padding: 0.5em; border-style: solid; border-width: 1px;&quot;&gt;
[ &lt;b&gt;Click the buttons&lt;/b&gt; to see data, then &lt;b&gt;move the mouse&lt;/b&gt; to see tooltips ]
&lt;p style=&quot;padding-left: 2em;&quot;&gt;
&lt;i&gt;( if the buttons don&#39;t work, 
&lt;a href=&quot;https://www.bcarter.com/blog/Highcharts/static.html&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;&lt;u&gt;try the Static, Chart! demo instead&lt;/u&gt;&lt;/b&gt;&lt;/a&gt; )&lt;/i&gt;
&lt;/div&gt; 
&lt;!-- ...end Demo, Chart! code in blog post --&gt;
&lt;/div&gt; 
&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
Demo, Chart! is one of three demonstrations, all of which look the same but work differently:

&lt;STYLE&gt;
TABLE { margin: 0; padding: 0; }
TD { margin: 0; padding: 0.5em 1em 0.5em 1em; vertical-align: top; }
TR { margin: 0; padding: 0; }
&lt;/STYLE&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
&lt;div style=&quot;padding: 0.5em; border-style: solid; border-width: 1px;&quot;&gt;
&lt;TABLE&gt;
&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right;&quot;&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD&gt;&lt;b&gt;Demo, Chart!&lt;/b&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;b&gt;Static, Chart!&lt;/b&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;b&gt;Hello, Chart!&lt;/b&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;Where does it run?&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;In this blog post&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;In a website (no CORS)&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;In a SQL Anywhere 17 database&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;HTML location:&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;blogspot.com&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;bcarter.com&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;SQL Anywhere 17 database&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;Highcharts JavaScript:&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;code.highcharts.com&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;code.highcharts.com&lt;/TD&gt;
&lt;TD STYLE=&quot;white-space: nowrap;&quot;&gt;SQL Anywhere 17 database&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;Data location:&lt;/TD&gt;
&lt;TD&gt;CSV files in static website bcarter.com&lt;/TD&gt;
&lt;TD&gt;CSV files in static website bcarter.com&lt;/TD&gt;
&lt;TD&gt;SQL Anywhere 17 database&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;Data retrieval:&lt;/TD&gt;
&lt;TD&gt;Static file via XMLHttpRequest()&lt;/TD&gt;
&lt;TD&gt;Static file via XMLHttpRequest()&lt;/TD&gt;
&lt;TD&gt;Web service via XMLHttpRequest()&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;text-align: right; white-space: nowrap;&quot;&gt;CORS headers:&lt;/TD&gt;
&lt;TD&gt;github.com/Rob--W/cors-anywhere&lt;/TD&gt;
&lt;TD&gt;Not required&lt;/TD&gt;
&lt;TD&gt;Not required&lt;/TD&gt;
&lt;/TR&gt;

&lt;/TABLE&gt;
&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
The code for Demo, Chart! is under your fingertips: View page source, then Find &lt;code&gt;&amp;lt;!-- Start Demo, Chart! code in blog post... --&gt;&lt;/code&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
The code for Static, Chart! is here:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;&lt;pre&gt;
https://www.bcarter.com/blog/Highcharts/static.html
https://www.bcarter.com/blog/Highcharts/demochart1.csv
https://www.bcarter.com/blog/Highcharts/demochart2.csv
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
The third demo is shown below.

&lt;!-- ------------------------------------------------------------------------------------- --&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;hr&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;h3 id=&quot;hello&quot;&gt;Hello, Chart! Is Embedded In SQL Anywhere&lt;/h3&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
There are advantages to storing code together with the data in a relational database. For example, application deployment, backup, recovery, portability, security all involve a single *.db file, and the Rules For Relational Databases guarantee consistency among various components.

&lt;p style=&quot;clear: both;&quot;&gt;
If you have SQL Anywhere 17 installed, embedding Hello, Chart! is a two-step &quot;Download And Go&quot; process:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 1:&lt;/b&gt; Download four files into a local folder. 

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
This command file uses &lt;a href=&quot;https://eternallybored.org/misc/wget/&quot;&gt;&lt;b&gt;the wget utility for Windows&lt;/b&gt;&lt;/a&gt; to download the files into C:\temp:
&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;
CD C:\temp
&quot;C:\download\wget\wget.exe&quot; &quot;https://code.highcharts.com/highcharts.js&quot;
&quot;C:\download\wget\wget.exe&quot; &quot;https://code.highcharts.com/modules/data.js&quot;
&quot;C:\download\wget\wget.exe&quot; &quot;https://www.bcarter.com/blog/highcharts/setup_hello.html&quot;
&quot;C:\download\wget\wget.exe&quot; &quot;https://www.bcarter.com/blog/highcharts/setup_hello.sql.txt&quot;
PAUSE
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 2:&lt;/b&gt; Load the code and launch it in a browser.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
The following command file 
&lt;ul&gt;
&lt;li&gt;creates a new SQL Anywhere 17 database &lt;b&gt;chart.db&lt;/b&gt; via dbinit.exe,&lt;/li&gt;
&lt;li&gt;starts the database via dbsrv17.exe&lt;/li&gt;
&lt;li&gt;with the builtin HTTP server running on port &lt;b&gt;54321&lt;/b&gt;,&lt;/li&gt;
&lt;li&gt;loads the code and data by running &lt;b&gt;setup_hello.sql.txt&lt;/b&gt; via dbisql.com &lt;/li&gt;
&lt;li&gt;and then uses the Windows START command to launch the &lt;b&gt;hello.html&lt;/b&gt; web service in a browser window:&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;
&quot;%SQLANY17%\bin64\dbinit.exe&quot;^
  -dba dba,sql^
  -mpl 3^
  &quot;C:\temp\chart.db&quot;

&quot;%SQLANY17%\bin64\dbspawn.exe&quot;^
  -f &quot;%SQLANY17%\bin64\dbsrv17.exe&quot;^
  -xs http(port=54321)^
  &quot;C:\temp\chart.db&quot;

&quot;%SQLANY16%\bin64\dbisql.com&quot;^
  -c &quot;ENG=chart; DBN=chart; UID=dba; PWD=sql;&quot;^
  READ ENCODING Cp1252 &quot;C:\temp\setup_hello.sql.txt&quot;

START http://localhost:54321/hello.html

PAUSE
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
Here&#39;s what it looks like in Edge:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimKLCBygv6ThszHcSXJj-hD-kVn8pDT_fMKYqRwIdt8DB0UDqU_MYFmz1_UELqwrphtqzUpajJKOnKRoYi69_-EONXxil29pf2Rx5Jmo0bcwBWa3VzROtj9d4jo6nFUDbrbKnKOrl2Tcs/s0/Hello%252C+Chart%2521+screen+capture.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: left; float: left;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;674&quot; data-original-width=&quot;824&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimKLCBygv6ThszHcSXJj-hD-kVn8pDT_fMKYqRwIdt8DB0UDqU_MYFmz1_UELqwrphtqzUpajJKOnKRoYi69_-EONXxil29pf2Rx5Jmo0bcwBWa3VzROtj9d4jo6nFUDbrbKnKOrl2Tcs/s0/Hello%252C+Chart%2521+screen+capture.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;hr&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;h3 id=&quot;how&quot;&gt;How Hello, Chart! Works&lt;/h3&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
Here&#39;s how the code works, starting at the point the web browser launches http://localhost:54321/hello.html.

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step1&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 1:&lt;/b&gt;
The browser passes the request for &quot;hello.html&quot; to the HTTP server embedded inside the SQL Anywhere 17 process dbsrv17.exe, which is listening for HTTP traffic on port 54321 because of the option -xs http(port=54321).

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
It could use port 80, but this is a demo, and demos are supposed to work, not generate conflicts with existing software :)
&lt;/blockquote&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step2&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 2:&lt;/b&gt;
SQL Anywhere passes the request to the web service named &quot;hello.html&quot; that is defined in this snippet.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 103; title: &#39;setup_hello.sql.txt - Create a service with the same name as the file.&#39;;&quot;&gt;
CREATE SERVICE &quot;hello.html&quot; TYPE &#39;RAW&#39; AUTHORIZATION OFF USER DBA
   AS CALL get_static_text_file ( &#39;hello.html&#39; );
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step3&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 3:&lt;/b&gt;
The web service passes the request on to the procedure shown in this snippet.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
The RESULT clause on line 61 specifies that the procedure will return a result set to the caller (the browser) consisting of a single LONG VARCHAR column.

&lt;p style=&quot;clear: both;&quot;&gt;
The CALL on line 75 sets the HTTP Content-Type header to &#39;text/html&#39; because the input file extension is &#39;html&#39;.

&lt;p style=&quot;clear: both;&quot;&gt;
The SELECT on line 91 gets the text file data from a table rather than an actual file; this is the SELECT that defines the RESULT set returned by this procedure.
&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 60; title: &#39;setup_hello.sql.txt - Create a procedure to return text to the browser.&#39;;&quot;&gt;
CREATE PROCEDURE get_static_text_file ( IN @file_name VARCHAR ( 255 ) )
   RESULT ( text_string LONG VARCHAR )
BEGIN

DECLARE @extension_pos INTEGER;
DECLARE @extension     VARCHAR ( 100 );

SET @extension_pos = LOCATE ( @file_name, &#39;.&#39;, -1 );

SET @extension 
   = IF @extension_pos = 0
        THEN &#39;&#39;
        ELSE SUBSTR ( @file_name, @extension_pos + 1 )
     ENDIF;

CALL dbo.sa_set_http_header ( 
   &#39;Content-Type&#39;, 
   CASE @extension
      WHEN &#39;css&#39;  THEN &#39;text/css&#39; 
      WHEN &#39;csv&#39;  THEN &#39;text/csv&#39; 
      WHEN &#39;htm&#39;  THEN &#39;text/html&#39;
      WHEN &#39;html&#39; THEN &#39;text/html&#39;
      WHEN &#39;js&#39;   THEN &#39;application/javascript&#39; 
      WHEN &#39;json&#39; THEN &#39;application/json&#39; 
      WHEN &#39;xml&#39;  THEN &#39;application/xml&#39; 
      ELSE             &#39;text/plain&#39;
   END CASE ); 

IF EXISTS ( SELECT *
              FROM static_text_file
             WHERE static_text_file.file_name = @file_name ) THEN
   SELECT static_text_file.file_text
     FROM static_text_file
    WHERE static_text_file.file_name = @file_name;
ELSE
   SELECT STRING ( &#39;[&#39;, @file_name, &#39; not found]&#39; );
END IF;

END;
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step4&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 4:&lt;/b&gt;
At this point in &quot;how the code works&quot;, the browser receives the text for hello.html and starts processing by loading two Highcharts Javascript text files from SQL Anywhere...

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 12; title: &#39;setup_hello.html - The SQL Anywhere web service calls to load the Highcharts code.&#39;;&quot;&gt;
&amp;lt;script src=&quot;get_static_text_file?f=highcharts.js&quot;&gt;&amp;lt;/script&gt;
&amp;lt;script src=&quot;get_static_text_file?f=data.js&quot;&gt;&amp;lt;/script&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p style=&quot;clear: both;&quot;&gt;
...using another web service that calls the same stored procedure shown earlier:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 57; title: &#39;setup_hello.sql.txt - Create a static file web service inside SQL Anywhere.&#39;;&quot;&gt;
CREATE SERVICE get_static_text_file TYPE &#39;RAW&#39; AUTHORIZATION OFF USER DBA
   AS CALL get_static_text_file ( :f );
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p style=&quot;clear: both;&quot;&gt;
Here&#39;s where all the &quot;static text file&quot; data came from: it was pre-loaded via xp_read_file() calls from actual files into the static_text_file table.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 36; title: &#39;setup_hello.sql.txt - Load the Highcharts JavaScript and Hello, Chart! HTML files into SQL Anywhere.&#39;;&quot;&gt;
CREATE TABLE static_text_file (
   file_name  VARCHAR ( 255 ) NOT NULL,
   file_text  LONG VARCHAR NOT NULL,
   PRIMARY KEY ( file_name ) );

INSERT static_text_file ON EXISTING UPDATE VALUES 
   ( &#39;highcharts.js&#39;, 
     dbo.xp_read_file ( &#39;C:\\temp\\highcharts.js&#39; ) );

INSERT static_text_file ON EXISTING UPDATE VALUES 
   ( &#39;data.js&#39;,       
     dbo.xp_read_file ( &#39;C:\\temp\\data.js&#39; ) );

INSERT static_text_file ON EXISTING UPDATE VALUES 
   ( &#39;hello.html&#39;,    
     dbo.xp_read_file ( &#39;C:\\temp\\setup_hello.html&#39; ) );
COMMIT;
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step5&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 5:&lt;/b&gt;
When the browser has finished loading hello.html, it displays this...

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCUuECeqtVPjbBa3ZV8GI1CaArYNjYwj0EPmKNWrjp3GpwzdiB_QgYGwb5_2tcg94XI5qA0frCF8OyeUFST7dJpACFslRqPexhGfPm7KXu1X0mBiPuE3-Cj7YUFUMSgyQfsKtBcwT-dUA/s0/Hello%252C+Chart%2521+initial+screen+capture.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: left; float: left;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; data-original-height=&quot;306&quot; data-original-width=&quot;687&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCUuECeqtVPjbBa3ZV8GI1CaArYNjYwj0EPmKNWrjp3GpwzdiB_QgYGwb5_2tcg94XI5qA0frCF8OyeUFST7dJpACFslRqPexhGfPm7KXu1X0mBiPuE3-Cj7YUFUMSgyQfsKtBcwT-dUA/s0/Hello%252C+Chart%2521+initial+screen+capture.jpg&quot; width=&quot;400&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p style=&quot;clear: both;&quot;&gt;
...by executing this snippet of HTML:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 54; title: &#39;setup_hello.html - The visible portion of the Hello, Chart! web page.&#39;;&quot;&gt;
&amp;lt;b&gt;Hello, Chart!&amp;lt;/b&gt;
&amp;lt;p&gt;
&amp;lt;button onClick=&quot;showDataSet ( 1 );&quot;&gt;Show Data Set 1&amp;lt;/button&gt;
&amp;lt;button onClick=&quot;showDataSet ( 2 );&quot;&gt;Show Data Set 2&amp;lt;/button&gt;
&amp;lt;div id=&quot;chartDiv&quot; style=&quot;margin-top: 0.5em; padding: 0.5em; border-style: solid; border-width: 1px;&quot;&gt;
[ &amp;lt;b&gt;Click the buttons&amp;lt;/b&gt; to see data, then &amp;lt;b&gt;move the mouse&amp;lt;/b&gt; to see tooltips ]
&amp;lt;p style=&quot;padding-left: 2em;&quot;&gt;
&amp;lt;i&gt;( this is the SQL Anywhere database version of 
&amp;lt;a href=&quot;http://sqlanywhere.blogspot.com/2021/02/embedding-highcharts-in-sql-anywhere.html&quot; 
   target=&quot;_blank&quot;&gt;&amp;lt;b&gt;&amp;lt;u&gt;the code in this blog post&amp;lt;/u&gt;&amp;lt;/b&gt;&amp;lt;/a&gt; )&amp;lt;/i&gt;
&amp;lt;/div&gt; 
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step6&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 6:&lt;/b&gt;
When one of the Show Data Set buttons is pressed, the browser executes the following function where

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;the requestUrl string points to a SQL Anywhere web service,
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;the chartXHR.open() sets up a XMLHttpRequest object to perform an asynchronous GET request for the web service and
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;the chartXHR.send() sends the request.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 46; title: &#39;setup_hello.html - The SQL Anywhere web service call via XMLHttpRequest.send() when Show Data Set is pressed.&#39;;&quot;&gt;
function showDataSet ( dataSet ) { 
   const requestUrl 
      = &quot;get_csv_chart_data?data_set=&quot; + dataSet; // SQL Anywhere service
   chartXHR.open ( &quot;GET&quot;, requestUrl, true ); 
   chartXHR.send(); // this will eventually trigger chartXHR.onload
};
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step7&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 7:&lt;/b&gt;
The web service get_csv_chart_data builds a CSV result set...

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;&lt;pre&gt;
Chart Timestamp,Chart Percent
2020-12-01 13:58:54,.1 
2020-12-01 13:59:04,.1 ...
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
...by executing this code:

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 152; title: &#39;setup_hello.sql.txt - Create a web service to build the CSV response to XMLHttpRequest().&#39;;&quot;&gt;
CREATE SERVICE get_csv_chart_data TYPE &#39;RAW&#39; AUTHORIZATION OFF USER DBA
   AS CALL get_csv_chart_data ( :data_set );

CREATE PROCEDURE get_csv_chart_data ( IN @data_set INTEGER )
   RESULT ( csv_string LONG VARCHAR )
BEGIN

CALL dbo.sa_set_http_header ( &#39;Content-Type&#39;, &#39;text/csv&#39; );

SELECT STRING ( -- convert rows for one data set into CSV data
          &#39;Chart Timestamp,Chart Percent&#39;, 
          &#39;\x0d\x0a&#39;,
          LIST ( 
             STRING ( DATEFORMAT ( chart_data.chart_timestamp, &#39;YYYY-MM-DD HH:MM:SS&#39; ),
                      &#39;,&#39;,
                      chart_data.chart_percent ),
             &#39;\x0d\x0a&#39;
             ORDER BY chart_data.chart_timestamp ) )
  FROM chart_data
 WHERE chart_data.data_set = COALESCE ( @data_set, 1 );

END;
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p style=&quot;clear: both;&quot;&gt;
Here&#39;s where the CSV data originally came from; it was pre-loaded into SQL Anywhere using this snippet.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 109; title: &#39;setup_hello.sql.txt - Load the Hello, Chart! test data into SQL Anywhere.&#39;;&quot;&gt;
CREATE TABLE chart_data (
   data_set        INTEGER NOT NULL,
   chart_timestamp TIMESTAMP NOT NULL,
   chart_percent   DECIMAL ( 11, 1 ) NOT NULL,
   PRIMARY KEY ( chart_timestamp ) );

INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:58:54&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:04&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:14&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:24&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:34&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:44&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 13:59:54&#39;, .1 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:04&#39;, 1.2 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:18&#39;, 10.4 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:28&#39;, 23.9 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:38&#39;, 29.2 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:43&#39;, 14.3 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:00:53&#39;, .2 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:01:03&#39;, .7 );
INSERT chart_data VALUES ( 1, &#39;2020-12-01 14:01:13&#39;, 1.2 );

INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:01:28&#39;, 16.1 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:01:38&#39;, 24.1 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:01:47&#39;, 26.0 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:01:53&#39;, 7.4 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:02&#39;, .9 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:12&#39;, .9 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:23&#39;, 1.0 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:32&#39;, .1 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:46&#39;, 28.3 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:02:54&#39;, 39.2 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:03:02&#39;, .1 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:03:12&#39;, 1.0 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:03:22&#39;, .4 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:03:32&#39;, 1.7 );
INSERT chart_data VALUES ( 2, &#39;2020-12-01 14:03:45&#39;, 18.0 );

COMMIT;
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;
&lt;p id=&quot;step8&quot; style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Step 8:&lt;/b&gt;
When the get_csv_chart_data web service returns the CSV result set, it is received by the XMLHttpRequest.onload event handler.

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;div style=&quot;margin-left: 1em; padding: 0;&quot;&gt;
&lt;!-- ++++++++++++++++++++++++++++++ --&gt;&lt;b&gt;&lt;/b&gt;&lt;pre class=&quot;brush: text; first-line: 15; title: &#39;setup_hello.html - The Highcharts.chart() asynchronous callback event handler for XMLHttpRequest.send().&#39;;&quot;&gt;
const chartXHR = new XMLHttpRequest();
chartXHR.onload = function() { // asynchronous callback event handler for chartXHR.send()
   if ( chartXHR.status === 200 ) { // HTTP status OK
      Highcharts.chart ( &quot;chartDiv&quot;, { // tell Highcharts where to put the chart
         chart: {
            type: &quot;line&quot;
         },
         data: {
            csv: chartXHR.responseText // tell Highcharts where to get the data
         },
         title: {
            text: &quot;Chart&quot;
         },
         xAxis: {
            title: {
               text: &quot;Chart Timestamp&quot;
            }
         },
         yAxis: {
            title: {
               text: &quot;Chart Percent&quot;
            }
         },
      } );
   } else {
      document.getElementById ( &quot;chartDiv&quot; ).innerHTML = &quot;HTTP Status &quot; + chartXHR.status;
      console.log ( &quot;ERROR: chartXHR.status = &quot;, chartXHR.status );
   }
   return false;
};
&lt;/pre&gt;
&lt;/div&gt;

&lt;!-- ------------------------------------------------------------------------------------- --&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;hr&gt;

&lt;p style=&quot;clear: both;&quot;&gt;
&lt;h3 id=&quot;also&quot;&gt;See Also...&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;TABLE&gt;
&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Highcharts Demos&lt;/TD&gt;                    
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://www.highcharts.com/demo&quot;&gt;highcharts.com/demo&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Highcharts Documentation&lt;/TD&gt;            
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://www.highcharts.com/docs/index&quot;&gt;highcharts.com/docs/index&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Highcharts JS API Reference&lt;/TD&gt;            
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://api.highcharts.com/highcharts/&quot;&gt;api.highcharts.com&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Working with Highcharts data.js&lt;/TD&gt;     
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://www.highcharts.com/docs/working-with-data/data-module&quot;&gt;highcharts.com/docs/working-with-data/data-module&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Highcharts CSV sample&lt;/TD&gt;               
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/data/csv/&quot;&gt;jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/data/csv&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;XMLHttpRequest Tutorial&lt;/TD&gt;             
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://javascript.info/xmlhttprequest&quot;&gt;javascript.info/xmlhttprequest&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;

&lt;TR&gt;
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;Web Services in SQL Anywhere&lt;/TD&gt;             
&lt;TD STYLE=&quot;margin: 0; padding: 0.5em 0.5em 0.5em 0; vertical-align: top; white-space: nowrap;&quot;&gt;&lt;a href=&quot;https://help.sap.com/viewer/98ad9ec940e2465695685d98e308dff5/17.0/en-US/3bd432396c5f10148782bc977a956885.html&quot;&gt;help.sap.com/viewer/98ad9ec940e2465695685d98e308dff5/17.0/en-US/3bd432396c5f10148782bc977a956885.html&lt;/a&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;
&lt;/blockquote&gt;

&lt;p&gt;
&lt;hr&gt;



</description><link>http://sqlanywhere.blogspot.com/2021/02/embedding-highcharts-in-sql-anywhere.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimKLCBygv6ThszHcSXJj-hD-kVn8pDT_fMKYqRwIdt8DB0UDqU_MYFmz1_UELqwrphtqzUpajJKOnKRoYi69_-EONXxil29pf2Rx5Jmo0bcwBWa3VzROtj9d4jo6nFUDbrbKnKOrl2Tcs/s72-c/Hello%252C+Chart%2521+screen+capture.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-7080856967594320199</guid><pubDate>Wed, 27 Jan 2021 19:42:00 +0000</pubDate><atom:updated>2021-01-27T14:42:42.925-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>Comparing Execution Plans</title><description>&lt;P&gt;
Q: Why is my SELECT &lt;b&gt;so slow?&lt;/b&gt;
&lt;BLOCKQUOTE&gt;
Answer: Graphical Plan!
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
Q: Why is my SELECT &lt;b&gt;sometimes slow&lt;/b&gt; and the rest of the time it&#39;s fast? 
&lt;BLOCKQUOTE&gt;
Answer: &lt;b&gt;Compare Plans!&lt;/b&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
The new Compare Plans tool in SQL Anywhere 17 lets you compare two graphical plans to see all the differences side-by-side... not just structural differences between diagrams, but individual differences between performance statistics like the number of disk reads for a single table.

&lt;P&gt;
&lt;BLOCKQUOTE&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFgXptLTKsGR793jNoT6ur8pcRDONLO6PZ_KP59Yh6HAiElj9DpHzHn9x7z-7QereP54-2xgiDBMtX5DUw_2BeRxkPTZaULkSSgqiqUpKCAHGbugiKwLe9-YnhKgM0W_lMRTGleD4ITes/s2048/image+1+two+monitors+SubQ+4+IMG_2179+cropped.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: left; &quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;1024&quot; data-original-width=&quot;2048&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFgXptLTKsGR793jNoT6ur8pcRDONLO6PZ_KP59Yh6HAiElj9DpHzHn9x7z-7QereP54-2xgiDBMtX5DUw_2BeRxkPTZaULkSSgqiqUpKCAHGbugiKwLe9-YnhKgM0W_lMRTGleD4ITes/s600/image+1+two+monitors+SubQ+4+IMG_2179+cropped.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
&lt;BLOCKQUOTE&gt; 
Tip: You don&#39;t have to understand &lt;b&gt;every detail&lt;/b&gt; of the graphical plans if you can find inspiration in the &lt;b&gt;differences&lt;/b&gt;.
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
Here&#39;s a demonstration using the &lt;a href=&quot;https://help.sap.com/viewer/e38b2f6217f24bdb90a3ff8ae57b1dd5/17.0/en-US/8194f1bc6ce21014a3e2aa81fb44952a.html&quot;&gt;Tutorial: Comparing Plans in Interactive SQL&lt;/a&gt; as a starting point:

&lt;P&gt;
1. Start the SQL Anywhere 17 demo database.

&lt;P&gt;
&lt;BLOCKQUOTE&gt; 
Tip: You can compare SQL Anywhere 16 plans but you have to launch the Compare Plans tool via ISQL 17.
&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
2. Flush the cache in ISQL.

&lt;P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;
CALL sa_flush_cache();
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
3. Copy and paste this SELECT into ISQL but &lt;b&gt;do not execute it&lt;/b&gt; (so the cache will still be empty when the next step captures the plan).

&lt;P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;
SELECT DISTINCT EmployeeID, GivenName, Surname
  FROM GROUPO.SalesOrders WITH (INDEX (SalesOrdersKey)), GROUPO.Employees, GROUPO.SalesOrderItems 
  WHERE SalesRepresentative = EmployeeID and
   SalesOrders.ID = SalesOrderItems.ID and
   SalesOrderItems.ProductID = (SELECT ProductID 
    FROM GROUPO.Products, GROUPO.MarketingInformation
    WHERE Name = &#39;Tee Shirt&#39; AND
    Color = &#39;White&#39; AND
    Size = &#39;Small&#39; AND
    MarketingInformation.Description LIKE &#39;%made of recycled water bottles%&#39;);
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
4. Open the &lt;b&gt;Tools - Plan Viewer&lt;/b&gt; and capture the plan as &lt;b&gt;FirstPlan17.saplan&lt;/b&gt;.

&lt;P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;
ISQL - Tools - Plan Viewer

Pick Statistics level:  Detailed and node statistics
          Cursor type:  Asensitive
        Update status:  Read-only

Click on Get Plan
   Wait for the plan to appear

Click Save As...
   Specify FirstPlan17.saplan

Click Save
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

&lt;P&gt;
5. Switch back to ISQL, then repeat Step 4 to save &lt;b&gt;SecondPlan17.saplan&lt;/b&gt;.

&lt;P&gt;
6. Switch back to ISQL and open &lt;b&gt;Tools - Compare Plans&lt;/b&gt;.

&lt;P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;
ISQL - Tools - Compare Plans

Click on Plan 1: - Browse...
   Pick FirstPlan17.saplan
   Click Open

Click on Plan 2: - Browse...
   Pick SecondPlan17.saplan
   Click Open

Click Compare Plans
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
Here are the side-by-side plans; the diagrams look the same but the statistics are different: 

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;span style=&quot;background-color: rgb(255,179,177);&quot;&gt;&amp;nbsp;red numbers&amp;nbsp;&lt;/span&gt; show zero disk reads for the second execution because all the rows were in the cache, and 
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;the &lt;span style=&quot;background-color: rgb(254,255,179);&quot;&gt;&amp;nbsp;yellow numbers&amp;nbsp;&lt;/span&gt; are disk statistics that were only measured for the first plan:
&lt;/li&gt;
&lt;/ul&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-lP3BDi7vmLmauMiSUiAW4INGPgcgxeaU9e9BJIJZT0Q_59hDt2M4fTzBnw-zTUSPYyqQvg8uRYrTVcQTAsmAivdJh2OK15leZtgdd5CjUxu4hzCrIiaAk2Ufee27sQRhk4H2a5BMRc/s1271/image+2+Compare+Plans+FirstPlan17+SecondPlan17+Disk+reads.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: left; float: left;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;964&quot; data-original-width=&quot;1271&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5-lP3BDi7vmLmauMiSUiAW4INGPgcgxeaU9e9BJIJZT0Q_59hDt2M4fTzBnw-zTUSPYyqQvg8uRYrTVcQTAsmAivdJh2OK15leZtgdd5CjUxu4hzCrIiaAk2Ufee27sQRhk4H2a5BMRc/s600/image+2+Compare+Plans+FirstPlan17+SecondPlan17+Disk+reads.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: You can compare plans for two different SELECT statements, but &lt;b&gt;make sure you&#39;re not doing that by accident&lt;/b&gt;. The tool doesn&#39;t show differences between SELECT statements, just the resulting plans.
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
Here&#39;s a map for describing the Compare Plans display:

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;
Plan 1: [filespec1]    [Browse...]        Plan 2: [filespec2]    [Browse...]     
                                                                                
                           [&amp;lt;-]  [Compare Plans]  [-&gt;]                         
--------------------------------------------------------------------------------
Comparison Overview                                                            
                                   Name   Name                                  
                              id1 node1 - id1 node1                               
                              id2 node2 - id2 node2           
--------------------------------------------------------------------------------
1. filename1                            | 2. filename2                          
Subquery: [SubQ dropdown]               | Subquery: [SubQ dropdown]                 
--------------------------------------------------------------------------------
                                        |                                       
                                        |                                       
               Diagram                  |               Diagram                
                                        |                                       
                                        |                                       
--------------------------------------------------------------------------------
[Details]  [Advanced Details]           | [Details]  [Advanced Details]         
          ------------------------------|           ---------------------------
                                        |                                       
                                        |                                       
              Statistics                |              Statistics             
                                        |                                       
                                        |                                       
--------------------------------------------------------------------------------
[Match Operators][Unmatch Operators] [Match Queries][Unmatch Queries]          
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;b&gt;Plan 1: [filespec1]&lt;/b&gt; is for picking the plan to show on the left side, &lt;b&gt;Plan 2: [filespec2]&lt;/b&gt; is for the right-hand plan, and &lt;b&gt;[Compare Plans]&lt;/b&gt; does the work.

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: When you restart the Compare Plans tool after using it before, [filespec1] and [filespec2] will be the same. Be careful what you pick, the tool doesn&#39;t care if you compare the same plan with itself.
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: When you change [filespec1] or [filespec2], even if you do it via the [Browse...] buttons, don&#39;t forget to click [Compare Plans] again. 
&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
In other words, don&#39;t rely on [filespec1] and [filespec2] for confirmation of exactly what you are looking at. If you forgot to click [Compare Plans], those aren&#39;t the plans being displayed.
&lt;/BLOCKQUOTE&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
The &lt;b&gt;[&amp;lt;-]&lt;/b&gt; and &lt;b&gt;[-&gt;]&lt;/b&gt; buttons scroll up and down through &lt;b&gt;Comparison Overview&lt;/b&gt; section, highlighting different Name rows and corresponding boxes in the Diagram sections.

&lt;P style=&quot;clear: both;&quot;&gt;
Each &lt;b&gt;Name&lt;/b&gt; in the Comparison Overview section consists of a generated identifier 1, 2, 3 and a non-unique node title (SELECT, Work, DistH, etc.).

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: The Comparison Overview doesn&#39;t show the whole query, just the part you selected in the Subquery: [dropdown]. 
&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Big complicated SELECT statements can have many entries in the Subquery list. Some of those subqueries can be far more expensive than others, and they can be way down deep in the list.
&lt;/BLOCKQUOTE&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
The two &lt;b&gt;Subquery: [dropdown]&lt;/b&gt; lists are synchronized; change one and the other changes, and so do both the Diagram sections.

&lt;P style=&quot;clear: both;&quot;&gt;
Each box in the &lt;b&gt;Diagram&lt;/b&gt; sections shows one table or other component in the SQL Anywhere query execution plan; for the full list see &lt;a href=&quot;https://help.sap.com/viewer/e38b2f6217f24bdb90a3ff8ae57b1dd5/17.0/en-US/818120d36ce21014bb04c163cb67b273.html&quot;&gt;Execution Plan Components&lt;/a&gt;.

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: Table names inside rectangles mean table scans, trapezoids mean index scans. Table scans aren&#39;t always bad; if SQL Anywhere picks a table scan when an index exists, it&#39;s usually because the table scan is faster.
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Tip: If a Diagram section shows up empty, click on the second node and then back on the top node.
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
The &lt;b&gt;Statistics&lt;/b&gt; sections, with their &lt;b&gt;Details&lt;/b&gt; and &lt;b&gt;Advanced Details&lt;/b&gt; tabs, are where all the interesting comparisons are found.

&lt;P style=&quot;clear: both;&quot;&gt;
Here&#39;s how to find them:

&lt;ul&gt;
&lt;li&gt;Step through all the diagrams in the Subquery: [dropdown] list.
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;Concentrate on the &lt;b&gt;Actual&lt;/b&gt; numbers, not the Estimates.
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;Concentrate on the &lt;b&gt;Subtree Statistics&lt;/b&gt; sections, not the Node Statistics.
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;Start by looking for large &lt;b&gt;RunTime&lt;/b&gt; numbers, not PecentTotalCost.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;One Last Thing...&lt;/h3&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
If you don&#39;t like surprises, don&#39;t click on the [Match] and [Unmatch] buttons at the bottom of the screen.

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
If you want to learn, see &lt;a href=&quot;https://help.sap.com/viewer/e38b2f6217f24bdb90a3ff8ae57b1dd5/17.0/en-US/818b11656ce2101497c7f408cfeddbf4.html&quot;&gt;Lesson 3: Manually Match and Unmatch Operators and Queries&lt;/a&gt;.

&lt;P style=&quot;clear: both;&quot;&gt;
If you &lt;b&gt;don&#39;t care&lt;/b&gt;, there&#39;s &lt;b&gt;still a reason&lt;/b&gt; to click on these buttons, it&#39;s to answer this question...
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
Q: How do I see the original SELECT statements for the two plans?

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;BLOCKQUOTE&gt; 
Answer... 

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;ol&gt;
&lt;li&gt;Click on Subquery: Main Query. 
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;Click on the topmost SELECT box in the diagrams.
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;Click on [Unmatch Operators].
&lt;/li&gt;
&lt;/ol&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
Voila! The original SELECT statements now appear in the Details tabs.

&lt;P style=&quot;clear: both;&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0lVD6ncfODyR7G0xuWFYDnCw8ID-4j2LQapnamQmC0HDqOGl0L406SAB-djoMSeAq8Mief9DUU_ImXPc2f48Rgppef-kZO497kIgvxEB25jq0MrzvurUG8VFQOMkV0MZUIMf1zKBgPk/s1288/image+3+Compare+Plans+FirstPlan17+SecondPlan17+SELECT.jpg&quot; style=&quot;display: block; padding: 1em 0; text-align: center; clear: left; float: left;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; width=&quot;600&quot; data-original-height=&quot;921&quot; data-original-width=&quot;1288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG0lVD6ncfODyR7G0xuWFYDnCw8ID-4j2LQapnamQmC0HDqOGl0L406SAB-djoMSeAq8Mief9DUU_ImXPc2f48Rgppef-kZO497kIgvxEB25jq0MrzvurUG8VFQOMkV0MZUIMf1zKBgPk/s600/image+3+Compare+Plans+FirstPlan17+SecondPlan17+SELECT.jpg&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/BLOCKQUOTE&gt;

&lt;P style=&quot;clear: both;&quot;&gt;
Tip: To reset everything, click on [Compare Plans} again... that gets rid of the effects of clicking on [Match] and [Unmatch].

&lt;hr&gt;
</description><link>http://sqlanywhere.blogspot.com/2021/01/comparing-execution-plans.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFgXptLTKsGR793jNoT6ur8pcRDONLO6PZ_KP59Yh6HAiElj9DpHzHn9x7z-7QereP54-2xgiDBMtX5DUw_2BeRxkPTZaULkSSgqiqUpKCAHGbugiKwLe9-YnhKgM0W_lMRTGleD4ITes/s72-c/image+1+two+monitors+SubQ+4+IMG_2179+cropped.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-5785340302150009120</guid><pubDate>Thu, 10 Dec 2020 14:40:00 +0000</pubDate><atom:updated>2020-12-10T09:40:20.808-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">SQL code</category><title>A Simple JSON Example</title><description>&lt;p&gt;
&lt;b&gt;Question:&lt;/b&gt; How do I dump one row to a json file?

&lt;p&gt;
&lt;b&gt;Answer:&lt;/b&gt; Here&#39;s an adhoc query that writes all the Foxhound 5 Monitor Options values for one target database to a json text file:

&lt;p&gt;
&lt;pre style=&quot;padding-left: 2em;&quot;&gt;-- Start - Foxhound5 - 2 Adhoc Query via ISQL
UNLOAD
SELECT REPLACE ( json_raw_table.json_raw_string, &#39;,&quot;&#39;, &#39;,\X0D\X0A&quot;&#39; ) AS monitor_options_json
  FROM ( SELECT *
           FROM alerts_criteria
          WHERE alerts_criteria.criteria_set_type = &#39;Target Specific&#39;
            AND alerts_criteria.sampling_id       = 13 -- Inventory17
            FOR JSON RAW
       ) AS json_raw_table ( json_raw_string ) 
TO &#39;C:\\temp\\monitor_options.json&#39;
   DELIMITED BY &#39;&#39; 
   ESCAPES OFF 
   HEXADECIMAL OFF 
   QUOTES OFF;

[{&quot;criteria_set_type&quot;:&quot;Target Specific&quot;,
&quot;sampling_id&quot;:13,
&quot;send_alert_emails&quot;:&quot;N&quot;,
&quot;mail_recipient&quot;:&quot;&quot;,
&quot;use_html_in_emails&quot;:&quot;Y&quot;,
&quot;attach_files_to_emails&quot;:&quot;Y&quot;,
&quot;email_url_host_port&quot;:&quot;localhost&quot;,
&quot;display_alerts&quot;:&quot;Y&quot;,
&quot;autodrop_mail_recipients&quot;:&quot;&quot;,
&quot;autodrop_mail_recipients_same_as_for_alerts&quot;:&quot;Y&quot;,
&quot;previous_sample_set_number_processed&quot;:3935794,
&quot;previous_gathered_sample_finished_at&quot;:&quot;2020-12-10 08:28:08.609&quot;,
&quot;current_sample_finished_at&quot;:&quot;2020-12-10 08:28:08.609&quot;,
&quot;alert1_enabled&quot;:&quot;Y&quot;,
&quot;alert1_is_in_effect&quot;:&quot;N&quot;,
&quot;alert1_in_effect_at&quot;:&quot;2020-12-07 11:13:00.567&quot;,
&quot;alert1_all_clear_at&quot;:&quot;2020-12-08 07:48:11.438&quot;,
&quot;alert1_threshold_lost_sample_accumulated_msec&quot;:60000,
&quot;alert1_actual_lost_sample_accumulated_msec&quot;:0,
...&lt;/pre&gt;

&lt;p&gt;
The docs are light on simple questions like this, perhaps because they lead to &lt;b&gt;more&lt;/b&gt; simple questions...

&lt;p&gt;
How do I get SELECT FOR JSON output &lt;b&gt;into a string&lt;/b&gt;?

&lt;p style=&quot;padding-left: 2em;&quot;&gt;
Answer: Use a SELECT INTO clause, or a subquery.

&lt;p&gt;
How do I actually code SELECT FOR JSON &lt;b&gt;in a subquery&lt;/b&gt;?

&lt;p style=&quot;padding-left: 2em;&quot;&gt;
Answer: Code a derived table with an alias table name and a single alias column name, because the select list for SELECT * FOR JSON consists of one single column.

&lt;p&gt;
How do I &lt;b&gt;get line breaks&lt;/b&gt;?

&lt;p style=&quot;padding-left: 2em;&quot;&gt;
Answer: Use REPLACE, and hope your data doesn&#39;t contain any comma-doublequote pairs... or &lt;b&gt;write better code&lt;/b&gt; than this example :)

&lt;p&gt;
&lt;/hr&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/12/a-simple-json-example.html</link><author>noreply@blogger.com (Breck Carter)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-7493359329290526819</guid><pubDate>Thu, 03 Dec 2020 13:28:00 +0000</pubDate><atom:updated>2020-12-03T08:28:04.202-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Foxhound 5 Giveth, Foxhound 5 Taketh Away</title><description>&lt;p&gt;
&lt;img style=&quot;margin-left: 1em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiePs45XP2LU-3N2dhSiy800ud9aCznteu8f3mS5kmU5CcxueL4o4F8kDOEnU5wR5kIH4P-Uf4RsrJ09CLKVhwKzjFgvWBF7GsO2oA28dPTC88r3AZ6N7kAZy_8N7yvM0kXuXCRJENklbg/s0/RAISERROR.jpg&quot; width=&quot;383&quot;&gt;

&lt;p&gt;
&lt;h3&gt;New Feature&lt;/h3&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_contents.html#Change%20156%20Feature&quot;&gt;&lt;b&gt;&lt;u&gt;The ADHOC user id can create procedures, functions, tables, indexes and views&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;

&lt;p&gt;
&lt;div style=&quot;padding-left: 1em;&quot;&gt;
If you like running adhoc queries on the Foxhound database, you&#39;ll love being able to CREATE your own procedures... and tables, and views, and functions.

&lt;p&gt;
For more information see &lt;a href=&quot;https://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_adhoc_queries.html#What-kind-of-adhoc-queries-can-I-write&quot;&gt;What kind of adhoc queries can I write?&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;
&lt;h3&gt;But . . .&lt;/h3&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_contents.html#Change%20157%20Behavior%20Change&quot;&gt;&lt;b&gt;&lt;u&gt;Behavior Change: The ADHOC user id cannot be used in SQL Central to connect to the Foxhound database&lt;/u&gt;&lt;/b&gt;&lt;/a&gt;

&lt;p&gt;
&lt;div style=&quot;padding-left: 1em;&quot;&gt;
You can use ISQL but not SQL Central; that door has been closed. 
&lt;/div&gt;

&lt;p&gt;
&lt;h3&gt;So . . .&lt;/h3&gt;

&lt;p&gt;
Windows &lt;b&gt;Start menu - Foxhound5 - 2 Adhoc Query via ISQL&lt;/b&gt; is your friend :)

&lt;p&gt;
&lt;hr&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/12/foxhound-5-giveth-foxhound-5-taketh-away.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiePs45XP2LU-3N2dhSiy800ud9aCznteu8f3mS5kmU5CcxueL4o4F8kDOEnU5wR5kIH4P-Uf4RsrJ09CLKVhwKzjFgvWBF7GsO2oA28dPTC88r3AZ6N7kAZy_8N7yvM0kXuXCRJENklbg/s72-c/RAISERROR.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-6864654412986733027</guid><pubDate>Wed, 02 Dec 2020 18:20:00 +0000</pubDate><atom:updated>2020-12-02T13:20:01.341-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Foxhound Shock! (Server Messages)</title><description>&lt;p&gt;
&lt;img style=&quot;margin-left: 10em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKBX28z5KC8htsXR8EUbHKAANwpND1b-JByfSj9t-h81rPJYtfIoMk5gihXOhrT6zbQqoI45AcSdvCw7tkbUVKTn6qlsazpWMpd5UZw2pMCc1ypjmm5nv6mQxrz4KDVS6M6cSTSDZRR8E/w400-h106/im+in+ur+base+killin+ur+d00dz+TRIMMED.jpg&quot; width=&quot;400&quot; /&gt;

&lt;p&gt;
There&#39;s a new feature in Foxhound 5 that &lt;b&gt;may come as a shock:&lt;/b&gt; 

&lt;p&gt;
&lt;a style=&quot;padding-left: 1em;&quot; href=&quot;https://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_contents.html#Change 53 Feature&quot;&gt;SQL Anywhere server messages are stored and displayed on the Monitor and History pages&lt;/a&gt;.

&lt;p&gt;
&lt;div style=&quot;margin-left: 10em; padding-left: 1em; padding-right: 1em; border-style: solid; border-width: 1px;&quot;&gt;

&lt;p&gt;
First, some background: &lt;b&gt;Server messages&lt;/b&gt; appear in the SQL Anywhere &lt;b&gt;console log&lt;/b&gt;, and in the &lt;b&gt;dbsrv17.exe -o text file&lt;/b&gt; if you specify that option (you should).

&lt;p&gt;
&lt;img style=&quot;margin-left: 2em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdlB1hi8o0OkTFokxXYsulu_LGh9T88vhzA2YOwRzU-sxAY6Y8VhfG3tDFr0RU7JM0QU51jxj2FDT-G9eb8gNoTzsW3AGSf44Esn9O2I_BUsEnvFXsiV1UfYFz1S3VWDXhvE9KEzMDeec/s320/console.jpg&quot; width=&quot;300&quot;&gt;

&lt;p&gt;
Server messages are mostly boring &lt;b&gt;&quot;Information&quot;&lt;/b&gt; messages

&lt;pre style=&quot;padding-left: 2em;&quot;&gt;I. Database &quot;ddd16&quot; (ddd16.db) started at Wed Dec 02 2020 07:48
I. Finished checkpoint of &quot;ddd16&quot; (ddd16.db) at Wed Dec 02 2020 07:48&lt;/pre&gt;

&lt;p&gt;
Some server messages are &lt;b&gt;interesting&lt;/b&gt;

&lt;pre style=&quot;padding-left: 2em;&quot;&gt;I. Database &quot;ddd&quot; mirroring:  becoming primary server&lt;/pre&gt;

&lt;p&gt;
and some are &lt;b&gt;very interesting&lt;/b&gt;

&lt;pre style=&quot;padding-left: 2em;&quot;&gt;W. Database &quot;ddd&quot; mirroring:  Warning: Mirror is running behind the primary server by more than 60 seconds.
E. Database &quot;ddd&quot; mirroring:  mirror connection to server &quot;partner2_server&quot; failed&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Foxhound 5 displays server messages &lt;b&gt;as a convenience:&lt;/b&gt; 

&lt;p style=&quot;padding-left: 1em;&quot;&gt;
If you&#39;re going to the trouble of running Foxhound, why should you have to look somewhere else to see server messages?
&lt;/p&gt;

&lt;p&gt;
&lt;h3&gt;But . . .  server messages can be a bit of a surprise&lt;/h3&gt;

&lt;p&gt;
. . . when you &lt;b&gt;suddenly start seeing server messages&lt;/b&gt; in the Monitor page &lt;b&gt;after upgrading Foxhound 5:&lt;/b&gt;

&lt;p&gt;
&lt;img style=&quot;margin-left: 2em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLm6g4LHf8y2F3bGs9rsOEfhjHuGjSOjyK0-JMfxH7YbBumDAMtkN54SMVeym0PiRS8oCt9DtJhbVCTn763ayP5PSMCDTkkn4yUb96JyuVTNxXqpneHLGjf91HotXNFbt5UGmUgODmkeQ/w815-h233/server+messages.jpg&quot; width=&quot;610&quot; /&gt;

&lt;p&gt;
&lt;h3&gt;They can also be a SHOCK&lt;/h3&gt;

&lt;p&gt;
If your application code or stored procedures contain MESSAGE TO CONSOLE statements, 

&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;and you are &lt;b&gt;not in the habit&lt;/b&gt; of looking at the SQL Anywhere console log,
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;or you &lt;b&gt;don&#39;t know where&lt;/b&gt; (or what) the SQL Anywhere console log is,
&lt;/li&gt;
&lt;/ul&gt;
suddenly seeing a storm of MESSAGE TO CONSOLE output in the Foxhound Monitor page can be a shock.

&lt;p&gt;
&lt;img style=&quot;margin-left: 2em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7gkYeI8q9L2ALXIplT2y0ktvHTyDREtzIRcLPHhI1b8qiwI7p5a3pEVsBd1L0lGOTwMow8jS2XXtbylEPS_F9EeNjpobDHf5M2NSdkQegKQ0LGef-_YFmhAJYxELmXkDsMrA8jZq9MkM/w611-h177/im+in+ur+base+killin+ur+d00dz.jpg&quot; width=&quot;508&quot; /&gt;

&lt;p&gt;
&lt;h3&gt;Relax, you can turn off the storm&lt;/h3&gt;

&lt;p&gt;
Just click on the little black gear &lt;b&gt;(*)&lt;/b&gt; icon on one of the messages, and it&#39;ll take you directly to the Monitor Options page

&lt;p&gt;
&lt;img style=&quot;margin-left: 2em;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWsFOpx5VQDaPuB0g9XlkAu5XfjV0MfS-Ssf9OUSKyX7R8Ggk-uceFLkC16K5NobhWy_0PXwEdj42ViSgHk5OM7e9E-TPpikhrypHdi2Ip64wGoNbQgh3HkqpyITRKRIWIMx6rXFaVQ-A/w461-h111/uncheck+Display+server+messages.jpg&quot; width=&quot;461&quot; /&gt;

&lt;p&gt;
In section 18. Server Messages, make sure you&#39;ve selected the right target database, 

&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;then uncheck Display server messages on the Foxhound Monitor and Sample History pages
&lt;p style=&quot;clear: both;&quot;&gt;
&lt;/li&gt;

&lt;li&gt;and click on Save.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;h3&gt;But, maybe you don&#39;t want to&lt;/h3&gt;

&lt;p&gt;
Server messages might be your friend :)

&lt;hr /&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/12/foxhound-shock-server-messages.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKBX28z5KC8htsXR8EUbHKAANwpND1b-JByfSj9t-h81rPJYtfIoMk5gihXOhrT6zbQqoI45AcSdvCw7tkbUVKTn6qlsazpWMpd5UZw2pMCc1ypjmm5nv6mQxrz4KDVS6M6cSTSDZRR8E/s72-w400-h106-c/im+in+ur+base+killin+ur+d00dz+TRIMMED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1374985795587060020</guid><pubDate>Mon, 30 Nov 2020 15:20:00 +0000</pubDate><atom:updated>2020-11-30T10:20:47.808-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SQL code</category><title>The Future Of SQL Anywhere</title><description>Here&#39;s a question that was asked today: &lt;a href=&quot;https://sqlanywhere-forum.sap.com/questions/36291/sql-anywhere-future&quot;&gt;https://sqlanywhere-forum.sap.com/questions/36291/sql-anywhere-future&lt;/a&gt;...

&lt;P&gt;
&lt;B&gt;Question:&lt;/B&gt; In our company we are starting a new software project and I am in a dilemma about the database. Today we are using SQL Anywhere v17. But as I see it there is not much work going on on it. Is there any development on it? Could we expect a new version in near future?

&lt;P&gt;
&lt;B&gt;Answer:&lt;/B&gt; I believe SQL Anywhere 17 has a long and successful future as an extremely powerful and stable relational database system. There probably won&#39;t be too many (any more?) &quot;RFQ Checkpoint&quot; features any time soon; e.g., no new kitchen-sink-in-the-database features like Java-objects-in-the-database&quot;, full-text search, spatial data.

&lt;P&gt;
Don&#39;t get me wrong, there&#39;s a bunch of kitchen-sink features I love; e.g., HTTP, proxy tables, HA, MobiLink, even SQL Remote. My point is, if you have a favorite non-relational, non-SQL feature you&#39;d like stuffed into SQL Anywhere, don&#39;t hold your breath. For example, built-in JavaScript charts... but guess what? you can embed Highcharts in SQL Anywhere yourself, and use XMLHttpRequest() to dynamically request database data from the browser.

&lt;P&gt;
And if you&#39;re looking for further development of the in-memory database feature, or the addition of a columnar data store, well, that&#39;ll won&#39;t come until we get UltraLite HANA :)

&lt;P&gt;
Seriously, the &quot;kitchen-sink&quot; phase is over, SQL Anywhere has entered the &quot;powerful and stable&quot; stage in its life.

&lt;P&gt;
Consider this particular Use Case: SQL Anywhere is embedded in the &lt;a href=&quot;https://www.oracle.com/industries/food-beverage/products/res-3700/&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;&lt;b&gt;Oracle MICROS RES 3700 Restaurant POS System&lt;/b&gt;&lt;/u&gt;&lt;/a&gt; which is used in hundreds of thousands of bars, restaurants, hotels and other hospitality establishments worldwide.

&lt;P&gt;
BTW, Highcharts rocks, so does FreeFind.

&lt;HR&gt;</description><link>http://sqlanywhere.blogspot.com/2020/11/the-future-of-sql-anywhere.html</link><author>noreply@blogger.com (Breck Carter)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-421955531282218545</guid><pubDate>Wed, 18 Nov 2020 16:00:00 +0000</pubDate><atom:updated>2020-11-18T14:10:00.831-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">announcement</category><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Foxhound 5 Update 1 Is Now Available</title><description>&lt;P STYLE=&quot;padding-top: 0em;&quot;&gt;
&lt;b&gt;Foxhound&lt;/b&gt; is a front-line &lt;b&gt;database monitor&lt;/b&gt; dedicated to SAP&lt;sup&gt;&amp;reg;&lt;/sup&gt; SQL Anywhere&lt;sup&gt;&amp;reg;&lt;/sup&gt; . . . 
&lt;ul STYLE=&quot;margin-top: 0em; padding-top: 0em;&quot;&gt;
&lt;li&gt;Foxhound &lt;b&gt;runs all the time&lt;/b&gt;, in production.
&lt;/li&gt;
&lt;li&gt;It &lt;b&gt;keeps watch&lt;/b&gt; over your databases and sends alerts when there are problems.
&lt;/li&gt;
&lt;li&gt;It &lt;b&gt;keeps a record&lt;/b&gt; of database and connection-level performance data in its own SQL Anywhere database.
&lt;/li&gt;
&lt;li&gt;It &lt;b&gt;lets you scroll&lt;/b&gt; and query all the data when you need to fix a problem.
&lt;/li&gt;
&lt;/ul&gt;

&lt;P STYLE=&quot;padding-top: 0.5em;&quot;&gt;
&lt;A HREF=&quot;https://www.risingroad.com/foxhound/index.html&quot; TITLE=&quot;Foxhound&quot; STYLE=&quot;background-color: #7ffc03; padding: 0.3em;&quot;&gt;
&amp;ensp;Foxhound Version 5 &lt;u&gt;Update 1&lt;/u&gt; is Now Available&amp;ensp;&lt;/A&gt;

&lt;P&gt;Most of the changes in Update 1 are &lt;b&gt;bug fixes&lt;/b&gt; with a few minor &lt;b&gt;improvements&lt;/b&gt; . . . 

&lt;P&gt;. . . but &quot;minor&quot; is in the eye of the beholder; &lt;b&gt;here&#39;s a selection&lt;/b&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 205 EBF 1&quot;&gt;Bug Fix: Foxhound Monitor sampling is stopped if &lt;b&gt;dbsrv -k&lt;/b&gt; CollectStatistics = No&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 206 EBF 1&quot;&gt;Behavior Change: FOXHOUND5UPGRADE=ALL does not set connection flags when upgrading from Foxhound 4, &lt;b&gt;to save time&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 211 EBF 1&quot;&gt;Bug Fix: Repeated &quot;Permission denied&quot; messages are suppressed when SPs: NNN.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 213 EBF 1&quot;&gt;Bug Fix: &lt;b&gt;OFSS CPU&lt;/b&gt; statistics are correctly adjusted for connections making heavy use of intra-query parallelism.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 215 EBF 1&quot;&gt;Bug Fix: The &lt;b&gt;Block Reason and Locked Row Query&lt;/b&gt; fields are now displayed for OFSS subject databases.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 217 EBF 1&quot;&gt;Usability: The connections section is sorted by &quot;&lt;b&gt;Current Req Status&lt;/b&gt;&quot; in Alert #23 Blocked connections emails.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 221 EBF 1&quot;&gt;Bug Fix: Bogus &quot;Item ... already exists&quot; exceptions are no longer displayed for duplicate target databases.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 223 EBF 1&quot;&gt;Bug Fix: Foxhound automatically schedules a Mini-Backup to be performed after certain user actions.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 224 EBF 1&quot;&gt;Bug Fix: Foxhound &lt;b&gt;no longer re-issues Alerts&lt;/b&gt; immediately after Cancelled messages when active alerts are disabled.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 225 EBF 1&quot;&gt;Bug Fix: The Display Schema process no longer leaves &lt;b&gt;multiple inactive connections&lt;/b&gt; open on the target database.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 227 EBF 1&quot;&gt;Bug Fix: Block Reason now correctly shows &quot;Position Transaction Phantom lock&quot; for &lt;b&gt;phantom row position locks&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 229 EBF 1&quot;&gt;Bug Fix: Block Reason now correctly shows &quot;Schema Transaction Shared lock&quot; for &lt;b&gt;schema locks&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 230 EBF 1&quot;&gt;Behavior Change: Foxhound performance is improved by &lt;b&gt;examining fewer locks&lt;/b&gt; when a connection is blocked.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 231 EBF 1&quot;&gt;Bug Fix: The AutoDrop #6 Locks message no longer contains incorrect values.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 232 EBF 1&quot;&gt;Bug Fix: The Monitor Options page correctly handles disconnected databases.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 233 EBF 1&quot;&gt;Bug Fix: The rroad_recalculate_flags() procedure correctly changes the Conn Flags Count column &lt;b&gt;on the Peaks row&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 234 EBF 1&quot;&gt;Bug Fix: FOXHOUND5UPGRADE=OPTIONS is assumed when an invalid value is specified, &lt;b&gt;rather than ALL&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 235 EBF 1&quot;&gt;Bug Fix: Alert #33 and Alert #34 are handled properly when they are &lt;b&gt;enabled and disabled separately&lt;/b&gt;.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 237 EBF 1&quot;&gt;Bug Fix: The page title now includes &quot;Default Settings&quot; when the Monitor Option page is showing the Default Settings.&lt;/A&gt;&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 238 EBF 1&quot;&gt;Bug Fix: &lt;b&gt;Bogus Alert #1 messages&lt;/b&gt; are no longer shown when a large Foxhound database is started.&lt;/A&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;P STYLE=&quot;padding-top: 0.5em; padding-left: 0em;&quot;&gt;
&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html&quot; 
TITLE=&quot;What&#39;s New in Foxhound 5&quot; STYLE=&quot;background-color: yellow; padding: 0.3em;&quot;&gt;&amp;ensp;What&#39;s New in Foxhound 5&amp;ensp;&lt;/A&gt;
&amp;ensp;
&lt;A HREF=&quot;https://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#EBF 1&quot; 
TITLE=&quot;What&#39;s New in Foxhound 5 Update 1&quot; STYLE=&quot;background-color: #7ffc03; padding: 0.3em;&quot;&gt;&amp;ensp;What&#39;s New in Update 1&amp;ensp;&lt;/A&gt; 

&lt;HR&gt;</description><link>http://sqlanywhere.blogspot.com/2020/11/foxhound-5-update-1-is-now-available.html</link><author>noreply@blogger.com (Breck Carter)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-3250429556928029842</guid><pubDate>Sat, 10 Oct 2020 17:28:00 +0000</pubDate><atom:updated>2020-10-10T13:28:21.218-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Best Review Ever</title><description>&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;
     Re: Questions about Foxhound
   from: Loren Sherman at Healthpointe
     to: Breck Carter at gmail 
   date: Oct 9, 2020, 12:26 PM

This must be the most complete set of answers I ever received from anyone on anything in any universe. Thank you!!
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/10/best-review-ever.html</link><author>noreply@blogger.com (Breck Carter)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1049171365311998100</guid><pubDate>Wed, 07 Oct 2020 18:37:00 +0000</pubDate><atom:updated>2020-10-07T14:37:42.630-04:00</atom:updated><title>The fRiDaY File - Connect to Running Database</title><description>&lt;b&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;From &lt;a href=&quot;https://sqlanywhere-forum.sap.com/questions/36107/connect-to-running-database-on-another-computer-is-failing&quot;&gt;&lt;u&gt;Connect to Running Database on another computer is failing&lt;/u&gt;&lt;/a&gt; . . .&lt;/span&gt;&lt;/b&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBaSC7ngG478JdKEfV0fvguMlI8YtV5fO_k3uNZwZttw-MyhIqgdEefAORrSJKDXvDV6qy-u1DJURpRGutXYAtehgL9BN3bdRgahIflNLYPXgucUhnxYHTu_T_nQbhyGCqnjVnNbAOOM/s0/sqlanywhere-forum+Nobody+expects+the+firewall.jpg&quot; style=&quot;border: none;&quot; width=&quot;600&quot; /&gt;

&lt;hr /&gt;

</description><link>http://sqlanywhere.blogspot.com/2020/10/the-friday-file-connect-to-running.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBaSC7ngG478JdKEfV0fvguMlI8YtV5fO_k3uNZwZttw-MyhIqgdEefAORrSJKDXvDV6qy-u1DJURpRGutXYAtehgL9BN3bdRgahIflNLYPXgucUhnxYHTu_T_nQbhyGCqnjVnNbAOOM/s72-c/sqlanywhere-forum+Nobody+expects+the+firewall.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1517767457684257233</guid><pubDate>Tue, 03 Mar 2020 08:00:00 +0000</pubDate><atom:updated>2020-03-03T03:00:05.580-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>Inside Foxhound: String De-Duplication</title><description>String de-duplication is the replacement of multiple duplicate string values with a single copy to save space.&lt;br /&gt;
&lt;br /&gt;
Foxhound 5 uses custom code to implement de-duplication of two columns in the database, and this sometimes results in the database file being 50% smaller than in Foxhound 4. &lt;br /&gt;
&lt;br /&gt;
This article shows &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;how existing Foxhound code was changed to implement string de-duplication, and&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;how concurrency problems were handled to prevent performance problems.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;a href=&quot;#CREATE TABLE Changes&quot;   &gt;CREATE TABLE Changes&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;#SELECT Changes&quot;         &gt;SELECT Changes&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;#INSERT Changes&quot;         &gt;INSERT Changes&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;#DELETE Changes&quot;         &gt;DELETE Changes&lt;/a&gt;&lt;br&gt;&lt;a href=&quot;#Final&quot;                  &gt;Final Thoughts: Is This For You?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;&lt;h3 id=&quot;CREATE TABLE Changes&quot;&gt;CREATE TABLE Changes&lt;/h3&gt;The strings of interest are the &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_monitor.html#conn_last_statement&quot; target=&quot;_blank&quot;&gt;Last Statement and Last Plan Text fields&lt;/a&gt; on the Foxhound Monitor and Sample History pages:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5OFB3haRuQxXShM7oV5snmono3LZtcJfN8Khj0ogGxX8LDJK0XvRsSoH9FMCfpS-Eu0ZtkY7ddDuFVCSmfJY9DiQ4tMWfmA3miAwHwfUzVcVtWoyJ6DkWYiu-N7iDo8f3MVZTFeF8-Vw/s1600/Figure+4.10+Rev+0.+Runaway+CPU+Usage+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;In Foxhound 4 they&#39;re stored in this table:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;CREATE TABLE DBA.rroad_group_2_property_pivot (  
   sampling_id                                     UNSIGNED INT NOT NULL,
   sample_set_number               /* PK      X */ UNSIGNED BIGINT NOT NULL,
   connection_number               /* PK        */ BIGINT NOT NULL,
   ...
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastStatement                                   LONG VARCHAR NULL,&lt;/SPAN&gt;
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastPlanText                                    LONG VARCHAR NULL DEFAULT &#39;&#39;,&lt;/SPAN&gt;
   ...
   PRIMARY KEY (
      sample_set_number,
      connection_number ) );
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;In Foxhound 5 they&#39;ve been replaced by two unsigned integers:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;CREATE TABLE dba.rroad_group_2_property_pivot (  
   sampling_id                                         UNSIGNED INT NOT NULL,
   sample_set_number                   /* PK      X */ UNSIGNED BIGINT NOT NULL,
   connection_number                   /* PK        */ BIGINT NOT NULL,
   ...
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastStatement_id                                    UNSIGNED INT NOT NULL DEFAULT 0,&lt;/SPAN&gt;
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastPlanText_id                                     UNSIGNED INT NOT NULL DEFAULT 0,&lt;/SPAN&gt;
   ...
   PRIMARY KEY (
      sample_set_number,
      connection_number ) );
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The LastStatement_id and LastPlanText_id columns are effectively foreign key columns pointing to a new table (rroad_long_varchar) where the actual LONG VARCHAR values are stored:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;CREATE TABLE dba.rroad_long_varchar ( 
   long_varchar_id   /* PK        */ UNSIGNED INT NOT NULL DEFAULT autoincrement,
   reference_count                   BIGINT NOT NULL,
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;long_varchar      /*       U   */ LONG VARCHAR NOT NULL,&lt;/SPAN&gt;
   PRIMARY KEY ( long_varchar_id ) );

CREATE UNIQUE INDEX ux_long_varchar ON dba.rroad_long_varchar ( long_varchar );
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The UNIQUE INDEX has two purposes: first, it guarantees there are no duplicates, and second, it supports the SELECT &lt;i&gt;WHERE rroad_long_varchar.long_varchar = @new_long_varchar&lt;/i&gt; clause used in a later section.&lt;br /&gt;
&lt;h3 id=&quot;SELECT Changes&quot;&gt;SELECT Changes&lt;/h3&gt;In Foxhound 5 the adhoc view &lt;b&gt;sample_connection&lt;/b&gt; has been modified to return the same result set as in Foxhound 4. In other words, even though the underlying rroad_group_2_property_pivot table no longer contains LastStatement and LastPlanText, those columns &lt;B&gt;do appear&lt;/B&gt; in the view. &lt;br /&gt;
&lt;br /&gt;
Here&#39;s how:&lt;br /&gt;
&lt;br /&gt;
In Foxhound 4 the view is a simple &quot;SELECT everything from the base table&quot; &lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;create VIEW sample_connection AS 
SELECT * 
  FROM rroad_group_2_property_pivot;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;whereas Foxhound 5 uses joins to turn LastStatement_id and LastPlanText_id into the original LastStatement and LastPlanText:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;create VIEW sample_connection AS 
SELECT rroad_group_2_property_pivot.sampling_id,
       rroad_group_2_property_pivot.sample_set_number, -- PRIMARY KEY
       rroad_group_2_property_pivot.connection_number, -- PRIMARY KEY
       ...
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;rroad_LastStatement.long_varchar   AS LastStatement,&lt;/SPAN&gt;
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;rroad_LastPlanText.long_varchar    AS LastPlanText,&lt;/SPAN&gt;
       ...
  FROM rroad_group_2_property_pivot
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;INNER JOIN&lt;/SPAN&gt; ( SELECT * 
                      FROM rroad_long_varchar 
                  ) AS rroad_LastStatement
               ON rroad_LastStatement.long_varchar_id = rroad_group_2_property_pivot.LastStatement_id
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;INNER JOIN&lt;/SPAN&gt; ( SELECT * 
                      FROM rroad_long_varchar 
                  ) AS rroad_LastPlanText
               ON rroad_LastPlanText.long_varchar_id = rroad_group_2_property_pivot.LastPlanText_id
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;Foxhound itself uses the same joins to display LastStatement and LastPlanText on the Monitor and History pages.&lt;br /&gt;
&lt;h3 id=&quot;INSERT Changes&quot;&gt;INSERT Changes&lt;/h3&gt;When the Foxhound sampling process inserts a connection sample, it calls a function to convert the SQL Anywhere LastStatement and LastPlanText properties into unsigned integers:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;INSERT rroad_group_2_property_pivot (
       sampling_id, 
       sample_set_number,
       connection_number,
       ...
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastStatement_id,&lt;/SPAN&gt;
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;LastPlanText_id,&lt;/SPAN&gt;
       ...
SELECT @sampling_id,
       @sample_set_number,
       connection_number,
       ...
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;rroad_get_long_varchar_id ( LastStatement ),&lt;/SPAN&gt; 
       &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;rroad_get_long_varchar_id ( LastPlanText ),&lt;/SPAN&gt;
       ...
  FROM ...
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;Here&#39;s that function:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-top: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;&quot;&gt;CREATE FUNCTION rroad_get_long_varchar_id ( 
   IN @long_varchar        LONG VARCHAR,
   IN @is_recursive_call   VARCHAR ( 1 ) DEFAULT &#39;N&#39; )
   RETURNS UNSIGNED INTEGER
   NOT DETERMINISTIC
BEGIN

DECLARE @new_long_varchar              LONG VARCHAR;
DECLARE @existing_long_varchar_id      UNSIGNED INTEGER;
DECLARE @existing_long_varchar         LONG VARCHAR;
DECLARE @sqlstate                      VARCHAR ( 5 );
DECLARE @errormsg                      VARCHAR ( 32767 );
DECLARE @sqlcode                       INTEGER;
DECLARE @diagnostic_location           VARCHAR ( 20 );
DECLARE @v_existing_long_varchar_id    VARCHAR ( 128 );

SET @new_long_varchar = TRIM ( COALESCE ( @long_varchar, &#39;&#39; ) );

IF @new_long_varchar = &#39;&#39; THEN
   RETURN 0;
ELSE
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The following section checks if the LONG VARCHAR value has already been stored in the rroad_long_varchar table.&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black;&quot;&gt;   SET @existing_long_varchar_id = NULL;

   SELECT rroad_long_varchar.long_varchar_id 
     INTO @existing_long_varchar_id
     FROM rroad_long_varchar
    &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;WHERE rroad_long_varchar.long_varchar = @new_long_varchar;&lt;/SPAN&gt;

   IF @existing_long_varchar_id IS NOT NULL THEN
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;At this point @existing_long_varchar_id is ready to be returned to the caller because it points to the LONG VARCHAR value that already exists in rroad_long_varchar...&lt;br /&gt;
&lt;br /&gt;
...but first, some bookkeeping is necessary.&lt;br /&gt;
&lt;br /&gt;
The Foxhound purge process must know when it&#39;s safe to delete old LONG VARCHAR values, and it does this by checking that rroad_long_varchar.reference_count is zero.&lt;br /&gt;
&lt;br /&gt;
The following code increments the reference_count by 1 each time a new reference is encountered, or rather, it &lt;b&gt;attempts to increment the reference count&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; &quot;&gt;      BEGIN -- handle exception

         SET TEMPORARY OPTION BLOCKING = &#39;OFF&#39;;

         UPDATE rroad_long_varchar
            SET reference_count = reference_count + 1
          WHERE long_varchar_id = @existing_long_varchar_id;

         SET TEMPORARY OPTION BLOCKING = &#39;ON&#39;;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;It is possible that multiple almost-simultaneous calls to this function can reach this point with same LONG VARCHAR value; i.e., Foxhound can sample up to 100 target databases in parallel, and it&#39;s possible for the same LastStatement and LastPlanText values could be received from multiple targets.&lt;br /&gt;
&lt;br /&gt;
When that happens, &lt;b&gt;the above UPDATE can fail&lt;/b&gt; with SQLCODE -210 &lt;i&gt;Row locked&lt;/i&gt;, -306 &lt;i&gt;Deadlock detected&lt;/i&gt;, or -307 &lt;i&gt;All threads are blocked&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Rather than have these collisions cause waits or rollbacks, BLOCKING = &#39;OFF&#39; is used to force all collisions to raise exceptions (even row locks), and those exceptions are all handled by the next section of code which defers the incrementing of reference_count until later.&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; &quot;&gt;      EXCEPTION WHEN OTHERS THEN

         SELECT SQLCODE INTO @sqlcode;

         SET TEMPORARY OPTION BLOCKING = &#39;ON&#39;;

         IF @sqlcode IN ( -210, -306, -307 ) THEN 

            -- Defer the UPDATE until later.

            INSERT rroad_long_varchar_deferred_increment ( long_varchar_id ) 
            VALUES ( @existing_long_varchar_id );
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;In the grand scheme of things, incrementing reference_count is very low priority; it is much more important for Foxhound sampling to proceed without delay.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s the table used by the above INSERT; each row represents one deferred reference_count increment of +1 for one long_varchar_id:&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;CREATE TABLE rroad_long_varchar_deferred_increment ( 
   increment_id               UNSIGNED INTEGER NOT NULL DEFAULT AUTOINCREMENT PRIMARY KEY,
   long_varchar_id            UNSIGNED INTEGER NOT NULL );
&lt;/pre&gt;&lt;/blockquote&gt;These deferrals are indefinite; the rows inserted in this table aren&#39;t needed until the Foxhound purge process is ready to delete unused rows in rroad_long_varchar. &lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; &quot;&gt;         ELSE

            -- Let the outer block handle the exception.

            RESIGNAL;

         END IF;

      END; -- handle exception

      &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;RETURN @existing_long_varchar_id;&lt;/SPAN&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The above RETURN finishes handling a matching row in the rroad_long_varchar table.&lt;br /&gt;
&lt;br /&gt;
The next section handles a new LONG VARCHAR value by inserting a new row in rroad_long_varchar:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; &quot;&gt;   ELSE -- @existing_long_varchar_id IS NULL

      BEGIN -- handle exception

         INSERT rroad_long_varchar (
            long_varchar_id, 
            reference_count,
            long_varchar )
         VALUES ( 
            DEFAULT,
            1,
            @new_long_varchar );
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;It is also possible that multiple almost-simultaneous calls to this function can reach this point with same LONG VARCHAR value.&lt;br /&gt;
&lt;br /&gt;
When that happens, the first execution of the above INSERT statement will work and &lt;b&gt;later executions will (correctly) fail&lt;/b&gt; with SQLCODE -196 &lt;i&gt;Index &#39;ux_long_varchar&#39; for table &#39;rroad_long_varchar&#39; would not be unique&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
The resulting exceptions are handled in the next section, by using recursive calls to this function to handle duplicate LONG VARCHAR values.&lt;br /&gt;
&lt;br /&gt;
The recursive calls will ( should :) work because they won&#39;t ( shouldn&#39;t :) reach this section of code.&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 800px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black; &quot;&gt;      EXCEPTION WHEN OTHERS THEN

         SELECT SQLCODE, SQLSTATE, ERRORMSG() 
           INTO @sqlcode, @sqlstate, @errormsg;

         IF @sqlcode = -196 THEN -- Index &#39;ux_long_varchar&#39; for table &#39;rroad_long_varchar&#39; would not be unique

            IF @is_recursive_call = &#39;N&#39; THEN

               -- Try a recursive call, and this time @existing_long_varchar_id IS NOT NULL.

               RETURN &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;rroad_get_long_varchar_id ( @new_long_varchar, &#39;Y&#39; );&lt;/SPAN&gt;

            ELSE

               -- This is already a recursive call, and it is still failing.

               CALL rroad_exception ( STRING ( 
                  @diagnostic_location, &#39;(454eh1) Unexpected error in recursive call to rroad_get_long_varchar_id: &#39;, 
                  &#39; SQLCODE = &#39;, @sqlcode,  
                  &#39;, SQLSTATE = &#39;, @sqlstate,  
                  &#39;, ERRORMSG() = &#39;, @errormsg ) );

               RESIGNAL;

            END IF;

         ELSE

            -- Let the outer block handle the exception.

            RESIGNAL;

         END IF;

      END; -- handle exception

      RETURN @@IDENTITY;

   END IF;

END IF;

END;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;H3 id=&quot;DELETE Changes&quot;&gt;DELETE Changes&lt;/H3&gt;In Foxhound 4, deleting old values of LastStatement and LastPlanText was easy: just DELETE the rroad_group_2_property_pivot rows holding those values.&lt;br /&gt;
&lt;br /&gt;
In Foxhound 5, LastStatement and LastPlanText are stored in rroad_long_varchar, and those rows can&#39;t be deleted until rroad_long_varchar.reference_count sinks to zero. &lt;br /&gt;
&lt;br /&gt;
That happens when enough rows in rroad_group_2_property_pivot are deleted to fire the following trigger enough times to force the reference_count down to zero:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;CREATE TRIGGER trd_rroad_group_2_property_pivot
   BEFORE DELETE ON rroad_group_2_property_pivot
   REFERENCING OLD AS old_rroad_group_2_property_pivot
   FOR EACH ROW
BEGIN

   -- Decrement rroad_long_varchar.reference_count as necessary.

   IF old_rroad_group_2_property_pivot.LastStatement_id &gt; 0 THEN
      UPDATE rroad_long_varchar
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;SET rroad_long_varchar.reference_count = rroad_long_varchar.reference_count - 1&lt;/SPAN&gt;
       WHERE rroad_long_varchar.long_varchar_id = old_rroad_group_2_property_pivot.LastStatement_id;
   END IF;

   IF old_rroad_group_2_property_pivot.LastPlanText_id&gt; 0 THEN
      UPDATE rroad_long_varchar
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;SET rroad_long_varchar.reference_count = rroad_long_varchar.reference_count - 1&lt;/SPAN&gt; 
       WHERE rroad_long_varchar.long_varchar_id = old_rroad_group_2_property_pivot. LastPlanText_id;
   END IF;

END;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;Note that it is possible for reference_count to sink below zero when rows are held in the rroad_long_varchar_deferred_increment table.&lt;br /&gt;
&lt;br /&gt;
The following code shows what happens in the Foxhound purge process after old rows in rroad_group_2_property_pivot have been deleted, and it is time to consider deleting old rows in rroad_long_varchar.&lt;br /&gt;
&lt;br /&gt;
The first section applies the deferred increments to the reference_count so the second section won&#39;t delete any rows in rroad_long_varchar that are still needed.&lt;br /&gt;
&lt;br /&gt;
Note that rows in the rroad_long_varchar_deferred_increment table are deleted as soon as they are used.&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 700px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-top: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;&quot;&gt;FOR f_fetch_deferred_increment AS c_fetch_deferred_increment INSENSITIVE CURSOR FOR
SELECT rroad_long_varchar_deferred_increment.increment_id    AS @increment_id,
       rroad_long_varchar_deferred_increment.long_varchar_id AS @long_varchar_id
  FROM rroad_long_varchar_deferred_increment
FOR READ ONLY
DO

   -- Apply and delete the deferred increment as an atomic operation.

   BEGIN ATOMIC 

      UPDATE rroad_long_varchar
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;SET rroad_long_varchar.reference_count = rroad_long_varchar.reference_count + 1&lt;/SPAN&gt;
       WHERE rroad_long_varchar.long_varchar_id = @long_varchar_id;

      DELETE rroad_long_varchar_deferred_increment
       WHERE rroad_long_varchar_deferred_increment.increment_id = @increment_id;

   END; 

   COMMIT;
           
END FOR;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The second section takes care of deleting rroad_long_varchar rows that are no longer referenced.&lt;br /&gt;
&lt;br /&gt;
Note that up to 100 Foxhound sampling process could be inserting data while the purge is running, and any one of them could insert new rows in rroad_long_varchar_deferred_increment; that&#39;s the reason for the AND NOT EXISTS predicate in the following FOR loop:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;min-width: 700px; margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-left: 1px solid black; border-right: 1px solid black; border-bottom: 1px solid black; &quot;&gt;FOR f_long_varchar AS c_long_varchar NO SCROLL CURSOR FOR
SELECT rroad_long_varchar.long_varchar_id   AS @long_varchar_id
  FROM rroad_long_varchar
 WHERE rroad_long_varchar.reference_count &lt;= 0
   AND rroad_long_varchar.long_varchar_id &gt; 0 -- don&#39;t delete empty row
   &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;AND NOT EXISTS ( SELECT *                  -- don&#39;t delete rows that have deferred increments&lt;/SPAN&gt;
                      FROM rroad_long_varchar_deferred_increment
                     WHERE rroad_long_varchar_deferred_increment.long_varchar_id 
                         = rroad_long_varchar.long_varchar_id )
 ORDER BY rroad_long_varchar.long_varchar_id
FOR UPDATE
DO

   DELETE rroad_long_varchar
    WHERE CURRENT OF c_long_varchar;

END FOR;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;Final&quot;&gt;Final Thoughts: Is This For You?&lt;/h3&gt;Before implementing string de-duplication in your application, run a test to remove duplicates to see if the savings are worthwhile.&lt;br /&gt;
&lt;br /&gt;
String de-duplication is worthwhile in Foxhound because a very large number of identical LONG VARCHAR strings are stored in the database. In other applications, where there are fewer duplicates and/or shorter strings, the advantage might not be so great, and alternatives like COMPRESS() might be better.&lt;br /&gt;
&lt;br /&gt;
Your application may already be taking advantage of the &lt;a href=&quot;https://help.sap.com/viewer/61ecb3d4d8be4baaa07cc4db0ddb5d0a/17.0/en-US/813efeff6ce21014baba89e87c758147.html&quot; target=&quot;_blank&quot;&gt;&quot;Blob Sharing&quot; feature built in to SQL Anywhere&lt;/a&gt; even though it &lt;i&gt;&quot;only occurs when you set values of one column to be equal to those of another column&quot;.&lt;/i&gt;&lt;br /&gt;
&lt;blockquote&gt;In other words, blob sharing only works when your application explicitly creates identical copies (UPDATE t column1 = column2) and it has no effect when your application creates new values separately with no reference to previous identical values.&lt;br /&gt;
&lt;/blockquote&gt;In Foxhound the code which searches for an existing string value uses a brute-force string comparison &quot;WHERE rroad_long_varchar.long_varchar = @new_long_varchar&quot; supported by an index&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;CREATE UNIQUE INDEX ux_long_varchar ON dba.rroad_long_varchar ( long_varchar );
&lt;/pre&gt;&lt;/blockquote&gt;but that might not perform well when dealing with giant LONG BINARY values. Although it wasn&#39;t the case with Foxhound, you may find an alternative method (e.g., comparing HASH() values) will perform better.&lt;br /&gt;
&lt;br /&gt;
The special exception handling might not be necessary for applications where collisions are unlikely; i.e., in other applications it might be OK to block and wait.&lt;br /&gt;
&lt;br /&gt;
String de-duplication didn&#39;t add much runtime overhead to Foxhound, but performing de-duplication on a large existing database can take a very long time; e.g., it can add hours to the process of upgrading a Foxhound 4 database to Foxhound 5.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/03/inside-foxhound-string-de-duplication.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5OFB3haRuQxXShM7oV5snmono3LZtcJfN8Khj0ogGxX8LDJK0XvRsSoH9FMCfpS-Eu0ZtkY7ddDuFVCSmfJY9DiQ4tMWfmA3miAwHwfUzVcVtWoyJ6DkWYiu-N7iDo8f3MVZTFeF8-Vw/s72-c/Figure+4.10+Rev+0.+Runaway+CPU+Usage+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-2066224057469573941</guid><pubDate>Fri, 28 Feb 2020 20:21:00 +0000</pubDate><atom:updated>2020-02-28T15:21:31.224-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>Dealing With Out-Of-Date Peaks</title><description>The Foxhound &quot;Peaks since&quot; line lets you jump directly to the most extreme value of each performance statistic on the History page; e.g., &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;28 Unsch Req&lt;/SPAN&gt;, &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;79 blocked connections&lt;/SPAN&gt;, &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;100% CPU&lt;/SPAN&gt; and so on:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzTj1mEZf18R3UvuqydKUafFJ14VKwrw0iZM8dAqIYrI7JnUfKz86yHPUQ2qm3sdsIOKelgZ3qPlIfHGA5fOND_tLwniZq40xde-z38gDzO3J4otVfyG-IGiiw9JUlPlhqxltUTqfHDXU/s1600/Image+1+Demo+Recalculate+Peaks+initial+recalculated+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;Over time, however, the Peaks line can become out-of-date when the Foxhound purge deletes old samples.&lt;br /&gt;
&lt;br /&gt;
For example, after the Purge deleted the sample with &lt;SPAN STYLE=&quot;border-bottom: 3px solid red;&quot;&gt;28 Unsch Req,&lt;/SPAN&gt; the Peaks line still showed that value but you could no longer click on it:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicDlxsjUkVXrDTCruRkjMahbb9VukuLIi6X6_lXA0rmdf8XkiteExihRDp8Isrik5GfYYlHqYEx828iVv2OCq0NnU8FiqwXXD7771GoNSK5BiLqNDLElsJ79rtl5wxEtBMT2v2x3JXz7U/s1600/Image+2+Demo+Recalculate+Peaks+purge+out+of+date+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;Foxhound 5&lt;/a&gt; now lets you refresh the Peaks line by calling &lt;a STYLE=&quot;border-bottom: 1px solid blue; color: blue;&quot; href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_adhoc_queries.html#RecalculatePeaks&quot; target=&quot;_blank&quot;&gt;the new rroad_recalculate_peaks() stored procedure&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The rroad_recalculate_peaks() procedure updates all the out-of-date peaks with clickable values; e.g.,&lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;13 Unsch Req:&lt;/SPAN&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh109eLRyOCpZ-drJ9moROZP6JQs7jfEc6xwLvgroVC9xeN51yl6K7cwzY9OgjS7lTA3J6C6E5PcvsXEXVcJOXfGzvgAZc4l_8Vw2l-qjHCpGwlzZaabp618VUnDIA9ZeSsAtSSa2CbqJc/s1600/Image+3+Demo+Recalculate+Peaks+purge+recalculated+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;&lt;b&gt;Tip:&lt;/b&gt; You must use the new shortcut Foxhound5 - 11 Admin Update via ISQL to call rroad_recalculate_peaks(). The default password is SQL, but you can change that; see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_administrator_authentication.html#How%20To%20Configure%20Authentication&quot; target=&quot;_blank&quot;&gt;this topic in the Help&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/dealing-with-out-of-date-peaks.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzTj1mEZf18R3UvuqydKUafFJ14VKwrw0iZM8dAqIYrI7JnUfKz86yHPUQ2qm3sdsIOKelgZ3qPlIfHGA5fOND_tLwniZq40xde-z38gDzO3J4otVfyG-IGiiw9JUlPlhqxltUTqfHDXU/s72-c/Image+1+Demo+Recalculate+Peaks+initial+recalculated+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-4632866427605233194</guid><pubDate>Wed, 26 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-26T03:00:00.413-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>DIY CREATE VIEW Statements In Foxhound 5</title><description>&lt;b&gt;Open access&lt;/b&gt; is a hallmark of Foxhound:&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: 1em; padding-bottom: 1em; border-top: 1px solid black; border-bottom: 1px solid black;&quot;&gt;Foxhound provides &lt;b&gt;read-only SQL&lt;/b&gt; access to all the historical data pertaining to your database: &lt;b&gt;it&#39;s your data, you own it&lt;/b&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;Foxhound Version 5&lt;/a&gt; extends that to include &lt;b&gt;CREATE VIEW&lt;/b&gt; and other DDL statements; here&#39;s what you can and cannot do: &lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;      no  CREATE EVENT
      no  CREATE EXISTING TABLE 
 yes      CREATE FUNCTION
      no  CREATE FUNCTION [External call]
 yes      CREATE INDEX
      no  CREATE MATERIALIZED VIEW
 yes      CREATE PROCEDURE
      no  CREATE PROCEDURE [External call]
      no  CREATE SEQUENCE
      no  CREATE SERVICE
 yes      CREATE TABLE
 yes      CREATE TEMPORARY PROCEDURE
      no  CREATE TRIGGER
      no  CREATE USER
 yes      CREATE VARIABLE [Connection-scope]
      no  CREATE VARIABLE [Database-scope] 
&lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt; yes      CREATE VIEW &lt;/SPAN&gt;
 yes      DELETE
 yes      INSERT
 yes      SELECT
 yes      TRUNCATE
 yes      UNLOAD
 yes      UPDATE

    Note that DELETE, INSERT, TRUNCATE and UPDATE statements 
         are allowed, but they&#39;ll only work on tables you create, 
         not the pre-existing Foxhound tables. 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;h3&gt;For Example: Active Alerts&lt;/h3&gt;&lt;br /&gt;
There are two definitions for &quot;Active Alert&quot;:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;An Alert that &lt;b&gt;is currently active&lt;/b&gt;, and &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;an Alert that &lt;b&gt;was active&lt;/b&gt; at some earlier point in time.&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;Adhoc queries for the first kind are easy; &lt;b&gt;there&#39;s a column for that&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;SELECT *
  FROM alert
 WHERE alert_is_clear_or_cancelled = &#39;N&#39; 
   AND sampling_id = 3;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;Foxhound 5 displays the second kind in the new &lt;b&gt;scroll to Active Alert&lt;/b&gt; drop-down shown in &lt;a href=&quot;http://sqlanywhere.blogspot.com/2020/02/scrolling-to-active-alerts-in-foxhound-5.html&quot; target=&quot;_blank&quot;&gt;this earlier blog post&lt;/a&gt;:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWbvBApKMDpBVF35nRlRbj-a-_Kimkiv7O6p_XZOOWP1H4xkqtTtmv2HUbCZ75_tMs_q7NyCJqggKJ0108w1qyjqZLGl2-7xl3cyO-1ucp5t5-JOQQ4M9mri14CfkuWiZhwD3SyQnPjuk/s1600/Image+Demo+Active+Alerts+drop+down+EDITED2.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;Here&#39;s prototype query for the same thing, using a proposed view named &quot;active_alert&quot;:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;SELECT alert_number,
       alert_title
  FROM active_alert
 WHERE sampling_id       =&lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt; 3 &lt;/SPAN&gt;
   AND sample_set_number =&lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt; 2726  &lt;/SPAN&gt;
 ORDER BY alert_occurrence DESC;

alert_number alert_title               
------------ ------------------------- 
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;   1 Database unresponsive &lt;/SPAN&gt;     
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;  16 I/O operations        &lt;/SPAN&gt;
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt;  13 File fragmentation    &lt;/SPAN&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;h3&gt;Do-It-Yourself: CREATE VIEW ADHOC.active_alert&lt;/h3&gt;With Foxhound 5 you can now CREATE your own views:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;CREATE VIEW ADHOC.active_alert AS
SELECT sample_header.sampling_id,
       sample_header.sample_set_number,
       alert.alert_occurrence,
       alert.alert_number,
       LEFT ( alert_title.alert_title, 25 ) AS alert_title,
       active_alert_range.clear_or_cancelled_locator_number
  FROM sample_header
          LEFT OUTER JOIN active_alert_range
                       ON active_alert_range.sampling_id                       =  sample_header.sampling_id
                      AND active_alert_range.active_locator_number             &lt;= sample_header.sample_set_number
                      AND active_alert_range.clear_or_cancelled_locator_number &gt;  sample_header.sample_set_number 
          LEFT OUTER JOIN alert
                       ON alert.alert_occurrence = active_alert_range.active_locator_number
          LEFT OUTER JOIN alert_title
                       ON alert_title.alert_number = alert.alert_number;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The Foxhound drop-down list box uses a query like this to display first two columns, and it also uses the third column (alert_occurrence) to implement the &quot;scroll to Active Alert&quot; feature:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;SELECT alert_number,
       alert_title,
       alert_occurrence
  FROM active_alert
 WHERE sampling_id       = 3 
   AND sample_set_number = 2726 
 ORDER BY alert_occurrence DESC;

alert_number alert_title                   alert_occurrence 
------------ ------------------------- -------------------- 
          13 File fragmentation                        2703 
         &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt; 16 I/O operations     &lt;/SPAN&gt;                      &lt;SPAN STYLE=&quot;background-color: yellow&quot;&gt; 2441 &lt;/SPAN&gt;
          13 File fragmentation                         155 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;For example, when the user clicks on &quot;#16 I/O operations&quot; the History page is scrolled to the Alert #16 on line 2441:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimJ1xF2RQvrU33dmYyuBpe_IcsBcmAxkcb0sHlhKGrK1xxgrtO_dituRVA1zCVphY6_qDcEdM7WcWTJAShpWFGBCgMZ5OjlKZiRbIvi4bWnXqHBekMyrlr3ZwVbwU61Ga34iHhZxSnObA/s1600/Image+scroll+to+Active+Alert+2441+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;When you use active_alert in your own adhoc queries, you have access to several columns including clear_or_cancelled_locator_number which tells you when (and if) each Alert became inactive.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s what the whole result set looks like:&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;SELECT *
  FROM active_alert
 WHERE sampling_id       = 3 
   AND sample_set_number = 2726  
 ORDER BY alert_occurrence DESC;

sampling_id    sample_set_number     alert_occurrence alert_number alert_title               clear_or_cancelled_locator_number 
----------- -------------------- -------------------- ------------ ------------------------- --------------------------------- 
          3                 2726                 2703            1 Database unresponsive                                  2745 
          3                 2726                 2441           16 I/O operations                                         2830 
          3                 2726                  155           13 File fragmentation                                     2829 
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The active_alert view is based on several views built-in to Foxhound:&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;pre style=&quot;margin: 0; padding: 1em; line-height: 1.2em; border-style: solid; border-width: 1px;&quot;&gt;active_alert_range   One row per alert containing from and to locator numbers and timestamps for 
                        the range of lines in the History page for which this Alert was active.
alert                One row per alert.
alert_cancelled      One row per alert cancellation; indirectly referenced by active_alert_range.
alert_title          One row for the text title corresponding to each Alert number.
all_clear            One row per alert all-clear; indirectly referenced by active_alert_range.
sample_header        One row for each sample recorded by the Foxhound Database Monitor, 
                        holding various server and database-level properties and computed columns.
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;For more information about writing and running adhoc SQL in Foxhound 5, see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_adhoc_queries.html&quot; target=&quot;_blank&quot;&gt;this chapter in the Help&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;&lt;br /&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/02/diy-create-view-statements-in-foxhound-5.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWbvBApKMDpBVF35nRlRbj-a-_Kimkiv7O6p_XZOOWP1H4xkqtTtmv2HUbCZ75_tMs_q7NyCJqggKJ0108w1qyjqZLGl2-7xl3cyO-1ucp5t5-JOQQ4M9mri14CfkuWiZhwD3SyQnPjuk/s72-c/Image+Demo+Active+Alerts+drop+down+EDITED2.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-4068232385899459666</guid><pubDate>Fri, 21 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-21T03:00:19.439-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>Scrolling to Active Alerts in Foxhound 5</title><description>&lt;blockquote&gt;&lt;img style=&quot;border-style: solid; border-width: 1px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgElG4FdJs4_3D0kshigMnUgfzjIEG-96a_BG4hTQEeYtdHjYyhGzaOEfIA1n2rG99bqXFj-y3-WKwH47W9ToGGmEG7ZmqfzC3e-L2KVLWKg9sPjFur2Y4brSNZtArBjN_LLj_q_20OGMc/s1600/Image+Demo+Active+Alerts+title+EDITED.jpg&quot; width=&quot;400&quot;&gt;&lt;/blockquote&gt;Alerts have always been a big deal in Foxhound... they&#39;re the main reason Foxhound sends emails, and they&#39;re the main reason people buy Foxhound.&lt;br /&gt;
&lt;br /&gt;
Alerts draw your immediate attention, but they&#39;re also important after-the-fact: &lt;b&gt;&quot;When did it happen, and why?&quot;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Prior to &lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;Foxhound Version 5&lt;/a&gt; the only way to find Alerts was to click on the &lt;b&gt;Message&lt;/b&gt; links on the History page.&lt;br /&gt;
&lt;br /&gt;
Sadly, that means &lt;b&gt;click click clicking&lt;/b&gt; through all the mismatches:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuZFQTyk8BkXZ5QP3h2DaPQz546o714PHY_nYXBafGesNorKvbS_d3lyjyXWi2IYA3UoUvwK1zaq6qISbuAnbLr_Ky7wOk-Oq21FdLhUIzeEzLzdVz9k1kJRv9uYjG-ih8-5b7vtdr_VQ/s1600/Image+Sample+History+Message+up+and+down+links+EDITED.jpg&quot; width=&quot;700&quot;&gt;&lt;/blockquote&gt;Foxhound 5 fixes that by keeping track of &lt;b&gt;Active Alerts&lt;/b&gt;, the zero or more Alerts that were in effect (not yet cleared or cancelled) at any particular point in time.&lt;br /&gt;
&lt;br /&gt;
For each row on the History page, the &lt;b&gt;Active Alerts drop-down list box&lt;/b&gt; shows you what was in effect: &lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdfiGQS3JPK9xerJ6mP6y98-RqViw1Cvor5ViKk29sGS6MThU5hzBu9hU-vNDBp7BEyylOO8zVIr6V-edbhpOi9yVjNbA5pziQ-ynKuxq9Ec0eGWF6Cm9MzYmNQBaP7NhhU-Li2bEQAAg/s1600/Image+Demo+Active+Alerts+drop+down+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;Now you can click on a link to go to &lt;b&gt;&quot;When did it happen?&quot;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/scrolling-to-active-alerts-in-foxhound-5.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgElG4FdJs4_3D0kshigMnUgfzjIEG-96a_BG4hTQEeYtdHjYyhGzaOEfIA1n2rG99bqXFj-y3-WKwH47W9ToGGmEG7ZmqfzC3e-L2KVLWKg9sPjFur2Y4brSNZtArBjN_LLj_q_20OGMc/s72-c/Image+Demo+Active+Alerts+title+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1807343028099330672</guid><pubDate>Wed, 19 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-19T03:00:02.462-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>The Unexpected Benefits Of Conn Flags Count</title><description>&lt;blockquote&gt;&lt;img style=&quot;border-style: solid; border-width: 1px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hMOMdfBtgYIKM0S8ue7V9KwDJY7KhouCk2499aKW1UFb92YWZMN0EiX5dSKXCf0yWEKtDGUHiB94vVZbNm49PDeOvKlHHEM3DxyJpBMRfICXw3-6Hbbz5lN0y8-PYhpxRoeS8AhzjyA/s1600/Image+Demo+Conn+Flags+Count+column+title+EDITED.jpg&quot; width=&quot;300&quot;&gt;&lt;/blockquote&gt;Some &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_monitor_options.html#options_17_flag_criteria&quot; target=&quot;_blank&quot;&gt;Foxhound 5 connection flags&lt;/a&gt; are more important than others, like &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_monitor_options.html#f009&quot; target=&quot;_blank&quot;&gt;#9 - Long uncommitted&lt;/a&gt;:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO3zNM8v3KfK_6ZZHCqpCx6EuSBMSBHjxiFcje5ZAHMWJM1PLF7XzbVoL3MrGjiWW_UA6GXJ7U-hX3y2B4lL_A4AD9TVhlQBGxFq4rNY-BOCgomof7saWRssZ48iKqWyJelih0SDMDwaE/s1600/Image+Demo+Conn+Flags+9+-+Long+uncommitted+EDITED2.jpg&quot; width=&quot;800&quot;&gt;&lt;br&gt;&lt;b&gt;Performance Tip&lt;/b&gt;: This Flag is useful if you want to be warned when a single connection is &lt;b&gt;sucking all the air out of the room&lt;/b&gt;; i.e., when a long-running transaction has a performed a large amount of work that is not yet committed to the database.&lt;/blockquote&gt;Other connection flags might not be so important, especially if they appear for single connections. For example, &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_monitor_options.html#f015&quot; target=&quot;_blank&quot;&gt;Connection Flag #15 - Index add rate&lt;/a&gt; might just mean one connection is doing a bit more work than normal.&lt;br /&gt;
&lt;br /&gt;
But what if many connections each have one flag set, or worse, &lt;b&gt;what if many connections have many flags?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;That&#39;s where Conn Flags Count comes in&lt;/h3&gt;At the database sample level, &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_history.html#multi_Flags&quot; target=&quot;_blank&quot;&gt;Conn Flags Count&lt;/a&gt; is the total number of connection flags set across all connections for one sample; large values will draw your attention to &lt;b&gt;where there may be many bottlenecks&lt;/b&gt;:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4Z3ADv1nn2rbyY7L-wDrumE1lA7O9WAmsQZYMT5gH0GMNkYttZtA-VwXaejxyutY6KUEOWusQHn8zWSymk5Njs9pXRz-TQb0WUhERcPy2uirImiSkkRkBjA5MHwLMZ0ABClzi6vCSPWg/s1600/Image+Demo+Conn+Flags+Count+Samples+and+Messages+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;At the connection level, &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_history.html#conn_conn_flags_count&quot; target=&quot;_blank&quot;&gt;Conn Flags Count&lt;/a&gt; is the number of connection flags set for one connection. You can sort the connections to &lt;b&gt;bring the interesting connections to the top&lt;/b&gt;:&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBA7Q0AIt6QYEETSl9oQ_0Wk-7PadWh725VVfGelV_MnpiZ9fEbAIwy_y3tvqyhxhphosu4UfpWI51XtoqnKnt6D1I_mUX2zd3bGQG7uom2D7RpbHUpmfe64Du0V6QH2ZfeID77b4o7II/s1600/Image+Demo+Conn+Flags+Count+Connectios+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;&lt;h3&gt;Conn Flags Count Was An Afterthought&lt;/h3&gt;When the Connection Flags feature was first added to Foxhound 5, &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;the flags_set_count column wasn&#39;t displayed, &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;then it was displayed in the Connections section because &quot;if it&#39;s worth calculating, it&#39;s worth showing&quot;, &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;then it was made sortable because &quot;if it&#39;s worth showing, it&#39;s worth sorting&quot;, &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;then the Samples &amp; Messages section got its own Conn Flags Count, &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;and the &lt;b&gt;Peaks&lt;/b&gt; row got one too:&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnEADwr_BAdr3pCOKd44A9rKD1j2ysTbjokliGzzKTkueAuNpAGa332cdMce6Dv1GIx3v5ondOxgVz3gOgtvtS5sTvdT6-wpt0qCi0Kjy4O_k4vU2NW8xNU9AhJ_4C_VZV87dbFaQAHkc/s1600/Image+Demo+Conn+Flags+Count+Peak+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;/blockquote&gt;Now Conn Flags Count has become a valuable feature in its own right.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/the-unexpected-benefits-of-conn-flags.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_hMOMdfBtgYIKM0S8ue7V9KwDJY7KhouCk2499aKW1UFb92YWZMN0EiX5dSKXCf0yWEKtDGUHiB94vVZbNm49PDeOvKlHHEM3DxyJpBMRfICXw3-6Hbbz5lN0y8-PYhpxRoeS8AhzjyA/s72-c/Image+Demo+Conn+Flags+Count+column+title+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-5464331006547682242</guid><pubDate>Mon, 17 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-17T03:00:01.219-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">server setup and admin</category><title>Mini-Backups in Foxhound 5</title><description>&lt;b&gt;Quick! When was the last time you backed up your Foxhound database?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
If you answered &quot;never&quot; that&#39;s OK, &lt;b&gt;you shouldn&#39;t have to&lt;/b&gt;... a tool like Foxhound should look after its own backups.&lt;br /&gt;
&lt;br /&gt;
And now &lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;Foxhound Version 5&lt;/a&gt; does just that:&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 1em; border-style: solid; border-width: 1px;&quot;&gt;Every time you change any options and settings, Foxhound creates a &quot;mini-backup&quot; containing just those options and settings.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;Mini-backup files don&#39;t take up much space because they don&#39;t contain any sample data:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAV2wrv9jLe7JpWltPvC253yD2k7jYFPC29LyZZYr6BReIJmqLAcGSAhAUfBolQYwuk8rv5iI3ZzPYiYwCOCKXA79iSl88RS1OgVhYLO9b2MrpqheLwvxaz12tMGrUMAda7b9gqoCX-7o/s1600/Image+Demo+Mini-Backup+Mini-Restore+backup+subfolder+EDITED.jpg&quot; width=&quot;600&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;To restore from a Mini-Backup file, click on the Foxhound Windows shortcut &lt;b&gt;9 Mini-Restore&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZGvFSOpQ1lnC-D4Xv9ggrXRJNBB5L5hwFodn7ZsT5WjQVsx7EK2RNuk_By1MAAO2dQr6dV0SDBkWHD8iB5ZcR2I-WcRap5157TEg0vDrXSGUwOcRvRPCUZHYeOn2Uff0U5vDTASJw2eM/s1600/Image+Demo+Mini-Backup+Foxhound5+-+9+Mini-Restore.jpg&quot; width=&quot;400&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;The Mini-Restore starts by opening the Activation page on an &lt;b&gt;empty copy&lt;/b&gt; of the Foxhound database:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOM0-qmIS2hxHON6GBaJSXiLjnSiTPMawbl1qSX_EwjkFL3eiQn8O6_AjufG7RuboB3xRLlE4aVR0OZnMtekWxEuT6LIw9qmJJKAqpACgX-aPaOQUSN-U99MHVVnurPCuQaVs0FR2rv64/s1600/Image+Demo+Mini-Backup+Mini-Restore+Option+2+Activate+EDITED.jpg&quot; width=&quot;600&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;Use &lt;b&gt;Option 2&lt;/b&gt; to pick a mini-backup file and then click on Run Mini-Restore.&lt;br /&gt;
&lt;br /&gt;
The next thing you&#39;ll see is sampling up and running again:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizyEzaOy51G_r3BJqJ9EJsTZxy3y71rKkm9IkoAE7uEfJT5PpWLA8zZNgT6O01Q9S-QjwW00E0z4Ne22cEOuV2-ynSPG0BIWNiqNDlNRBU2ThIA6asGWJTj3l9p_JEBrEuIF8Md1dEAdc/s1600/Image+Demo+Mini-Backup+Mini-Restore+History+after+Mini-Restore+EDITED.jpg&quot; width=&quot;400&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;All the old monitor samples are gone, but &lt;b&gt;all your intellectual property&lt;/b&gt; (the options and settings) has been restored.&lt;br /&gt;
&lt;br /&gt;
For more information see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_introduction.html#mini_backup&quot; target=&quot;_blank&quot;&gt;Mini-Backup&lt;/a&gt; and &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_introduction.html#mini_restore&quot; target=&quot;_blank&quot;&gt;Mini-Restore&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/mini-backups-in-foxhound-5.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAV2wrv9jLe7JpWltPvC253yD2k7jYFPC29LyZZYr6BReIJmqLAcGSAhAUfBolQYwuk8rv5iI3ZzPYiYwCOCKXA79iSl88RS1OgVhYLO9b2MrpqheLwvxaz12tMGrUMAda7b9gqoCX-7o/s72-c/Image+Demo+Mini-Backup+Mini-Restore+backup+subfolder+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-3177644603514628526</guid><pubDate>Wed, 12 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-12T03:00:00.520-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><category domain="http://www.blogger.com/atom/ns#">performance and tuning</category><title>Read-Only Browser Mode In Foxhound 5</title><description>Until now, Foxhound has lacked &lt;b&gt;any&lt;/b&gt; form of browser login or authentication...&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 1em; border-style: solid; border-width: 1px;&quot;&gt;Anyone who can open Foxhound in a browser can &lt;b&gt;see (and do) everything&lt;/b&gt; offered by Foxhound.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;The SQL Anywhere Monitor requires a user name and password to login but unless you work hard at &lt;a href=&quot;https://help.sap.com/viewer/61ecb3d4d8be4baaa07cc4db0ddb5d0a/17.0/en-US/812babe06ce21014ae2df0bf4041b033.html&quot; target=&quot;_blank&quot;&gt;changing passwords and creating users&lt;/a&gt;, it behaves much the same as Foxhound prior to Version 5...&lt;br /&gt;
&lt;blockquote&gt;&lt;table style=&quot;margin: 0; padding: 0;&quot;&gt;&lt;tr&gt;&lt;td style=&quot;margin: 0; padding: 1em; border-style: solid; border-width: 1px;&quot;&gt;Anyone can use admin / admin to &lt;b&gt;see (and do) everything&lt;/b&gt; offered by the SQL Anywhere Monitor.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;Foxhound Version 5&lt;/a&gt; now offers a new and different form of browser login. It&#39;s called &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_administrator_authentication.html&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;&quot;Administrator Authentication&quot;&lt;/b&gt;&lt;/a&gt; and it has these characteristics:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;It&#39;s &lt;b&gt;optional&lt;/b&gt;, you can turn it on and off, and the default is &quot;no login required, for anything&quot;.&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;It implements &lt;b&gt;two modes&lt;/b&gt; of operation...&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Read-Only mode&lt;/b&gt; allows everyone to see everything but not change anything, and &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Administrator mode&lt;/b&gt; requires a username and password to update Foxhound options and settings.&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9-ulCaKiBazptRovAm39ivg3lj9el30YKzKflEKGWvu6zZV6H4Eufxa_pSvNzD4IjpZ7ebBjM2SlOFzzI1w_vmfCG5bGWCMkFNP6MKWoFLhQKPj6Y2RcmQqtw-VQ7g6D1TMgPqpVCCwo/s1600/Image+Administrator+Authentication+Login+as+Foxhound+Administrator+EDITED.jpg&quot; width=&quot;500&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;An &lt;b&gt;unlimited&lt;/b&gt; number of browser sessions may use Read-only mode, with no user name or password required.&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;Only &lt;b&gt;one&lt;/b&gt; browser session at a time can use Administrator mode.&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;A browser session will remain logged in to Administrator mode until&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;the session or cookie &lt;b&gt;times out&lt;/b&gt; (default 12 hours),&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;the logged-in user clicks &lt;b&gt;Logout&lt;/b&gt;, or &lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;some other session logs in&lt;/b&gt; to Administrator mode, which silently logs out the session already logged in.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;
&lt;/ol&gt;For more information see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_administrator_authentication.html&quot; target=&quot;_blank&quot;&gt;Administrator Authorization in Foxhound 5&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/read-only-browser-mode-in-foxhound-5.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9-ulCaKiBazptRovAm39ivg3lj9el30YKzKflEKGWvu6zZV6H4Eufxa_pSvNzD4IjpZ7ebBjM2SlOFzzI1w_vmfCG5bGWCMkFNP6MKWoFLhQKPj6Y2RcmQqtw-VQ7g6D1TMgPqpVCCwo/s72-c/Image+Administrator+Authentication+Login+as+Foxhound+Administrator+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1841070443306832406</guid><pubDate>Mon, 10 Feb 2020 08:00:00 +0000</pubDate><atom:updated>2020-02-10T03:00:00.472-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Server Messages: Another Release-Defining Feature in Foxhound Version 5</title><description>From time to time the SQL Anywhere server sends important error, warning and diagnostic messages to three separate destinations:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;the &lt;b&gt;&quot;server console&quot;&lt;/b&gt; window. . . unless that window doesn&#39;t exist because the server was started as a Windows service,&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;the text file named in the &lt;b&gt;-o filename.txt&lt;/b&gt; option. . . unless that option was omitted from the server startup command line, and&lt;br /&gt;
&lt;p style=&quot;clear: both;&quot;&gt;&lt;/li&gt;

&lt;li&gt;result sets returned by &lt;b&gt;sa_server_messages()&lt;/b&gt;. . . if you call it.&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;The &lt;b&gt;capture and display&lt;/b&gt; of sa_server_messages() data is one of the features that makes &lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;Foxhound 5&lt;/u&gt;&lt;/a&gt; stand apart from previous versions. &lt;br /&gt;
&lt;br /&gt;
Foxhound merges server messages and monitor samples in descending order by timestamp, making it easy to see &quot;What else was going on?&quot; at any particular point.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s what server messages look like for a secondary (mirror) server that became the primary after a &lt;span style=&quot;background-color: yellow&quot;&gt;&amp;nbsp;failover&amp;nbsp;&lt;/span&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbQwMLn3SUz1GxDi7C8-BryA6QyABJ1jxN7qkivWk0RiOuNSO6lr7cR7txYyNsv4jt_kWBjbnKqcNKyXKkzWZBU-N2G0gSgvH1dZEswNePInObL1yhSzAPQEonp7avZyLIkjQJ_IFUQF8/s1600/Image+Server+Messages+Failover+partner2_server+now+running+as+primary+server+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;Your applications can write their own server messages, and they will appear in the Foxhound Monitor and History pages like this:&lt;br /&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;MESSAGE STRING ( &#39;INFO message&#39; ) TO CONSOLE;
MESSAGE STRING ( &#39;WARN message&#39; ) TYPE WARNING TO CONSOLE;
MESSAGE STRING ( &#39;ERR message&#39;  ) TYPE ACTION TO CONSOLE;

1:17:09 PM         &lt;SPAN STYLE=&quot;color: white; background-color: black;&quot;&gt; -- E. ERR message (2ms) &lt;/SPAN&gt;
1:17:09 PM         &lt;SPAN STYLE=&quot;color: white; background-color: black;&quot;&gt; -- W. WARN message (11ms) &lt;/SPAN&gt;
1:17:09 PM          -- I. INFO message (1m 53s) 
&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;For more information see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_history.html#server_messages&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;The Sample History Page - Server Messages&lt;/u&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/server-messages-another-release.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbQwMLn3SUz1GxDi7C8-BryA6QyABJ1jxN7qkivWk0RiOuNSO6lr7cR7txYyNsv4jt_kWBjbnKqcNKyXKkzWZBU-N2G0gSgvH1dZEswNePInObL1yhSzAPQEonp7avZyLIkjQJ_IFUQF8/s72-c/Image+Server+Messages+Failover+partner2_server+now+running+as+primary+server+EDITED.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-7183656888569312345</guid><pubDate>Thu, 06 Feb 2020 14:01:00 +0000</pubDate><atom:updated>2020-02-06T09:01:44.728-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Connection Flags: A Release-Defining Feature in Foxhound Version 5</title><description>Connection Flags are one of the features that make &lt;a href=&quot;http://www.risingroad.com/foxhound/index.html&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;Foxhound 5&lt;/u&gt;&lt;/a&gt; stand apart from previous versions. Connection Flags extend the usefulness of database-level Alerts and Peaks down into the nether regions of individual connections by letting you jump directly to connection samples that exhibit suspicious behavior.&lt;br /&gt;
&lt;br /&gt;
Previously, you could sort connection samples in descending order by &lt;b&gt;CPU time&lt;/b&gt; to bring high-CPU connections to the top of the list, and then sort on &lt;b&gt;Transaction Time&lt;/b&gt; to see long-running connections at the top, but not both at the same time.&lt;br /&gt;
&lt;br /&gt;
With Connection Flags you can sort on&amp;nbsp;&lt;SPAN STYLE=&quot;background-color: yellow;&quot;&gt;&amp;nbsp;Conn Flags Count&amp;nbsp;&lt;/SPAN&gt;&amp;nbsp;to see connections with Flag #5 - CPU usage, Flag #3 - Long transaction, and 28 other flags all sorted to the top if the list.&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh26h1u7A_Ms5AdoadfLXtzUFYAU38A40EfQwecXRx45GDtjgjReQ3HrljNC7uLj7LlB1JXj19fx3RSf5iRf8xZXWvgAK7UIOukopAxNG_RBmdGKWSyl4HxGX5YenQgxzZI2RP0diAGEqk/s1600/Image+Connection+Flags+3+Long+transaction+5+CPU+usage+EDITED.jpg&quot; width=&quot;800&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;For more information about Connection Flags see &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_monitor_options.html#options_17_flag_criteria&quot; target=&quot;_blank&quot;&gt;&lt;u&gt;section 17. Flag Settings in the Foxhound 5 docs&lt;/u&gt;&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/connection-flags-release-defining.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh26h1u7A_Ms5AdoadfLXtzUFYAU38A40EfQwecXRx45GDtjgjReQ3HrljNC7uLj7LlB1JXj19fx3RSf5iRf8xZXWvgAK7UIOukopAxNG_RBmdGKWSyl4HxGX5YenQgxzZI2RP0diAGEqk/s72-c/Image+Connection+Flags+3+Long+transaction+5+CPU+usage+EDITED.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-2843468602079131818</guid><pubDate>Tue, 04 Feb 2020 13:38:00 +0000</pubDate><atom:updated>2020-02-04T08:38:00.841-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>SQL Anywhere Is NOT Dead</title><description>&lt;hr&gt;&lt;br /&gt;
&lt;h3&gt;Is SQL Anywhere dead? &lt;br /&gt;
Not according to the SAP Store...&lt;/h3&gt;&lt;a href=&quot;https://www.sapstore.com/solutions/99017/SAP-SQL-Anywhere-%28v17%29&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA2sJo4OVNmIurLJoysEtf7YHpqZji96EgeGfds73NRy5bZjVycwYvXRlopZMTHe9rt6FGjr7NVGUWPezdJNdWMB9yE-ppI5Tkv7e5d4DKgW8N1_Oz8YoNzbZdrOMDGrKk0XIsrlY9E2E/s1600/SAP+Store+SQL+Anywhere.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Is SQL Anywhere dead? &lt;br /&gt;
Not according to SAP support...&lt;/h3&gt;&lt;a href=&quot;https://launchpad.support.sap.com/#/softwarecenter/template/products/_APP=00200682500000001943&amp;_EVENT=NEXT&amp;HEADER=Y&amp;FUNCTIONBAR=Y&amp;EVENT=TREE&amp;NE=NAVIGATE&amp;ENR=67837800100800005169&amp;V=MAINT&amp;TA=ACTUAL/SYBASE%20SQL%20ANYWHERE&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNHHMuNhfIidpwsLPCZrujIRDMvAF9BL7F-jqGUxgEFHwxMyq7p0tqqQaAsqmY-0-Sg_rKsRifG92OxPUjO8gubr-PyDXjzZvybg-msiRC6MDUMZvAUIeZBKvVW4Z5k6Eu4DP_OYbU-Uk/s1600/SAP+Software+Downloads+SQL+Anywhere+17.0.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Is SQL Anywhere dead?&lt;br /&gt;
Not according Novalsys...&lt;/h3&gt;&lt;a href=&quot;https://www.sqlanywhere.info/EN/sql-anywhere/try-sql-anywhere-source_adwsqla2.html?gclid=Cj0KCQiAvc_xBRCYARIsAC5QT9l7NbV2GHGAHns0rYhy-hXofNTIvZXWyVWeV0FoaQu2TmMGktKu9jMaAt5zEALw_wcB&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr2XpNmlG164lxVk056or50-D8Xq5InQKr8MhHC8g4kzG16RGouJFzTdbhemfaOmbUvsFOAqhdmZ8jKwAKnc56RqaBc1qMvaROHwODdbnFI0C3JJQIZXFGArG9kiGsm-RRLvKptTbJu_c/s1600/Novalsys+Try+SAP+SQL+Anywhere+17.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Is SQL Anywhere dead? &lt;br /&gt;
Not according to Foxhound...&lt;/h3&gt;&lt;a href=&quot;http://www.risingroad.com/&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFLJat0wR56U0al7qfOnpos2ruC9IyyGz3cdF2S6HdnsBP6LLbPQSLM-B-hW02Nv0Dvk12XPh12XHkm9jMa8bId-5EcfSt2sHMEBnIcoNml3TRiycvlLUrWrnKEUTl1FVFnDuuk1kvT6I/s1600/Foxhound+5+by+RisingRoad.jpg&quot; width=&quot;500&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;&lt;br /&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi33gpTObi-Qs1ySy5H22fNx6LObeMbnp3AhoVVlNmNstIc3Bzpkxc0Z9XJSVytekak1voRKaCMJ7DXBzhkBNbxnLgpHI5vnVnNNuDIWmVGksXwyO0Sxlg5HnJmOna2iwQCuthyO5i4BGM/s1600/The+internet+is+down.+I+can%2527t+get+at+my+data%2521+You+should+have+stayed+with+SQL+Anywhere.+Yes.jpg&quot; width=&quot;500&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/sql-anywhere-is-not-dead.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA2sJo4OVNmIurLJoysEtf7YHpqZji96EgeGfds73NRy5bZjVycwYvXRlopZMTHe9rt6FGjr7NVGUWPezdJNdWMB9yE-ppI5Tkv7e5d4DKgW8N1_Oz8YoNzbZdrOMDGrKk0XIsrlY9E2E/s72-c/SAP+Store+SQL+Anywhere.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-7374396787106878695</guid><pubDate>Sat, 01 Feb 2020 19:06:00 +0000</pubDate><atom:updated>2020-02-01T14:06:16.008-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Foxhound</category><title>Top Five Flaws In Foxhound</title><description>&lt;b style=&quot;font-size: large&quot;&gt;Do you see anything that looks familiar?&lt;/b&gt;&lt;br /&gt;
&lt;h3&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;#The transaction log is too big!&quot;          &gt;The transaction log is too big!&lt;/a&gt;&lt;p&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#The database is too big!&quot;                 &gt;The database is too big!&lt;/a&gt;&lt;p&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;#The purge doesn&#39;t work very well!&quot;        &gt;The purge doesn&#39;t work very well!&lt;/a&gt;&lt;p&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;#There&#39;s no Undo for Reset Peaks!&quot;         &gt;There&#39;s no Undo for Reset Peaks!&lt;/a&gt;&lt;p&gt;&lt;/li&gt; 
&lt;li&gt;&lt;a href=&quot;#Foxhound emails don&#39;t display properly!&quot;  &gt;Foxhound emails don&#39;t display properly!&lt;/a&gt;&lt;/li&gt; 
&lt;/ol&gt;&lt;/h3&gt;&lt;hr&gt;&lt;h3 ID=&quot;The transaction log is too big!&quot;&gt;1. The transaction log is too big!&lt;/h3&gt;&lt;br /&gt;
&quot;Too big&quot; is &lt;b&gt;too polite&lt;/b&gt; a term for a file that fills up the hard drive, and when you run the Purge it grows &lt;b&gt;even bigger&lt;/b&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/&quot; target=_blank&quot;&gt;&lt;u&gt;Foxhound Version 5&lt;/u&gt;&lt;/a&gt; solves this problem by adding -m &quot;Truncate Log On Checkpoint&quot; to the dbsrv17 command that starts Foxhound.&lt;br /&gt;
&lt;br /&gt;
Those two little characters &quot;-m&quot; have &lt;b&gt;two huge consequences&lt;/b&gt;: First, the transaction log is &lt;b&gt;wiped clean&lt;/b&gt; every single time Foxhound takes a checkpoint, and second, you can &lt;b&gt;no longer count&lt;/b&gt; on the transaction log being any use at all in a Foxhound database recovery strategy.&lt;br /&gt;
&lt;br /&gt;
If you care about a recovery strategy (and not everyone does) you&#39;re left with three choices:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Take the -m back out and &lt;b&gt;go back to however you used to deal&lt;/b&gt; with giant Foxhound transaction logs,&lt;p&gt;&lt;/li&gt;
&lt;li&gt;rely on full backups and &lt;b&gt;give up on restoring recent changes&lt;/b&gt;, or&lt;p&gt;&lt;/li&gt; 
&lt;li&gt;use the new &lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/foxhound5_help/foxhound_introduction.html#mini_backup&quot; target=_blank&quot;&gt;&lt;u&gt;Mini-Backup and Mini-Restore features&lt;/u&gt;&lt;/a&gt; to recover Foxhound options and settings... which is (probably) all you need.&lt;/li&gt; 
&lt;/ol&gt;&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi04Bk77lhebC8g4XftSzfEzLleUNuYsCDSgKTudpP6B7oqrfsQnSWH-6VJDANoZKxyGLq4pbIzuUdW21XawgmgMldI4C9JpWmQwxfs4GefEIndibEMyqRKUvzTyax9k68sSWl65rJzYmM/s1600/Image+Foxhound5+-+9+Mini-Restore.jpg&quot; width=&quot;500&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWDhMtnutqfEAHy-62OAlcUoSUKHWpDnXzkHwh-bvNpWVPeAdv66nDAVpul6BvLVjgWNz-_-WQ90fMsd1l_r3RWQiBWXCuCtknV6DWT0uws42WzlGflaJvhnKJ-QOHVJ_L1sEep3RafDg/s1600/Image+Activate+Foxhound+with+a+Mini-Restore.jpg&quot; width=&quot;700&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 103 Enhancement&quot; target=_blank&quot;&gt;Enhancement: The size of the transaction log is automatically limited by the dbsrv17 -m truncate log on checkpoint.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 109 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The transaction log is no longer available for restoring recent changes after restoring a backup.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 105 Feature&quot; target=_blank&quot;&gt;New Feature: The Mini-Backup process automatically backs up recent changes to Foxhound options and settings.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 106 Feature&quot; target=_blank&quot;&gt;New Feature: The Mini-Restore process restores your Foxhound options and settings into an empty foxhound5.db.&lt;/a&gt; &lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;hr&gt;&lt;h3 ID=&quot;The database is too big!&quot;&gt;2. The database is too big!&lt;/h3&gt;&lt;br /&gt;
The Foxhound database file grows at about 100K per monitored connection per hour, which means it gets &lt;b&gt;too big too fast&lt;/b&gt; when your database has a lot of connections.&lt;br /&gt;
&lt;br /&gt;
A lot of this space is used &lt;b&gt;by only two columns&lt;/b&gt;: Last Statement and Last Plan Text. &lt;br /&gt;
&lt;br /&gt;
Foxhound 5 uses a custom &lt;b&gt;string de-duplication&lt;/b&gt; process on these columns to reduce the database size by &lt;b&gt;a lot&lt;/b&gt;... sometimes half.&lt;br /&gt;
&lt;blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 60 Enhancement&quot; target=_blank&quot;&gt;Enhancement: String de-duplication has reduced the size of the Foxhound database file.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 195 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: It may take a very long time to upgrade all the data in a very large Foxhound 3 or 4 database.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 196 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The Foxhound database may contain a lot of free space after upgrading a very large database.&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;hr&gt;&lt;h3 ID=&quot;The purge doesn&#39;t work very well!&quot;&gt;3. The purge doesn&#39;t work very well!&lt;/h3&gt;&lt;br /&gt;
The original Foxhound Purge process was over-designed, which is a polite way to say it was badly designed.&lt;br /&gt;
&lt;br /&gt;
The Purge process in Foxhound 5 has been completely redesigned and rewritten, with all the &lt;strike&gt;stupid useless&lt;/strike&gt; fancy features removed, and a more aggressive approach taken to its primary purpose... which is to &quot;Delete data!&quot;&lt;br /&gt;
&lt;br /&gt;
You can set up a separate 24x7 schedule for the Purge, and there are special &quot;Hourly&quot; and &quot;Midnight&quot; buttons to make administration easier.&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjembFO7go-bDsA3v5k_4bNFDL5HfNcp4b_RKYCou-NyVMH574ITH-SP4mhdpopsv6wVvcyDGGH5oDqvOzyAIl-3rX7zEM5eN0arJYrfM7pKPAvsaKDEsWA0Rftvh2nbbvYZp3EMByS-w/s1600/Image+Foxhound+Options+Purge.jpg&quot; width=&quot;900&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 18 Feature&quot; target=_blank&quot;&gt;New Feature: The Foxhound purge process is now fast enough to keep up with database growth.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 27 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The &quot;Purge uninteresting connection data&quot; feature has been removed.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 28 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The Purge process no longer forces extra checkpoints while it is running.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 69 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: By default the Purge process starts once an hour, on the hour.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 101 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The purge process no longer puts &quot;Older samples purged at&quot; in the History page.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 108 Behavior Change&quot; target=_blank&quot;&gt;Behavior Change: The Purge process may now delete all samples from a stopped sampling session.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 105 Feature&quot; target=_blank&quot;&gt;New Feature: The Mini-Backup process automatically backs up recent changes to Foxhound options and settings.&lt;/a&gt; &lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 106 Feature&quot; target=_blank&quot;&gt;New Feature: The Mini-Restore process restores your Foxhound options and settings into an empty foxhound5.db.&lt;/a&gt; &lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;hr&gt;&lt;h3 ID=&quot;There&#39;s no Undo for Reset Peaks!&quot;&gt;4. There&#39;s no Undo for Reset Peaks!&lt;/h3&gt;&lt;br /&gt;
The &quot;Peaks since&quot; line is one of the most useful features in Foxhound. It lets you jump directly to the most extreme value of each performance statistic on the History page; e.g., to the highest CPU usage, largest Unscheduled Requests, highest Disk Reads and so on.&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQxZux9Qmw145RMwCDuJzl8LszNH_MOCOfsYi-XQaj8Ac-Mhu4v5qrV3NwnirPECcs4vRbt7mb7hdv8lJ4k6DcE4mvbZp09BVrDBcZnIugTNV1DJimpKa7g5X9rvgV4twZyV09yV3QmT4/s1600/Image+Peaks+since+EDITED.jpg&quot; width=&quot;900&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;When the Peaks line is no longer meaningful (say, after a server upgrade) the &quot;Reset Peaks&quot; button clears all the values and starts the peak calculation process over again.&lt;br /&gt;
&lt;br /&gt;
But... if you have ever pressed Reset Peaks &lt;b&gt;by accident&lt;/b&gt; you know what &quot;regret&quot; means.&lt;br /&gt;
&lt;br /&gt;
What you &lt;b&gt;want&lt;/b&gt; is an &quot;Undo&quot; button; what Foxhound 5 &lt;b&gt;gives you&lt;/b&gt; is a &quot;Recalculate Peaks&quot; procedure.&lt;br /&gt;
&lt;br /&gt;
Recalculate Peaks is actually &lt;b&gt;better than Undo&lt;/b&gt;: If the old Peaks line contained some values that are now obsolete because the corresponding samples have been deleted, Recalculate Peaks refreshes those values by only looking at samples which still exist.&lt;br /&gt;
&lt;blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 151 Enhancement&quot; target=_blank&quot;&gt;Enhancement: A procedure to recalculate the &quot;Peaks since&quot; row can be run via ISQL.&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;hr&gt;&lt;h3 ID=&quot;Foxhound emails don&#39;t display properly!&quot;&gt;5. Foxhound emails don&#39;t display properly!&lt;/h3&gt;&lt;br /&gt;
Over the years Foxhound has been plagued by random glitches in the way HTML emails are displayed in Google Mail and other browser-based email clients.&lt;br /&gt;
&lt;br /&gt;
Fixing individual symptoms didn&#39;t help because new and different glitches kept cropping up.&lt;br /&gt;
&lt;br /&gt;
To solve this problem once and for all, HTML emails in Foxhound 5 are &lt;b&gt;vastly simplified&lt;/b&gt; and the details are &lt;b&gt;delivered as attachments&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_z1Tr2Ace2do9Yoa9R3Ui5k3jAFxSdtszGp1FUbRMRVOBu9dk4qj3UYlvaNdjLiqF9qQSZ994bd94vYP-f5gJgQd_J5yG0hsM295mBPZLI5T6PmAlxU7sIeZ1yW4zhn51P2zn0_p3r4Y/s1600/Image+Email+Alert+%252311+ServerName+Change+Failover+primary_demo+to+parter2_server.jpg&quot; width=&quot;600&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXp0ZF-2NEG0E3baI2qiu7gnIJKpWwoS5maLevjvcwD5hrPPnme_IdLk_0fRwzkCyJ5AWG7GmkZVkjjpO9Nuh12iMSCrb0r30-szmr8o4DrnGcVxyf0U-2To5B5Vpgs5CWSs1e3KBY2SE/s1600/Image+Attachment+Alert+%252311+ServerName+Change+Failover+primary_demo+to+parter2_server.jpg&quot; width=&quot;900&quot;&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 177 Feature&quot; target=_blank&quot;&gt;New Feature: The Attach files to emails: checkbox has been added to the Monitor Options page.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 43 Enhancement&quot; target=_blank&quot;&gt;Enhancement: AutoDrop Notice emails have been enhanced to show connection-level sample data.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 44 Usability&quot; target=_blank&quot;&gt;Usability Improvement: AutoDropped connection messages now contain links to Connection History pages.&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.risingroad.com/foxhound-5-0/faq/FAQ-Whats-new-in-Foxhound-5.html#Change 40 Bug Fix&quot; target=_blank&quot;&gt;Bug Fix: Alert and AutoDrop emails have been changed to display properly in HTML browsers.&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;hr&gt;&lt;blockquote&gt;For more information see &lt;a href=&quot;http://www.risingroad.com/&quot; target=_blank&quot;&gt;Foxhound Version 5&lt;/a&gt;.&lt;br /&gt;
&lt;/blockquote&gt;&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/02/top-five-flaws-in-foxhound.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi04Bk77lhebC8g4XftSzfEzLleUNuYsCDSgKTudpP6B7oqrfsQnSWH-6VJDANoZKxyGLq4pbIzuUdW21XawgmgMldI4C9JpWmQwxfs4GefEIndibEMyqRKUvzTyax9k68sSWl65rJzYmM/s72-c/Image+Foxhound5+-+9+Mini-Restore.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-8751436501763454960</guid><pubDate>Sat, 25 Jan 2020 19:43:00 +0000</pubDate><atom:updated>2020-01-25T16:16:19.402-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">The fRiDaY File</category><title>Foxhound 5 Smoke Testing Underway</title><description>So far, so good . . .&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSzZ1Vvkwgz5rfBD1nX38Sgva6VGGQvvb42tLXwSr0VDkxU4UkReQAVDClAOfhnmOw5SC2EZFJDVqq-d6ZkiPSqlKAF9HMhZYPu4-T_Nc3Lgh83UPYUBmkzzujCwSdZiFCPhkQzJ6t9cM/s1600/Smoke+test+Pass.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSzZ1Vvkwgz5rfBD1nX38Sgva6VGGQvvb42tLXwSr0VDkxU4UkReQAVDClAOfhnmOw5SC2EZFJDVqq-d6ZkiPSqlKAF9HMhZYPu4-T_Nc3Lgh83UPYUBmkzzujCwSdZiFCPhkQzJ6t9cM/s320/Smoke+test+Pass.jpg&quot; width=&quot;320&quot; height=&quot;213&quot; data-original-width=&quot;750&quot; data-original-height=&quot;500&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;Smoke Test Alert Email Setup.txt
Smoke Test Alerts  1 Database unresponsive.txt
Smoke Test CPU High CPU runaway queries.txt
Smoke Test Foxhound As Service.txt
Smoke Test GUI all the installed shortcuts.txt
Smoke Test HA using HASETUP2-V17.txt
Smoke Test HTTPS for Foxhound on browser.txt
Smoke Test Mini-Backup and Mini-Restore.txt
Smoke Test OFSS on remote HA.txt
Smoke Test Target V5 on V6.txt
Smoke Test Targets V6 through V17.txt
Smoke Test Volume 1 Foxhound x 1 target x 1000 conns.txt

\\\\\ DONE TO HERE -- 2020 01 24 - 5.0.5432a - built at 2020 01 24 09:45 in a SQL Anywhere 17.0.9.4882 database created at 2020 01 24 09:45

RC49 Smoke Test Activate Upgrade Foxhound3 4386 2G SANITIZED.txt

RC51 Smoke Test Activate Upgrade Foxhound4 4740 unpatched 12G.txt
&lt;/PRE&gt;&lt;hr&gt;&lt;br /&gt;
&lt;br /&gt;
</description><link>http://sqlanywhere.blogspot.com/2020/01/foxhound-5-smoke-testing-underway.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSzZ1Vvkwgz5rfBD1nX38Sgva6VGGQvvb42tLXwSr0VDkxU4UkReQAVDClAOfhnmOw5SC2EZFJDVqq-d6ZkiPSqlKAF9HMhZYPu4-T_Nc3Lgh83UPYUBmkzzujCwSdZiFCPhkQzJ6t9cM/s72-c/Smoke+test+Pass.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-4534504701263276661</guid><pubDate>Mon, 06 Jan 2020 13:35:00 +0000</pubDate><atom:updated>2020-01-06T08:35:39.319-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">The fRiDaY File</category><title>Regression Testing</title><description>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgszOFXizz0CBLDYQ6MVByOfi6xiN1JFUBSh_58d89qOaydJV8GhACQVoembvSFBU9r1qBeTzCMMzjyt79PvVkGBJD3ovLzK6f2qe39TI-UYtZ0rLzJVIB-JOo2lUJW8mqMP6p0OSoGnU0/s1600/How+I+feel+about+a+fresh+problem+report+for+a+bug+fixed+five+years+ago.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgszOFXizz0CBLDYQ6MVByOfi6xiN1JFUBSh_58d89qOaydJV8GhACQVoembvSFBU9r1qBeTzCMMzjyt79PvVkGBJD3ovLzK6f2qe39TI-UYtZ0rLzJVIB-JOo2lUJW8mqMP6p0OSoGnU0/s1600/How+I+feel+about+a+fresh+problem+report+for+a+bug+fixed+five+years+ago.jpg&quot; data-original-width=&quot;612&quot; data-original-height=&quot;408&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/01/regression-testing.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgszOFXizz0CBLDYQ6MVByOfi6xiN1JFUBSh_58d89qOaydJV8GhACQVoembvSFBU9r1qBeTzCMMzjyt79PvVkGBJD3ovLzK6f2qe39TI-UYtZ0rLzJVIB-JOo2lUJW8mqMP6p0OSoGnU0/s72-c/How+I+feel+about+a+fresh+problem+report+for+a+bug+fixed+five+years+ago.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-1105933396325413318</guid><pubDate>Thu, 02 Jan 2020 17:51:00 +0000</pubDate><atom:updated>2020-01-02T12:51:06.746-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">The fRiDaY File</category><title>Enhanced User Testing</title><description>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRaBQQkHT2xf6bh5ziImzRKg4nBCv3S_OHYaqrR_ZELd2_b4icDV22Z3QVFUy3aGgw5zA_tokUgq_X8xu9Kr3RuSWN15UjC8M7VEZMBQ2s_tW8dtATlMPC3jmlcHR-KfZMwWFWCUDT_oI/s1600/How+it+feels+to+watch+a+user+test+your+product+for+the+first+time+2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRaBQQkHT2xf6bh5ziImzRKg4nBCv3S_OHYaqrR_ZELd2_b4icDV22Z3QVFUy3aGgw5zA_tokUgq_X8xu9Kr3RuSWN15UjC8M7VEZMBQ2s_tW8dtATlMPC3jmlcHR-KfZMwWFWCUDT_oI/s1600/How+it+feels+to+watch+a+user+test+your+product+for+the+first+time+2.jpg&quot; data-original-width=&quot;612&quot; data-original-height=&quot;408&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2020/01/enhanced-user-testing.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRaBQQkHT2xf6bh5ziImzRKg4nBCv3S_OHYaqrR_ZELd2_b4icDV22Z3QVFUy3aGgw5zA_tokUgq_X8xu9Kr3RuSWN15UjC8M7VEZMBQ2s_tW8dtATlMPC3jmlcHR-KfZMwWFWCUDT_oI/s72-c/How+it+feels+to+watch+a+user+test+your+product+for+the+first+time+2.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-497787815177352569.post-5750853435237033868</guid><pubDate>Mon, 30 Dec 2019 08:00:00 +0000</pubDate><atom:updated>2019-12-30T03:00:03.811-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">The fRiDaY File</category><title>Let&#39;s take that one step further</title><description>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPwwUgfRGGwMg_DL89N8DCDkKEnpKzdpSIWRUeMe7a5kgguKSM5gROJh2G6sFs-N_mJssAutrFvEDXWYWY83Rc-I2V4F6FJcg5NWwYFD_v1sLojB1uu6aZ3uKPSU-mfp61_5m0j7T0oFQ/s1600/There+is+no+bug+It+is+not+a+bug+you+see%252C+but+a+feature+you+don%2527t+understand+PART+1.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPwwUgfRGGwMg_DL89N8DCDkKEnpKzdpSIWRUeMe7a5kgguKSM5gROJh2G6sFs-N_mJssAutrFvEDXWYWY83Rc-I2V4F6FJcg5NWwYFD_v1sLojB1uu6aZ3uKPSU-mfp61_5m0j7T0oFQ/s320/There+is+no+bug+It+is+not+a+bug+you+see%252C+but+a+feature+you+don%2527t+understand+PART+1.jpg&quot; width=&quot;320&quot; height=&quot;240&quot; data-original-width=&quot;640&quot; data-original-height=&quot;480&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHxqOe3tD3H0OewoBM0erGXmd9nu7fG5i9dOKOxU_NNxSM7ATtpBLXGdQF04W2GKl09JmZ5YHA6_yIBsVxS6ctutZYStUzc7pQSzjQ10qVmuhAjXOsBP2ANiyZel1dbCDCg9mJeoYqA0/s1600/There+is+no+bug+It+is+not+a+bug+you+see%252C+but+a+feature+you+don%2527t+understand+PART+2.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGHxqOe3tD3H0OewoBM0erGXmd9nu7fG5i9dOKOxU_NNxSM7ATtpBLXGdQF04W2GKl09JmZ5YHA6_yIBsVxS6ctutZYStUzc7pQSzjQ10qVmuhAjXOsBP2ANiyZel1dbCDCg9mJeoYqA0/s320/There+is+no+bug+It+is+not+a+bug+you+see%252C+but+a+feature+you+don%2527t+understand+PART+2.jpg&quot; width=&quot;320&quot; height=&quot;235&quot; data-original-width=&quot;620&quot; data-original-height=&quot;455&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr&gt;</description><link>http://sqlanywhere.blogspot.com/2019/12/lets-take-that-one-step-further.html</link><author>noreply@blogger.com (Breck Carter)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPwwUgfRGGwMg_DL89N8DCDkKEnpKzdpSIWRUeMe7a5kgguKSM5gROJh2G6sFs-N_mJssAutrFvEDXWYWY83Rc-I2V4F6FJcg5NWwYFD_v1sLojB1uu6aZ3uKPSU-mfp61_5m0j7T0oFQ/s72-c/There+is+no+bug+It+is+not+a+bug+you+see%252C+but+a+feature+you+don%2527t+understand+PART+1.jpg" height="72" width="72"/><thr:total>0</thr:total></item></channel></rss>