SQL Server Database System Tuning #38

Database tuning approach

  • Proactive approach
  • Reactive approach

Best Approach: Use a mix of both.

Be aware (collect information) of the followings that may have significant impact on the performance.
Hardware: Server, Available memory, number of processors, disk subsystems.

Network Infrastructure: Network Cards, Switches, and the rest of your LAN and WAN.

Operating System: Make sure the OpSys is optimally configured for SQL Server.

Database Engine: Know about the SQL Server Architecture and about your operational environments.

Database: Tune database properly

Client Connection: How clients connect to the server

Monitoring and Tuning Hardware: Use Network Monitor Agent, Performance Logs and Alerts, System Monitor, and Task Manager.

System monitor (perfmon.exe) is a great tool for the purpose Using perfmon.exe you can also find where the bottleneck is Processor Subsystem, Memory Subsystem, I/O Subsystem

Monitoring and Tuning SQL Server:Tools:

  • DBCC Commands
  • Dynamic Management Views
  • SQL Server Profiler
  • SQL Server Management Studio
  • System Stored Procedures
  • SQL Trace

System Monitor: when SQL server is installed many new parameters (performance objects and their counters) are added to System Monitor (perfmon.exe) that help to monitor SQL Server performance.

SQL Server Profiler: This tool is used to capture traces like client activities, stored procedure calls, lock activities. SQL server profiler can help to determine if the client application is at fault.

SQL Trace: create traces using using stored procedures.

Tuning the tempdb system database

  • Capacity plan and pre-allocate adequate space
  • Separate the log file from the database file
  • Use multiple secondary files for the tempDB system database
  • Use a faster disk
  • Use an appropriate RAID solution.
  • Use local disk sybsystem for tempdb.

Tuning Database Layout

Use file and filegroup architecture properly.
File: Use multiple data files for your databases.

Filegroups:example: create two file groups and place them in different drives. Create tables in one file group and create non-clustered indexes in the other. table I/O and Index I/O are now divided.

