Биты и байты.

Биты и байты.

среда, 8 апреля 2015 г.

Оптимизация производительности SQL Server 2012. Эпизод 1

 Оптимизация производительности обычно  выполняется по следующим характеристикам
  • Загрузка процессора
  • Использование памяти
  • Попадание в кэш
  • Дисковая подсистема
  • Оптимизация запросов
   Для  памяти  действует правило чем больше тем лучше,. Когда ее начинает не хватать повод 
   проверить чем же она забита. Об этом подробнее ниже.

    Управление памятью SQL Server.


Memory manager (ММ) является основным элементом, который управляет распределением памяти в SQL сервере. Данный компонент автоматически распределяет доступную SQL серверу память, снижая необходимость ручной настройки. После загрузки SQL ММ определяет первоначальный объем распределенной памяти и далее по мере изменения нагрузки динамически резервирует или освобождает оперативную память. Таким образом, ММ управляет взаимодействием SQL сервера с операционной системы в контексте управления памятью.
Основные комноненты:

1. Memory Clerks (Интерфейс, используемый потребителями для управления памятью, каждый потребитель имеет один или несколько клерков памяти ,используется для распределения, освобождения  и мониторинга использования памяти, каждый клерк связан с брокером  ,  sys.dm_os_memory_clerks)

2. Memory Objects (Кучи памяти, которые используют интерфейс клерков памяти чтобы получить доступ к page allocator для выделения страниц. Memory Objects не используют интерфейсы виртуальной или общей памяти, этот элемент использует только механизм распределения страниц. Многие компоненты SQL Server обращаются напрямую к MO, минуя клерки памяти. МО предоставляют возможность распределить диапазоны памяти произвольного размера.,  sys.dm_os_memory_objects)

3. Memory Nodes (Главная задача этого компонента состоит в определении области выделения памяти на узле NUMA,если памяти не хватает может быть выделена с соседнего узла , sys.dm_os_memory_nodes)

4. Memory Brokers (отслеживает запросы памяти от компонентов SQL и сопоставляет с текущими показатели её использования. Основываясь на полученной информации, брокер вычисляет «оптимальный» размер памяти, которая может быть распределена между компонентами. Брокер уведомляет компоненты о своих вычислениях, после этого каждый компонент использует эти сведения для дальнейшего использования памяти.)

5. Memory Pools (используется чтобы установить лимиты памяти,   internal - механизмы SQLOS, Default –пул по умолчанию для всего остального).

Более подробно все давно описано на хабре

среда, 18 февраля 2015 г.

Частичное обновление страницы. AJAX+ ASP.NET

Описание вызова ниже, пример взят отсюда  и немного модифицирован.



Aspx страница

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="jquery-1.3.2.min.js" type="text/javascript"></script>
    <script type = "text/javascript">
        function ShowCurrentTime() {
            $.ajax({
                type: "POST",
                url: "Default.aspx/GetDocStatus",
                data: '{name: "' + $("#<%=txtUserName.ClientID%>")[0].value + '" }',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: OnSuccess,
            failure: function (response) {
                alert(response.d);
            }
        });
    }
    function OnSuccess(response) {
       // alert(response.d);
        document.getElementById("demo").innerHTML = response.d;
    }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div style="height: 427px"/>
    Your Name :
    <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
    <input id="btnGetTime" type="button" value="Show Current Time"
        onclick = "ShowCurrentTime()" /><br />
        <asp:Label ID="LabelRefresh" runat="server" Text="Label"></asp:Label>
        <br />
        <br />
        <p id="demo">Результат</p>
    </form>
</body>
</html>

понедельник, 16 февраля 2015 г.

Достучаться до Firebird..

Понадобилось однажды быстро отчет сделать для смежного отдела, вроде все просто, но вся беда в том, что база находится на Firebird.
Это не проблема когда под рукой есть хороший провайдер.


В качестве решения было принято использовать SQL Server 2012 Express Advanced Services вместе со службой сервера отчетов.
Доступ к данным настраивался через связанный сервер.

  1. Для разработки понадобятся сам сервер Firebird , качаем нужную версию.
  2. Устанавливаем сервер вместе с клиентскими компонентами.
  3. Для работы с Firebird  понадобится IBExpert personal  - GUI оболочка для администрирования и выполнения скриптов. Качаем и устанавливаем.
  4. Триальная версия oledb провайдера IBProvider для изучения внутренней структуры базы.
  5. Инструкция по созданию связанного сервера  с использованием IBProvider. Читаем и настраиваем

