24.02.2020

SQL: Получение списка запросов, ожидающих доступ к вычислительным ресурсам

Иногда запрос может выполняться очень долго, т.к. не может получить доступ к вычислительным ресурсам. Такое часто встречается при большом количестве одновременных обращений из разных источников. Получить список всех запросов, ожидающих доступ к ресурсам, в MS SQL Server можно следующим образом:
SELECT  wt.session_id, 
        ot.task_state, 
        wt.wait_type, 
        wt.wait_duration_ms, 
        wt.blocking_session_id, 
        wt.resource_description, 
        es.[host_name], 
        es.[program_name] 
FROM  sys.dm_os_waiting_tasks  wt  
INNER  JOIN sys.dm_os_tasks ot ON ot.task_address = wt.waiting_task_address 
INNER JOIN sys.dm_exec_sessions es ON es.session_id = wt.session_id 
WHERE es.is_user_process =  1 

SQL: Остановка длительных запросов

Если база данных является высоконагруженной и работает в конкурентном окружении, то достаточно часто возникает задача остановки длительных запросов, если они мешают выполнению других запросов. Приведу здесь наиболее популярные конструкции для поиска и удаления запросов.
  1. Получение списка всех активных сессий вместе с учетными записями, под которыми они запущены:
    SELECT conn.session_id, host_name, program_name,
        nt_domain, login_name, connect_time, last_request_end_time 
    FROM sys.dm_exec_sessions AS sess
    JOIN sys.dm_exec_connections AS conn
       ON sess.session_id = conn.session_id
    
  2. Получение списка всех запущенных запросов с индентификатором открытой сессии и временем запуска:
    SELECT  sqltext.TEXT,
            req.session_id,
            req.status,
            eq.start_time,
            req.command,
            req.cpu_time,
            req.total_elapsed_time
    FROM sys.dm_exec_requests req
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
    
  3. Получить информацию о том, какие активные соединения в настоящее время установлены с SQL Server, можно так:
    sp_who2 'active'
    
  4. Завершение пользовательского процесса по идентификатором сеанса:
    KILL 'your_session_id'
    

16.02.2020

Ошибка "Package is not found in the following primary source(s): 'https://api.nuget.org/v3/index.json"

Периодически приходится собирать nuget-пакеты и выкладывать их на nuget.org. После публикации попытался обновить библиотеку и получил ошибку "Package 'your package' is not found in the following primary source(s): 'https://api.nuget.org/v3/index.json". При этом в хранилище пакетов гарантирована была необходимая версия в состоянии Listed.
Причина проблемы оказалось в некорректном кэшировании списка доступных пакетов в Visual Studio. Для устранения проблемы нужно просто почистить кэш nuget. Для этого нужно выполнить следующий набор действий: Tools -> Nuget Package Manager -> нажать кнопку Clear All NuGet Cache(s).

11.10.2019

C#: Running a program in a single instance

Sometimes you need to run your program just in a single instance. For example it can happen when you use some resources which can not be shared (devices, databases or something else). In this case the following method of running your program can help:
class Program
{
     static void Main(string[] args)
     {
          bool existed;
          // obtaining application GIUD
          string guid = Marshal.GetTypeLibGuidForAssembly(Assembly.GetExecutingAssembly()).ToString();

          Mutex mutexObj = new Mutex(true, guid, out existed);

          if (existed)
          {
               Console.WriteLine("Application is already running");
          }
          else
          {
               Console.WriteLine("This is the first instance of this application.");
          }

          Console.ReadLine();
     }
}

04.09.2019

Python: Online IDE

Бывают ситуации, когда нет возможности установить на компьютер необходимую среду разработки (например, из-за ограничений политик безопасности компании) или нужно проверить идею. В этом случае могут помочь облачные IDE. Здесь приведен список наиболее популярных сервисов, поддерживающих Python, хотя некоторые из них могут использовать и другие языки:
  1. repl.it
  2. sourcelair.com - также поддерживает js.
  3. jupyter.org/try - один из самых популярных редакторов. Позволяет использовать не только Python, но и R, C++, Ruby и Scheme.

C#: Поиск элементов в списке строк без учета регистра

Небольшое, но полезное расширение для List<string>, позволяющее осуществлять поиск элементов в списке строк без учета регистра:
public static bool Contains(this string target, string value, StringComparison comparison)
{
    return target.IndexOf(value, comparison) >= 0;
}

23.07.2019

SQL: получение информации о всех таблицах

При проектировании больших баз данных я всегда стараюсь давать всем таблицам максимально понятные названия, а также, если это позволяет сделать БД, создавать описания к таблицам. Это очень удобно, когда таблиц становится очень много, а ты сам уже начинаешь забывать для чего та или иная таблица, а также при введении в курс дел нового разработчика. Однако прокликивать все таблиц, чтобы прочитать описание, очень не удобно. В рамках MS SQL Server может быть удобен следующий скрипт, который выводит список названий таблиц, их схему, дату создания и дату последнего изменения таблицы, а также количество записей и описание:
SELECT schema_name(tab.schema_id) as schema_name,
       tab.name as table_name, 
       tab.create_date as created,  
       tab.modify_date as last_modified, 
       p.rows as num_rows, 
       ep.value as comments 
FROM sys.tables tab
    INNER JOIN (SELECT DISTINCT 
                        p.object_id,
                        sum(p.rows) rows
                FROM sys.tables t
      INNER JOIN sys.partitions p on p.object_id = t.object_id 
                GROUP BY p.object_id, p.index_id) p
        on p.object_id = tab.object_id
    LEFT JOIN sys.extended_properties ep 
        on tab.object_id = ep.major_id
        and ep.name = 'MS_Description'
        and ep.minor_id = 0
        and ep.class_desc = 'OBJECT_OR_COLUMN'
ORDER BY schema_name, table_name
Иногда нужно просто получить список таблиц и количество записей в них, для этого можно воспользоваться более простым скриптом:
SELECT o.NAME, i.rowcnt 
FROM sysindexes AS i
 INNER JOIN sysobjects AS o ON i.id = o.id 
WHERE i.indid < 2  AND OBJECTPROPERTY(o.id, 'IsMSShipped') = 0
ORDER BY o.NAME