From: http://sitestree.com/?p=4810
Categories:38
Tags:
Post Data:2012-08-07 00:06:40

    Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
    (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
    In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
    <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
    8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
    Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
    Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>

Dynamic Management Views #38

Dynamic Management Views provide ways to analyze database performance and to find the cause behind bad-performing SQL server databases/instances. Bad performance can be due to: poor design, insufficient memory, poorly configured system, disk bottlenecks, poorly written queries and many others

Previously Windows System Monitor(perfmon.exe) and SQL server profiler were used to find the cause of bad-performance. Now, Dynamic Management Views can help a lot better.

Dynamic Management Views are categorized into 12 categories

  • Common language runtime:
  • Database: Provides details about database sizes, files used, and partition information.
  • Database mirroring related: About mirroring and mirroed databases
  • Execution related: Provides insight into query execution statistics.
  • Full text search: Provides information on full-text catalogs, indexes, full-text crawl memory buffer
  • Input/Output Related: Provides insights into I/O operations, I/O devices, and database file statistics.
  • Index related: Database file statistics
  • Query notification related: Insights into active query notifications subscriptions in the server
  • Replication related: Insights into the workings of replication in the database
  • Service Broker Related: Insights into the workings of Service Broker
  • Sql server operating system related: Insights into the internal operations of the SQL Server OS.
  • Transaction Related: Insights into the operations of active transactions

Performance Data Warehouse: A historical archive of periodic snapshots of the DMV data of interest. How can it help? the problem may occur only at night 3:00 a.m. and when there are not many users. If you want to fix the issue in the morning Performance Data Warehouse will be of great help.

From: http://sitestree.com/?p=4809
Categories:38
Tags:
Post Data:2008-12-05 20:21:03

    Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
    (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
    In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
    <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
    8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
    Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
    Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>

Scaling Out #38

Methods

  • SQL Server instances
  • Clustering
  • Database mirroring
  • Log shipping
  • Replication
  • Shared scalable databases
  • SQL Server instancesIn the same computer install multiple instance of SQL Server to take advantage of multiple processors. Each instance may use separate processor with separate lock manager, worker threads, tempdb system database.
  • ClusteringFailover Clustering can provide robustness and protection against failure. Clustering can provide scaling using spare hardware through passive nodes
  • Database mirroringWith database mirroring transaction logs are directly sent to the mirror. The mirror is up to date and can be used in case of failure of the principle server.
  • Log shippingIt depends on the transaction log backups, file copying. The secondary database need not to be updated in real time. The secondary database is read only and hence, be in great use for reporting purposes.
  • ReplicationMerge Replication: Both way, both from and to publishers and subscribers
    Transactional Replication: Publisher to the subscriber
  • Shared scalable databasesScale out a read-only database only for reporting purposes.
  • From: http://sitestree.com/?p=4806
    Categories:38
    Tags:
    Post Data:2007-05-23 02:02:25

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    Scalability: SQL Server 2005 #38

    Scalability: SQL Server 2005

    After you have optimized your database design and the application design, you can improve the scalability of SQL Server in two ways
    1.Scaling Up
    2.Scaling Out

    Scaling Up: Improve performance by
    1. Adding more processors, memory, and storage capacity

    2. Replacing existing hardware with faster hardware

    Note: You also need the right version of SQL Server so that scaling up is supported.

    How to scale up Processors:
    SQL Server is mostly I/O bound not CPU bound, still better/faster CPU usually provides better performance [depends on the application need though].

    Processor choices:32 bit
    64 bit x64
    64 bit IA64
    Hyperthread technology
    Multiprocessor based server
    Multicore based servers

    It is always better to go for 64 bit than 32 bit as it will also support more memory. 64 bit x64 processors provide better performance than ia64 however if your work requires lots of floating point operations and the workload needs > 8 processors you can think about IA64 processors

    Multiple processor systems provide better performance than the single processor systems. Windows implements SMP architecture of parallel computing and SQL Server 2005 also takes advantage of it.

    Multiple processor systems usually performs better than the equivalent multicore uniprocessor systems.

    Intel’s hyperthreading technology may increase performance (10-20%) based on the applications (but not always)

    Memory Subsystem:
    As SQL server is I/O bound using more memory almost always increases performance. Though the amount of memory that we can add depends on the operating systems. 32 bit operating systems supports 4GB RAM max. For 32 bit windows 2 GB is reserved for operating system, in Windows Server 2003 we can specify 1 gb for operating system so getting 3gb for SQL Server.

    32 bit SQL Servers can address 4 gb ram, the actual ram amount depends on the operating system used. if 32 bit windows then 2 to 3 gb max as mentioned before

    When 64 bit windows and 64 bit sql server then physical memory limits 32TB.

    I/O SubSystems:
    You can improve disk I/O subsystem by using an appropriate RAID array or SAN (Storage Area Network) solution

    Using Network Interface Card (NIC) teaming, you can also improve performance. NIC teaming allows to bond multiple physical NICs into one logical network device. Teaming provides load balance, fault tolerance, and high bandwidth.

    Scaling Out will be discussed later.

    Scaling Out involves using multiple SQL servers to provide increased scalability.

    From: http://sitestree.com/?p=4804
    Categories:38
    Tags:
    Post Data:2008-04-28 01:08:59

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    SQL Server Hints #38

    SQL Server Hints
    ----------------
    What are hints?
    
    Simply to influence query execution plans to retrieve data 
    faster.
    
    syscacheobjects
    ----------------
    SQL server after compiling a query creates the execution 
    plan and keeps it on syscacheobjects object.
    You can query the object to see the existing query plans as 
    follows:
    
    select * from sys.syscacheobjects
    where cacheobjtype='compiled plan'
    
    
    Hints
    -----
    
    When you specify hints in your queries the query execution 
    plans are biased toward your hints rather than using default
     strategies.
    
    Types of Hints
    --------------
    Join Hints: Affects the joins [join types]
    Query Hints: Affects overall execution plan
    Table: Affects to table access 
    
    
    Join Hints
    ----------
    Loops: Uses nesting for join. Each row of the inner table is
     checked for condition satisfaction with the corresponding 
    outer row.
    Hash: One table is treated as a hash table and the other is 
    scanned one row at a time and the hash function is used to 
    find equalities
    
    Merge: Each table is sorted first. Then they are compared 
    row by row [corresponding]
    
    Remote: In this case, at least one table is remote. The join
     is done at the right table side.
    
    
    Example:
    
    select *
    -----
    ----
    ---
    option (merge join)
    
    
    or
    
    select * 
    from x
    inner merge join y on...
    
    
    Query Hints:
    ------------
    Specified at the end of the query with keyword 'Option'
    
    
    select * from x
    ------------
    ------------
    option (recompile, fast 80)
    Hash Group or Order groups:  Aggregations (group by, compute, distinct) are done by hashing or ordering
    Concat Union, Hash Union, Merge Union: All unions will be done with the specified union type
    Loop Join, Hash Join, Merge Join: Joins will be done with the specified join types
    FAST number_rows:
    Force Order:
    MaxDop:
    Optimize For:
    Recompile:
    Keep Plan:
    Expand Views:
    
    
    
    Table Hints:
    ------------
    Affects how the table will be locked or which index will be 
    used for the query.
    NoEXPAND
    INDEX
    fastfirstrow
    nowait
    rowlockpaglock
    tablock
    nolock
    holdlock
    ignore_triggers
    
    
    Plan Guides
    -----------
    Sometimes queries are originated from a third part application and you have no control to change the query.
    You can use plan guides to influence such queries. For example: Using plan guides you can specify the nature of the
     select, update, insert queries.
    You can use built in stored procedures to create or drop 
    plan guides.
    
    sp_create_plan_guide
    sp_control_plan_guide
    

    From: http://sitestree.com/?p=4800
    Categories:38
    Tags:
    Post Data:2007-12-13 01:33:56

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    Connected Vehicles in Intelligent Transportation Systems (ITS)

    Connected Vehicles in Intelligent Transportation Systems (ITS)

    https://www.guide2research.com/special-issue/connected-vehicles-in-intelligent-transportation-systems-its

    Special Issues for Computer Science & Electronics Journals

    https://www.guide2research.com/special-issues/

    Top Major Computer Science and Electronics Conferences :

    https://research.com/

    "

    • Scholars from the United States are still dominating the ranking with 614 scientists representing 61.4% of all leading scientists. The other countries with leading positions in the ranking are the United Kingdom (60 scientists or 6%), China (41 scientists or 4.1%), Germany (37 scientists or 3.7%), Canada (34 scientists or 3.4%), and Switzerland (29 scientists or 2.9%).

    "

    Ref: https://research.com/news-events/world-ranking-of-top-computer-scientists-2021

    What are cursors? #38

    Cursors are server side database objects that are used by applications to apply operations on the database table data on a row-by-row basis. The operations may vary from one row to another row dynamically based on the requirements (business logic) and also multiple operations can be performed on the same row. Typical SQL commands apply the same updates/changes to all the selected rows at once where cursors apply updates/changes one by one row. Cursors must be declared in the database before they can be used/called from the applications [front end]. Afterwards, you can open cursors to fetch data using them, you can fetchrow by row and make multiple operations on the currently active row in the cursor. You should close the cursors and deallocate them after you are done with the cursors.This is the Transact-SQL Extended Syntax:DECLARE cursor_name CURSOR[LOCAL | GLOBAL][FORWARD_ONLY | SCROLL][STATIC | KEYSET | DYNAMIC | FAST_FORWARD][READ_ONLY | SCROLL_LOCKS | OPTIMISTIC][TYPE_WARNING]FOR select_statement[FOR UPDATE [OF column_name [,...n]]]An example cursor:DECLARE AuthorsCursor CURSOR FORSELECT authors.id, au_lname, au_fnameFROM authorsORDER BY authors.idAnother ExampleDECLARE @AuthorID char(11)  DECLARE Cursor1 CURSOR READ_ONLYFORSELECT au_idFROM authorsOPEN Cursor1FETCH NEXT FROM Cursor1INTO @AuthorIDWHILE @@FETCH_STATUS = 0BEGIN   PRINT @AuthorID FETCH NEXT FROM Cursor1 INTO @AuthorIDENDCLOSE Cursor1DEALLOCATE Cursor1wherecursor_name: The name of the server side cursorLOCAL: The cursor will be available only to the batch, stored procedure, or trigger in which the cursor was created GLOBAL: The cursor is global to the connection FORWARD_ONLY: The cursor can only fetch data sequentially STATIC: The cursor will use a temporary copy of the data instead of base tables KEYSET: Specifies keysets so that the membership and order of rows in the cursor are fixed when the cursor is opened DYNAMIC: The cursor reflects all data changes made to the base tables as you scroll around the cursor FAST_FORWARD: The cursor is FORWARD_ONLY and READ_ONLY  READ ONLY: The cursor [data] cannot be updatedSCROLL_LOCKS: The fetched data will be locked OPTIMISTIC: The cursor does not lock rows as they are read into the cursor select_statement: The standard select statement, cannot contain COMPUTE, COMPUTE BY, FOR BROWSE, and INTO keywordsUPDATE [OF column_name [,...n]]: Specifies which columns can be updated

    From: http://sitestree.com/?p=4795
    Categories:38
    Tags:
    Post Data:2011-07-27 22:47:54

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    How to optimize SQL Server Cursors #38

    Optimize Cursors
    1. Avoid using SQL Server cursors whenever possible
    2. Always close SQL Server cursors when result sets are not needed
    3. Deallocate SQL Server cursors when the data structures comprising the cursors are not needed
    4. Reduce the number of records to process in the cursor
    5. Only use the required columns in the cursors
    6. Use READ ONLY cursors, whenever possible, instead of updatable cursors.
    7. Avoid using insensitive, static and keyset cursors, whenever possible.
    8. Use FAST_FORWARD cursors, whenever possible.
    9. Use FORWARD_ONLY cursors, if you need updatable cursors

    From: http://sitestree.com/?p=4794
    Categories:38
    Tags:
    Post Data:2010-03-10 01:20:46

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    Database Administration : Random #39

    Vacuum:vacuum is a useful command to maintain PostGreSql database integrity. Also, it permanently removes deleted database records (by default PostGreSql does not delete permanently). It also rearranges page tables, segments for better performance. vacuum should be run regularly for optimized performance. You can also automate the execution.

    Syntax: vacuum [FULL|Analyze|Verbose|table name]
    Example:
    vacuum member verbose
    vacuum full
    vacuum analyze full

    vacuum also has linux command line command like
    vacuumdb dbname
    vacuum -a -f -v -z

    ——–

    PostGreSql maintains a list of databases in the pg_database system table. Sometimes when it/the table gets corrupted, a full vacuum on all databases may fix the issue. When the table gets corrupted many operations like pg_dump may not work and you may get error messages like missing entry in the pg_database table.

    ———-

    Backup command:
    pg_dump options dbname > destination txt/tar file

    Example: pg_dump -Ft -b mydb > db.tar

    Restore Command:
    Example: pg_restore -d newdb db.tar

    ————–

    Linux and PostGreSQL

    commands to access PostGreSql:
    su – postgres
    password:

    psql -l : list all databases

    ——–

    From: http://sitestree.com/?p=4805
    Categories:39
    Tags:
    Post Data:2012-09-16 12:23:46

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>
    

    Introduction to Printer Programming With Examples: Must Read #4

    You can use the functions/procedures/classes that a programming language provide to program a printer. Another alternative is, sending raw printing command to the printer itself. Each printer has their own instruction sets. Usually what happens, when you use built in functions they convert your procedure/function call to printer language and send it to the printer. They do it, using the printer driver

    You can do that by yourself by sending raw printer commands to the printer itself. Windows has an API called ‘Escape’ that can send raw texts/printer commands to the printers without using the driver. Now you need to know the language that the printer uses and use ‘Escape’ function to send raw print commands to the printer.

    I personally have working experience with intermec label printers. Intermec label printers support two different kinds of printer languages. IPL (Intermec printer Language) and DP (Direct Protocol). You need to check what your printer uses. The printers that use DP come with a tool named fingerprint installed on the printer itself. This fingerprint tool understand DP language and executes the printer in that way. Good thing is, fingerprint supports dynamic printing language that means you can use if then else, for, while etc in your printing language.

    An example DP program can be as follows:

    INPUT ON
    PRPOS 10, 1000
    PRTXT “hELLO hOW aRE yOU”
    PF
    LAYOUT RUN
    INPUT OFF

    YOU HAVE TO SEND THESE RAW PRINT COMMANDS USING THE ESCAPE FUNCTION.

    From: http://sitestree.com/?p=4719
    Categories:4
    Tags:
    Post Data:2007-03-18 00:05:38

        Shop Online: <a href='https://www.ShopForSoul.com/' target='new' rel="noopener">https://www.ShopForSoul.com/</a>
        (Big Data, Cloud, Security, Machine Learning): Courses: <a href='http://Training.SitesTree.com' target='new' rel="noopener"> http://Training.SitesTree.com</a> 
        In Bengali: <a href='http://Bangla.SaLearningSchool.com' target='new' rel="noopener">http://Bangla.SaLearningSchool.com</a>
        <a href='http://SitesTree.com' target='new' rel="noopener">http://SitesTree.com</a>
        8112223 Canada Inc./JustEtc: <a href='http://JustEtc.net' target='new' rel="noopener">http://JustEtc.net (Software/Web/Mobile/Big-Data/Machine Learning) </a>
        Shop Online: <a href='https://www.ShopForSoul.com'> https://www.ShopForSoul.com/</a>
        Medium: <a href='https://medium.com/@SayedAhmedCanada' target='new' rel="noopener"> https://medium.com/@SayedAhmedCanada </a>