! Обязательно проверяем соединение скриптом из инструкции выше,  клиентскую библиотеку fbclient.dll копируем в корень каталога windows.

      6.       После того как настроили все по инструкции проверяем соединение.

begin distributed transaction;
select * from FB_TEST...TEST_TABLE;
commit;

      7.      Если все хорошо приступаем к изучению базы по системным таблицам

--список всех таблиц
select rdb$relation_name
from FB_TEST...RDB$RELATIONS t
where rdb$view_blr is null
and (rdb$system_flag is null or rdb$system_flag = 0);

--список всех столбцов
select f.rdb$relation_name, f.rdb$field_name
from  FB_TEST...RDB$RELATION_FIELDS f
join  FB_TEST...RDB$RELATIONS r on f.rdb$relation_name = r.rdb$relation_name
and r.rdb$view_blr is null
and (r.rdb$system_flag is null or r.rdb$system_flag = 0)
order by 1, f.rdb$field_position;

--проверка индексов
SELECT RDB$INDEX_NAME
FROM FB_TEST...RDB$INDICES
WHERE RDB$RELATION_NAME='TEST_TABLE'
--AND RDB$UNIQUE_FLAG IS NULL
--AND RDB$FOREIGN_KEY IS NULL;          

--детальная информация по индексам
SELECT RDB$INDEX_SEGMENTS.RDB$FIELD_NAME AS field_name,
RDB$INDICES.RDB$DESCRIPTION AS description,
(RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION + 1) AS field_position
FROM FB_TEST...RDB$INDEX_SEGMENTS
LEFT JOIN FB_TEST...RDB$INDICES ON RDB$INDICES.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
LEFT JOIN FB_TEST...RDB$RELATION_CONSTRAINTS ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDEX_SEGMENTS.RDB$INDEX_NAME
WHERE UPPER(RDB$INDICES.RDB$RELATION_NAME)='TEST_TABLE'         -- имя таблицы
AND UPPER(RDB$INDICES.RDB$INDEX_NAME)='APC_TEST_TABLE' -- название индекса
AND RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE IS NULL
ORDER BY RDB$INDEX_SEGMENTS.RDB$FIELD_POSITION

P.S После того как необходимые запросы будут написаны и вы разберетесь со структурой базы, настраиваем связанный сервер  через ODBC качаем  с оф.  сайта провайдер

Настраиваем ODBC, системный DSN

Проверяем соединение.Переписываем запросы на OpenQuery если это необходимо и наслаждаемся!
SELECT *
FROM  openquery(fbnew,'select CH.FLASTNAME, CH.FFIRSTNAME , CH.FMIDDLENAME  ,CH.FID1, CH.FID0 from TEST_TABLE CH ')

вторник, 10 февраля 2015 г.

Шпаргалка JavaScript

Отличие == от ===
Оператор == сравнивает на равенство, а  ===  на идентичность, проверяя также и типы.

Небольшой справочник с примерами на Codeacademy
Книга хабра, выразительный Js
Объектная модель документа DOM
Уроки  DOM

Пример JavaScript, сложение 2х чисел

<html>
  <body>
    <p>Click the button to calculate x.</p>
    <button onclick="myFunction()">Try it</button>
    <br/>
    <br/>Enter first number:
    <input type="text" id="txt1" name="text1">Enter second number:
    <input type="text" id="txt2" name="text2">
    <p id="demo"></p>
    <script>
        function myFunction() {
            var y = document.getElementById("txt1").value;
           var z = document.getElementById("txt2").value;
            var x = +y + +z;
            document.getElementById("demo").innerHTML = x;
        }
    </script>
  </body>
</html>

Протестировать скрипт можно на jsbin.com
JQuery - библиотека для работы с DOM

<html>
<head>
    <title>jQuery Hello World</title>
    <script type="text/javascript" src="//code.jquery.com/jquery-1.11.2.min.js"></script>
</head>
<body>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#msgid").html("This is Hello World by JQuery");
        });
    </script>
    This is Hello World by HTML
    <div id="msgid">
    </div>
</body>
</html>

P/S
Много различных шпаргалок можно найти здесь

About