четверг, 24 мая 2012 г.

Конвертирование видео G2M3/G2M4

Нашел наконец рецепт, позволяющий сконверитировать видео gotomeeting
для просмотра на linux системах.
Проблема этого рецепта в том что он (рецепт) под windows.
Суть следующая:

В комплект GoToMeeting изначально входит необходимый инструментарий
для кодирования в формат Windows Media.

Но начнем по порядку.

Допустим к вам попал файл abcdef.wmv - например запись видео
конференции (основное использование встречавшееся мне), и кодированное
в G2M3/G2M4 формате.

Если Вас будет интересовать только возмжность просмотра под Windows, то
предлагаю ограничиться первым пунктом, иначе читать все:


Шаг 0(ноль).

Запустить Windows. (Ну так пост же для Линуксоидов :) )


Шаг 1.

Необходимо скачать и установить кодек, это можно сделать посетив
страницу www.gotomeeting.com/codec
По сути жмите кнопку "Install GoToMeeting Codec" и следуйте инструкциям.

Шаг 2.

После установки открываете содержимое директории (папки) C:\Program
Files\Citrix\GoToMeeting\723
, где 723 - номер установленной версии
GoToMeeting, у вас это может быть другое число. В этой папке должен находиться файл g2mtranscoder.exe.
Этот файлик и есть наше "волшебное" средство, которое и позволит
преобразовать файл из G2M3 в честный Windows Media формат.

Шаг 3.

Чтобы не засорять папку с кодеком, копируем из него 2 файла в
отдельный каталог, нам будут нужны g2mtranscoder.exe и g2m.dll.
Я предлагаю "мусорить" в родном каталоге, "C:\Documents and
Settings\<Ваш Юзернэйм>\Мои документы\Мои видеозаписи\"


Шаг 4.

Копируем в этот же каталог нашу видео запись.

ВНИМАНИЕ!!! Рекомендую работать с копией, а не с оригиналом, так как
файл будет перезаписан!!!

Шаг 5.

Открываем терминал (коммандную строку).
Для этого нажимаем Win+R, в окне "выполнить" вводим cmd и нажимаем ENTER.

Шаг 6.

Переходим в каталог "C:\Documents and Settings\<Ваш Юзернэйм>\Мои
документы\Мои видеозаписи\"

Для этого выполним команду
cd "C:\Documents and Settings\<Ваш Юзернэйм>\Мои документы\Мои видеозаписи\"


Шаг 7.

Запускаем процесс конвертирования, выполнив команду
ВНИМАНИЕ!!! Исходный файл будет перезаписан!!!

g2mtranscoder.exe source=abcdef.wmv

Команда выполнится мгновенно, но это еще не все :)


Шаг 8.

Не пугаться, и не ругаться, а проверить, висит ли в Диспетчере Задач
Windows процесс g2mtranscoder.exe
Дело в том что программа запускается в фоновом режиме, и начинает
"кушать" процессорное время, и не много памяти 200-300 Мб
Эти признаки указывают на то что у нас "процесс пошел".


Шаг 9.

Дождаться завершения g2mtranscoder.exe и проверить новый файл abcdef.wmv


Дальше можно любым конвертером продолжить преобразование файла
например в кодек THEORA.

понедельник, 21 мая 2012 г.

Linux : Установка BloGTK на Ubuntu 10.04

Сегодня представлю вольный перевод статьи найденной в сети, на этот раз о хорошем инструменте для блогов типа BlogSpot.com. Рецепт подходит для ubuntu 10.04, которой и сам пользуюсь до сих пор.

BloGTK installation on Ubuntu 10.04

Установив BloGTK на Ubuntu 10.04 из Центра приложений, я попробовал запустить программу из меню (Приложения -> Интернет), но оно не запустилось :(. Я видел только на панели задач, что окно под названием "Запуск BloGTK" появляется, но ничего не отображается. Тогда я попытался запустить его из терминала, и это то, что произошло:


  1. $ blogtk
  2. Traceback (most recent call last):
  3. File "/usr/bin/blogtk", line 14, in <module>
  4. import gtkhtml2
  5. ImportError: No module named gtkhtml2

Видим, что отсутствует модуль Python, я попытался установить его вручную, но его не оказалось в репозитариях ubuntu:


$ sudo apt-get install python-gtkhtml2
[sudo] password for sorokin: 
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Чтение информации о состоянии... Готово
Пакет python-gtkhtml2 недоступен, но упомянут в списке зависимостей другого пакета.
Это может означать, что пакет отсутствует, устарел, или доступен из источников, не упомянутых в sources.list
E: Для пакета python-gtkhtml2 не найдены кандидаты на установку

Затем я обнаружил, что BloGTK есть на Launchpad PPA, и попытался установить его оттуда:


$ sudo apt-get remove blogtk
$ sudo apt-add-repository ppa:jayreding/ppa
$ sudo apt-get update
$ sudo apt-get install blogtk

Затем я запустил вновь установленную программу (теперь он назывался blogtk2), и он открыл правильно.



p.s. Хочу добавить, клиент мне вполне понравился, но это по сути просто html редактор с подсветкой синтаксиса, ему очень сильно не хватает возможности добавления изображений, с загрузкой их в Piassa. Но это я могу сделать и через web-клиент.

суббота, 19 мая 2012 г.

MSSQL : Удаление не цифровых символов в строке

Всем привет, Сегодня хочу поделиться результатом изысканий по классической задаче, удаление всех не нужных символов. Если мы говорили бы о функциональном программировании, то тут все просто, например так:
  1. CREATE FUNCTION dbo.RemoveChars(@Input varchar(1000))
  2.     RETURNS VARCHAR(1000)
  3. BEGIN
  4.     DECLARE @pos INT
  5.     SET @Pos = PATINDEX('%[^0-9]%',@Input)
  6.     WHILE @Pos > 0
  7.     BEGIN
  8.         SET @Input = STUFF(@Input,@pos,1,'')
  9.         SET @Pos = PATINDEX('%[^0-9]%',@Input)
  10.     END
  11.     RETURN @Input
  12. END
Но, так как мы находимся в среде, SQL в моем случае MSSQL, то было найти решение не использующее скалярную функцию. Такое решение было найдено тут (http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/06eb934c-4082-4d12-ab9b-5fbe68855061/) Вот текст изначального примера:
  1. DECLARE @test TABLE(x VARCHAR(20));
  2. INSERT INTO @test (x)
  3.     SELECT '+91 (876) 098 6789' UNION ALL
  4.     SELECT '1-567-987-7655' UNION ALL
  5.     SELECT 'FR5-5105';
  6. WITH
  7.     Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
  8.     Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  9.     Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  10.     Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  11.     Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  12.     Cleaner AS (
  13.         SELECT x
  14.         ,   (SELECT
  15.                 CASE
  16.                     WHEN SUBSTRING(x, n, 1) NOT LIKE '[^0-9]'
  17.                         THEN SUBSTRING(x, n, 1)
  18.                     ELSE ''
  19.                 END + ''
  20.             FROM Nums
  21.             WHERE n <= LEN(x)
  22.             FOR XML PATH('')) AS x_clean
  23.         FROM @test)
  24. SELECT x, x_clean
  25. FROM Cleaner;
  1. /*
  2. x x_clean
  3. -------------------- -------------
  4. +91 (876) 098 6789 918760986789
  5. 1-567-987-7655 15679877655
  6. FR5-5105 55105
  7. */
На мой взгляд просто замечательный подход, но что нам делать если такая задача будет повторяться?! Не переписывать же под каждую задачу этот кусок (мне надо было 8 полей очистить в одном единственном запросе) И тут на помощь приходят табличные функции
  1. CREATE FUNCTION fnt_RemoveNonNumericChars (@x varchar(50))
  2.     RETURN TABLE
  3. AS
  4. RETURN (
  5.     WITH
  6.         Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
  7.         Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
  8.         Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
  9.         Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
  10.         Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
  11.         Cleaner AS (
  12. SELECT @x [x]
  13. ,    (SELECT
  14.         CASE
  15.             WHEN SUBSTRING(@x, n, 1) NOT LIKE '[^0-9]'
  16.                 THEN SUBSTRING(@x, n, 1)
  17.             ELSE ''
  18.         END + ''
  19.     FROM Nums
  20.     WHERE n <= LEN(@x)
  21.     FOR XML PATH('')) AS x_clean
  22.     )
  23. SELECT x, x_clean
  24. FROM Cleaner;
  25. )
И вот собственно вариант использования:
  1. DECLARE @test TABLE(x VARCHAR(20));
  2. INSERT INTO @test (x)
  3.     SELECT '+91 (876) 098 6789' UNION ALL
  4.     SELECT '1-567-987-7655' UNION ALL
  5.     SELECT 'FR5-5105';
  6. SELECT
  7.     t.x
  8. ,   vv.x
  9. ,   vv.x_clean
  10. FROM @test t
  11.     CROSS APPLY fnt_RemoveNonNumericChars(t.x) vv
И результат выполнения:
  1. t.x vv.x vv.x_clean
  2. -------------------- -------------------- -------------
  3. +91 (876) 098 6789 +91 (876) 098 6789 918760986789
  4. 1-567-987-7655 1-567-987-7655 15679877655
  5. FR5-5105 FR5-5105 55105
ВАЖНО!!! Если будете использовать вариант с XML имейте в виду, порядок цифр может перемешаться, наткнулся на эту проблему буквально на следующий день.
В принципе мне не очень нравится текущий вариант нумерации, но это уже лирика, ее легко можно поменять, это позволит сэкономить еще несколько тактов, особенно на больших числах.

четверг, 29 сентября 2011 г.

MSSQL : LDAP запрос.

Всем добрый день.
Рано или поздно вам возможно придется столкнуться с запросом к ActiveDirectory.
Собственно сам рецепт запроса прост:

Либо так:
  1. SELECT primaryGroupID,
  2.        primaryGroupToken,
  3.        employeeid,
  4.        sAMAccountName,
  5.        [name],
  6.        adspath,
  7.        objectGUID,
  8.        info
  9. FROM OPENQUERY (ADSI, 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''Group'' ORDER BY samAccountname');


Либо так:
  1. SELECT primaryGroupID,
  2.        primaryGroupToken,
  3.        employeeid,
  4.        sAMAccountName,
  5.        [name],
  6.        adspath,
  7.        objectGUID,
  8.        info
  9. FROM OPENQUERY (ADSI, N'<LDAP://DC=MORTON,DC=RU>;(&(objectClass=User)(objectCategory=Person)(|(sAMAccountName=a*)(sAMAccountName=b*)(sAMAccountName=c*)));primaryGroupID, primaryGroupToken,employeeid, sAMAccountName, name, adspath, objectGUID, info');
  10.  
  11.  


Но что делать если у вас в каталоге количество записей много? Хотя бы пара тысяч. Вот тут поможет мой рецептик, до нельзя простой.

  1.  
  2. declare @samAccountname varchar(64)
  3. declare @query varchar(4000)
  4. declare @rc int
  5.  
  6. if (object_id('tempdb..#usersgrps') is not null) drop table #usersgrps
  7.  
  8.         CREATE TABLE #usersgrps (
  9.             id INT IDENTITY,
  10.             primaryGroupID INT ,
  11.             primaryGroupToken INT ,
  12.             employeeid VARCHAR (15) ,
  13.             sAMAccountName VARCHAR (64) ,
  14.             username VARCHAR (1000),
  15.             adspath VARCHAR (1000),
  16.             isprocessed INT ,
  17.             sid VARBINARY (50),
  18.             info VARCHAR (200) ,
  19.             isgroup BIT
  20.         );
  21.  
  22. INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  23. SELECT TOP 900 primaryGroupID,
  24.                primaryGroupToken,
  25.                employeeid,
  26.                sAMAccountName,
  27.                [dbo].[f_string_ad_clear]([name]),
  28.                [dbo].[f_string_ad_clear](adspath),
  29.                0,
  30.                objectGUID,
  31.                [dbo].[f_string_ad_clear](info),
  32.                0
  33. FROM OPENQUERY(ADSI,
  34.         'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''User'' ORDER BY samAccountname')
  35.  
  36. set @rc = @@rowcount
  37.  
  38. select @samAccountname = max(sAMAccountName)
  39. from #usersgrps
  40. where isgroup = 0
  41.  
  42. select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''User'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  43. print @query
  44. select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 0 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  45. print @query
  46.  
  47. while @rc > 0
  48.     begin
  49.         INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  50.         exec (@query )
  51.         set @rc = @@rowcount
  52.  
  53.         select @samAccountname = max(sAMAccountName)
  54.         from #usersgrps
  55.         where isgroup = 0
  56.  
  57.         select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''User'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  58.         print @query
  59.         select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 0 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  60.         print @query
  61.     end
  62.  
  63.  
  64.  
  65. INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  66. SELECT TOP 900 primaryGroupID,
  67.                primaryGroupToken,
  68.                employeeid,
  69.                sAMAccountName,
  70.                [dbo].[f_string_ad_clear]([name]),
  71.                [dbo].[f_string_ad_clear](adspath),
  72.                0,
  73.                objectGUID,
  74.                [dbo].[f_string_ad_clear](info),
  75.                1
  76. FROM OPENQUERY(ADSI,
  77.         'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''LDAP://DC=MYDOMAIN,DC=RU'' WHERE objectCategory=''Group'' ORDER BY samAccountname')
  78.  
  79. set @rc = @@rowcount
  80.  
  81. select @samAccountname = max(sAMAccountName)
  82. from #usersgrps
  83. where isgroup = 1
  84.  
  85. select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''Group'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  86. print @query
  87. select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 1 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  88. print @query
  89.  
  90. while @rc > 0
  91.     begin
  92.         INSERT #usersgrps (primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, username, adspath, isprocessed, sid, info, isgroup)
  93.         exec (@query )
  94.         set @rc = @@rowcount
  95.  
  96.         select @samAccountname = max(sAMAccountName)
  97.         from #usersgrps
  98.         where isgroup = 1
  99.  
  100.         select @query = 'SELECT name,adspath,objectGUID,info,primaryGroupID,primaryGroupToken,employeeid, sAMAccountName FROM ''''LDAP://DC=MYDOMAIN,DC=RU'''' WHERE objectCategory=''''Group'''' and samAccountname > '''''+@samAccountname+''''' ORDER BY samAccountname'
  101.         print @query
  102.         select @query = 'SELECT TOP 900 primaryGroupID, primaryGroupToken, employeeid, sAMAccountName, [dbo].[f_string_ad_clear]([name]), [dbo].[f_string_ad_clear](adspath), 0, objectGUID, [dbo].[f_string_ad_clear](info), 1 FROM OPENQUERY(ADSI, ''' + @query + ''')'
  103.         print @query
  104.     end
  105.  
  106. select * from #usersgrps

среда, 24 августа 2011 г.

MSSQL : Hot keys SQL Server Management Studio

Еще одна вещь которая облегчает жизь, оригинал тут : http://msdn.microsoft.com/ru-ru/library/ms174205.aspx или http://msdn.microsoft.com/en-us/library/ms174205.aspx
тут нет никакой отсебятины, только копия полезной статьи.
Среда Среда SQL Server Management Studio предоставляет пользователям две схемы сочетаний клавиш. По умолчанию используется стандартная схема, при этом сочетания клавиш аналогичны применяемым в среде Microsoft Visual Studio. Вторая схема, называемая схемой SQL Server 2000, напоминает средства SQL Server 2000, в частности сочетания клавиш в программе Query Analyzer. Среда Среда SQL Server Management Studio поддерживает не все сочетания клавиш программы Query Analyzer. Чтобы изменить клавиатурную схему или добавить новые сочетания клавиш, выберите в меню Сервис пункт Параметры. Выберите предпочтительную клавиатурную схему на вкладке Среда страницы Клавиатура.
Сочетания клавиш для активации элементов меню
ДействиеСтандартная схемаСхема SQL Server 2000
Активировать строку меню среды Среда SQL Server Management StudioALTALT
Открыть меню компонента средстваALT + ДЕФИСALT + ДЕФИС
Отобразить контекстное менюSHIFT + F10SHIFT + F10
Отобразить диалоговое окно Создать файлCTRL + NНет эквивалента
Отобразить диалоговое окно Создать проект для создания нового проектаCTRL + SHIFT + NCTRL + SHIFT + N
Отобразить диалоговое окно Открыть файл для открытия существующего файлаCTRL + OCTRL + SHIFT + INS
Отобразить диалоговое окно Открыть проект для открытия существующего проектаCTRL + SHIFT + OНет эквивалента
Отобразить диалоговое окно Добавить новый элемент для добавления нового файла в текущий проектCTRL + SHIFT + AНет эквивалента
Отобразить диалоговое окно Добавить существующий элемент для добавления существующего файла в текущий проектALT + SHIFT + AНет эквивалента
Отобразить окно конструктора запросовCTRL + SHIFT + QCTRL + SHIFT + Q
Закрыть меню
или
диалоговое окно, отменив выполнение действия
ESCESC

Сочетания клавиш для управления окнами и панелью инструментов
ДействиеСтандартная схемаСхема SQL Server 2000
Закрыть текущее дочернее окно MDI-приложенияCTRL + F4CTRL + F4
ПечатьCTRL + PCTRL + P
ВыходALT + F4ALT + F4
Переключиться в полноэкранный режимSHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Закрыть окно текущего средстваSHIFT + ESCSHIFT + ESC
Перейти к следующему дочернему окну MDI-приложенияCTRL + TABCTRL + TAB
Перейти к предыдущему дочернему окну MDI-приложенияCTRL + SHIFT + TABCTRL + SHIFT + TAB
Активировать панель инструментов окна текущего средстваSHIFT + ALTНет эквивалента
Перейти к окну следующего средстваALT + F6ALT + F6
Перейти к окну, выбранному в предыдущий разSHIFT + ALT + F6SHIFT + ALT + F6
Открыть новое окно редактора запросовНет эквивалентаCTRL + O
Отобразить окно обозревателя объектовF8F8
Отобразить окно зарегистрированных серверовCTRL + ALT + GНет эквивалента
Отобразить окно обозревателя шаблоновCTRL + ALT + TCTRL + ALT + T
Отобразить окно обозревателя решенийCTRL + ALT + LCTRL + ALT + L
Отобразить окно сводкиF7F7
Отобразить окно свойствF4F4
Переключение между представлением списка сведений обозревателя объектов и областью свойств обозревателя объектов.F6Нет эквивалента
Управление разбивкой, которая разделяет представление списка сведений обозревателя объектов и область свойств обозревателя объектов, для настройки размера области отображения.TAB + СТРЕЛКА ВВЕРХ
или
TAB + СТРЕЛКА ВНИЗ
Нет эквивалента
Отобразить область элементовCTRL + ALT + XCTRL + ALT + X
Отобразить окно закладокCTRL + K, CTRL + WНет эквивалента
Отобразить окно браузераCTRL + ALT + RCTRL + ALT + R
Отобразить окно «Список ошибок» (только редактор Transact-SQL)CTRL + \, CTRL + ECTRL + \, CTRL + E

Сочетания клавиш для перемещения курсора
ДействиеСтандартная схемаСхема SQL Server 2000
Переместить курсор на одну позицию влевоСТРЕЛКА ВЛЕВОСТРЕЛКА ВЛЕВО
Переместить курсор на одну позицию вправоСТРЕЛКА ВПРАВОСТРЕЛКА ВПРАВО
Переместить курсор на одну позицию вверхСТРЕЛКА ВВЕРХСТРЕЛКА ВВЕРХ
Переместить курсор на одну позицию внизСТРЕЛКА ВНИЗСТРЕЛКА ВНИЗ
Переместить курсор в начало строкиHOMEHOME
Переместить курсор в конец строкиENDEND
Переместить курсор в начало документаCTRL + HOMECTRL + HOME
Переместить курсор в конец документаCTRL + ENDCTRL + END
Переместить курсор на один экран вверхPAGE UPPAGE UP
Переместить курсор на один экран внизPAGE DOWNPAGE DOWN
Переместить курсор на одно слово вправоCTRL + СТРЕЛКА ВПРАВОCTRL + СТРЕЛКА ВПРАВО
Переместить курсор на одно слово влевоCTRL + СТРЕЛКА ВЛЕВОCTRL + СТРЕЛКА ВЛЕВО

Сочетания клавиш для выделения текста
ДействиеСтандартная схемаСхема SQL Server 2000
Выделить текст от начала документа до курсораCTRL + SHIFT + HOMECTRL + SHIFT + HOME
Выделить текст от позиции курсора до конца документаCTRL + SHIFT + ENDCTRL + SHIFT + END
Выделить текст от начала текущей строки до курсораSHIFT + HOMESHIFT + HOME
Выделить текст от курсора до конца текущей строкиSHIFT + ENDSHIFT + END
Выделять текст по одной строке вниз, начиная от курсораSHIFT + СТРЕЛКА ВНИЗSHIFT + СТРЕЛКА ВНИЗ
Выделять текст по одной строке вверх, начиная от курсораSHIFT + ВВЕРХSHIFT + ВВЕРХ
Переместить курсор на одну строку вверх с расширением блока выделенного текстаSHIFT + ALT + СТРЕЛКА ВВЕРХSHIFT + ALT + СТРЕЛКА ВВЕРХ
Расширить блок выделенного текста на одну страницу вверхSHIFT + PAGE UPSHIFT + PAGE UP
Расширить блок выделенного текста на одну страницу внизSHIFT + PAGE DOWNSHIFT + PAGE DOWN
Выделить весь документCTRL + ACTRL + A
Выделить слово, на котором находится курсор,
или
ближайшее к курсору слово
CTRL + WCTRL + W
Выделить в редакторе блок текста от текущей до предыдущей позиций курсораCTRL + =CTRL + =
Расширить блок выделенного текста до верха текущего окнаCTRL + SHIFT + PAGE UPCTRL + SHIFT + PAGE UP
Переместить курсор в последнюю видимую на экране строку с расширением выделенного блока текстаCTRL + SHIFT + PAGE DOWNCTRL + SHIFT + PAGE DOWN
Расширить блок выделенного текста на одно слово вправоCTRL + SHIFT + СТРЕЛКА ВПРАВОCTRL + SHIFT + СТРЕЛКА ВПРАВО
Расширить блок выделенного текста на одно слово влевоCTRL + SHIFT + СТРЕЛКА ВЛЕВОCTRL + SHIFT + СТРЕЛКА ВЛЕВО
Переместить курсор на одно слово вправо с расширением блока выделенного текстаCTRL + SHIFT + ALT + СТРЕЛКА ВПРАВОCTRL + SHIFT + ALT + СТРЕЛКА ВПРАВО
Переместить курсор на одно слово влево с расширением блока выделенного текстаCTRL + SHIFT + ALT + СТРЕЛКА ВЛЕВОCTRL + SHIFT + ALT + СТРЕЛКА ВЛЕВО

Сочетания клавиш для закладок
ДействиеСтандартная схемаСхема SQL Server 2000
Установить закладку на текущей строке
или
удалить ее
CTRL + K, CTRL + KCTRL + F2
Перейти к следующей закладкеCTRL + K, CTRL + NF2
Перейти к предыдущей закладкеCTRL + K, CTRL + PSHIFT + F2
Очистить закладкиCTRL + K, CTRL + LCTRL + SHIFT + F2

Сочетания клавиш для управления деревьями
ДействиеСтандартная схемаСхема SQL Server 2000
Свернуть узлы дерева— (на цифровой клавишной панели)— (на цифровой клавишной панели)
Развернуть все узлы дерева* (на цифровой клавишной панели)* (на цифровой клавишной панели)
Прокрутить дерево вверхCTRL + СТРЕЛКА ВВЕРХCTRL + СТРЕЛКА ВВЕРХ
Прокрутить дерево внизCTRL + СТРЕЛКА ВНИЗCTRL + СТРЕЛКА ВНИЗ

Сочетания клавиш редактора кода
Отдельные редакторы кода могут поддерживать не все сочетания клавиш.
ДействиеСтандартная схемаСхема SQL Server 2000
Переключиться в полноэкранный режим
или
выйти из него
SHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Прокрутить текст вверх на одну строкуCTRL + СТРЕЛКА ВВЕРХCTRL + СТРЕЛКА ВВЕРХ
Прокрутить текст вниз на одну строкуCTRL + СТРЕЛКА ВНИЗCTRL + СТРЕЛКА ВНИЗ
Отменить последнее действие по изменению кодаCTRL + ZCTRL + Z
Восстановить отмененное действиеCTRL + SHIFT + Z
или
CTRL + Y
или
ALT + SHIFT + BACKSPACE
CTRL + SHIFT + Z
или
CTRL + Y
или
ALT + SHIFT + BACKSPACE
Вставить текст указанного файла в текущее окноНет эквивалентаCTRL + SHIFT + P
Сохранить выбранный элементCTRL + SCTRL + S
Сохранить всеCTRL + SHIFT + SCTRL + SHIFT + S
ЗакрытьCTRL + F4CTRL + F4
ПечатьCTRL + PCTRL + P
ВыходALT + F4ALT + F4
Удалить весь текст из текущего файлаCTRL + SHIFT + DELCTRL + SHIFT + DEL
Отобразить диалоговое окно Переход к строкеCTRL + GCTRL + G
Увеличить отступ перед строкойTABTAB
Уменьшить отступ перед строкойSHIFT + TABSHIFT + TAB
Преобразовать выделенный текст в верхний регистр.CTRL + SHIFT + UCTRL + SHIFT + U
Преобразовать выделенный текст в нижний регистрCTRL + SHIFT + LCTRL + SHIFT + L
Сделать выделенный текст примечаниемCTRL + K, CTRL + CCTRL + SHIFT + C
Снять комментарий с выделенного текстаCTRL + K, CTRL + UCTRL + SHIFT + R
Открыть новый запрос в контексте текущего соединенияCTRL + QCTRL + N
Открыть базу данных в обозревателе объектовALT + F8ALT + F8
Указать значения параметров шаблонаCTRL + SHIFT + MCTRL + SHIFT + M
Выполнить фрагмент кода, выделенный в редакторе запросов,
или
весь код, находящийся в редакторе запросов, если ничего не выделено
F5
или
CTRL + E
или
ALT + X
F5
или
CTRL + E
или
ALT + X
Выполнить синтаксический анализ фрагмента кода, выделенного в редакторе запросов,
или
всего кода, находящегося в редакторе запросов, если ничего не выделено
CTRL + F5CTRL + F5
Отобразить предполагаемый план выполненияCTRL + LCTRL + L
Отменить выполняемый запросALT + BREAKALT + BREAK
Включить действительный план выполнения в данные, выведенные запросомCTRL + MCTRL + K
Открыть диалоговое окно Параметр запросаНет эквивалентаCTRL + SHIFT + O
Вывести результаты в сеткуCTRL + DCTRL + D
Вывести результаты в текстовом форматеCTRL + TCTRL + T
Вывести результаты в файлCTRL + SHIFT + FCTRL + SHIFT + F
Отобразить
или
скрыть панель результатов выполнения запроса
CTRL + RCTRL + R
Переключение между панелями запроса и результатов выполнения запросаF6F6
Перейти к следующему активному окну в Management Studio CTRL + F6CTRL + F6
Скрыть все автоматическиALT + ВВОДНет эквивалента
ОкнаCTRL + WНет эквивалента
Открыть приложение Приложение SQL Server ProfilerCTRL + ALT + PCTRL + ALT + P

Сочетания клавиш для работы с текстом в редакторе кода
ДействиеСтандартная схемаСхема SQL Server 2000
Вставить символ переноса строкиВВОД
или
SHIFT + ВВОД
ВВОД
или
SHIFT + ВВОД
Поменять местами два символа, расположенные слева и справа от курсора (неприменимо в редакторе SQL)CTRL + TНет эквивалента
Удалить символ, расположенный справа от курсораDELETEDELETE
Удалить символ, расположенный слева от курсораBACKSPACE
или
SHIFT + BACKSPACE
BACKSPACE
или
SHIFT + BACKSPACE
Вставить в текст последовательность пробелов, длина которой указана в настройках редактораTABTAB
Вставить в текст пустую строку выше курсораCTRL + ВВОДCTRL + ВВОД
Вставить в текст пустую строку ниже курсораCTRL + SHIFT + ВВОДCTRL + SHIFT + ВВОД
Преобразовать выделенный текст в нижний регистрCTRL + SHIFT + LCTRL + SHIFT + L
Преобразовать выделенный текст в верхний регистрCTRL + SHIFT + UCTRL + SHIFT + U
Переключение между режимами вставки и замены текстаINSERTINSERT
Переместить выделенные строки к левой позиции табуляцииSHIFT + TABSHIFT + TAB
Удалить слово, расположенное справа от курсораCTRL + DELETECTRL + DELETE
Удалить слово, расположенное слева от курсораCTRL + BACKSPACECTRL + BACKSPACE
Поменять местами слова, расположенные слева и справа от курсора (неприменимо в редакторе SQL)CTRL + SHIFT + TCTRL + SHIFT + T

Сочетания клавиш отладчика Transact-SQL
ДействиеStandardSQL Server 2000
Начать
или
продолжить отладку
ALT + F5Нет эквивалента
Остановить отладкуSHIFT + F5Нет эквивалента
Шаг с заходомF11Нет эквивалента
Шаг с обходомF10Нет эквивалента
Шаг с выходомSHIFT + F11Нет эквивалента
Реализация команды Выполнить до курсораCTRL + F10Нет эквивалента
Отобразить диалоговое окно Контрольное значениеQuickWatch.CTRL + ALT + QНет эквивалента
Переключить точку остановаF9Нет эквивалента
Удалить все точки остановаCTRL + SHIFT + F9Нет эквивалента
Отобразить окно Точки остановаCTRL + ALT + BНет эквивалента
Приостановить всеCTRL + ALT + BREAKНет эквивалента
Отобразить окно Просмотр значений 1CTRL + ALT + W, 1Нет эквивалента
Отобразить окно Просмотр значений 2CTRL + ALT + W, 2Нет эквивалента
Отобразить окно Просмотр значений 3CTRL + ALT + W, 3Нет эквивалента
Отобразить окно Просмотр значений 4CTRL + ALT + W, 4Нет эквивалента
Отобразить окно Автоматические значенияCTRL + ALT + V, AНет эквивалента
Отобразить окно Локальные значенияCTRL + ALT + V, LНет эквивалента
Отобразить окно ИнтерпретацияCTRL + ALT + IНет эквивалента
Отобразить окно Стек вызоваCTRL + ALT + CНет эквивалента
Отобразить окно ПотокиCTRL + ALT + HНет эквивалента

Сочетания клавиш для технологии Microsoft IntelliSense
ДействиеСтандартная схемаСхема SQL Server 2000
Показать список элементовCTRL + ПРОБЕЛ
или
CTRL + J
CTRL + J
Дополнить словоALT + ВПРАВОALT + ВПРАВО
Сведения о параметрахCTRL + SHIFT + ПРОБЕЛНет эквивалента
Обновление локального кэшаCTRL + SHIFT + RНет эквивалента
Перейти между синтаксическими парамиCTRL + ]Нет эквивалента

Сочетания клавиш для окна документов и браузера
ДействиеСтандартная схемаСхема SQL Server 2000
Переключиться в полноэкранный режим
или
выйти из него
SHIFT + ALT + ВВОДSHIFT + ALT + ВВОД
Перейти к следующей панели представления документа с разделенными панелямиF6F6
Перейти к предыдущему документу в редакторе
или
конструкторе
CTRL + SHIFT + F6 CTRL + SHIFT + TABCTRL + SHIFT + F6 CTRL + SHIFT + TAB
Перейти к предыдущей панели документа в представлении с разделенными панелямиSHIFT + F6SHIFT + F6
Отобразить окно браузераCTRL + ALT + RCTRL + ALT + R
Отобразить предыдущую страницу в журнале просмотра страницALT + ВЛЕВОALT + ВЛЕВО
Отобразить следующую страницу в журнале просмотра страницALT + ВПРАВОALT + ВПРАВО

Сочетания клавиш обозревателя решений
ДействиеСтандартная схемаСхема SQL Server 2000
Отобразить окно обозревателя решенийCTRL + ALT + LCTRL + ALT + L
Отобразить диалоговое окно Создать файлCTRL + NCTRL + SHIFT + INS
Отобразить диалоговое окно Создать проект для создания нового проектаCTRL + SHIFT + NCTRL + SHIFT + N
Отобразить диалоговое окно Открыть файл для открытия существующего файлаCTRL + OНет эквивалента

Сочетания клавиш для работы со справкой и электронной документацией
ДействиеСтандартная схемаСхема SQL Server 2000
СправкаF1F1
Справка по разделу «Инструкции»CTRL + F1CTRL + F1
Выбрать в электронной документации вкладку «Оглавление»CTRL + ALT + F1CTRL + ALT + F1
Выбрать в электронной документации вкладку «Указатель»CTRL + ALT + F2CTRL + ALT + F2
Открыть в справочной системе окно поискаCTRL + ALT + F3CTRL + ALT + F3
Динамическая справкаCTRL + ALT + F4CTRL + ALT + F4
Избранные разделы справкиCTRL + ALT + FCTRL + ALT + F

Сочетания клавиш для поиска
ДействиеСтандартная схемаСхема SQL Server 2000
Отобразить диалоговое окно НайтиCTRL + FCTRL + F
Отобразить диалоговое окно ЗаменитьCTRL + HCTRL + H
Начать последовательный поиск. Введите последовательность символов, которую нужно найти,
или
нажмите CTRL + I для поиска тех же символов, что и в предыдущий раз.
CTRL + ICTRL + B
Найти следующее вхождение искомой последовательности символов в текстF3F3
Найти предыдущее вхождение искомого текстаSHIFT + F3SHIFT + F3
Найти следующее вхождение выделенного текстаCTRL + F3CTRL + F3
Найти предыдущее вхождение выделенного текстаCTRL + SHIFT + F3CTRL + SHIFT + F3
Отобразить диалоговое окно Заменить в файлахCTRL + SHIFT + HCTRL + SHIFT + H
Изменить направление поиска с уточнением критериев, чтобы он выполнялся от конца файла к началуCTRL + SHIFT + ICTRL + SHIFT + I
Установить
или
снять флажок Искать вверх в диалоговом окне Найти и заменить
ALT + F3, BALT + F3, B
Остановить выполнение операции Найти в файлахALT + F3, SALT + F3, S
Установить
или
снять флажок Искать слово в диалоговом окне Найти и заменить
ALT + F3, WALT + F3, W
Установить
или
снять флажок Шаблон в диалоговом окне Найти и заменить.
ALT + F3, PALT + F3, P

Сочетания клавиш для вырезания и вставки текста
ДействиеСтандартная схемаСхема SQL Server 2000
Вырезать (удалить выделенный элемент и поместить его в буфер обмена)CTRL + X
или
SHIFT + DELETE
CTRL + X
или
SHIFT + DELETE
Скопировать данные в буфер обменаCTRL + C
или
CTRL + INSERT
CTRL + C
или
CTRL + INSERT
Вставить данные из буфера обмена в позицию вставкиCTRL + V
или
SHIFT + INSERT
CTRL + V
или
SHIFT + INSERT

Сочетания клавиш средства просмотра журналов
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Переключаться между панелями Выбор журналов и Сведения журналаF6F6
Перейти на панель Сведения журналаALT + SALT + S
Загрузить новый журналCTRL + SHIFT + LCTRL + SHIFT + L
Экспортировать журналCTRL + SHIFT + ECTRL + SHIFT + E
Отфильтровать журналCTRL + SHIFT + FCTRL + SHIFT + F
Поиск в журналеCTRL + SHIFT + SCTRL + SHIFT + S

Сочетания клавиш монитора активности
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Отфильтровать отображаемые монитором сведенияCTRL + SHIFT + FCTRL + SHIFT + F

Сочетания клавиш монитора репликации
ДействиеСтандартная схемаСхема SQL Server 2000
ОбновитьF5F5
Открыть окно сведений из сеткиВВОДВВОД

Сочетания клавиш средства просмотра конфликтов репликации
ДействиеСтандартная схемаСхема SQL Server 2000
Определить фильтрF6F6
Применить фильтрF7F7
Показать все столбцыF8F8

пятница, 22 июля 2011 г.

MSSQL : Оптимизация запросов - убираем корреляцию в запросах.

Собственно нашел давно картинку, которая очень помогает в решении задач по оптимизации.
Например когда надо проверить (не)существование значений в другой таблице по заданным параметрам.

Самый простой вариант НЕ ПРАВИЛЬНЫХ запросов выглядит следующим образом
Вывести строки из t1, на которые есть ссылки в таблице t2
select * from t1
where exists(select * from t2 where t2.t1id = t1.id)

или на оборот,
select * from t1
where not exists(select * from t2 where t2.t1id = t1.id)


некоторые программисты начали пытаться ускорить код следующиими вариантами
select * from t1
where exists(select top 1 1 from t2 where t2.t1id = t1.id)

или на оборот,
select * from t1
where not exists(select top 1 1 from t2 where t2.t1id = t1.id)


Честно говоря я понимаю что есть ситуации когда без таких конструкций не обойтись, и в моей практике такое тоже встречалось. Но все же лучше пользоваться "умножения" таблиц
Получение строк, на которые есть ссылки в подчиненной таблице
select distinct t1.*
from t1
inner join t2 on t2.t1id = t1.id

И получение строк, на которые нет ссылок в подчиненной таблице
select distinct t1.*
from t1
left join t2 on t2.t1id = t1.id
where t2.id is null


Вобщем пользуйтесь на здоровье, и избегайте не нужной работы серверов

MSSQL : Оптимизация запросов - убираем TOP 1

Иногда бывает необходимо получить только некие "верхние" записи из подчиненной таблицы
Кто-то делает так:
select *
, (select top 1 t2.id from t2 where t1Id = t1.id)
, (select top 1 t2.someData from t2 where t1Id = t1.id)
from t1


Чем плох такой вариант? А плох он следующим.
Мы ориентируемся на некое "верхнее" значение, которое может не относиться в нужной нам последовательности в итоге.
Кроме этого, у нас может возникнуть ситуация когда вызовы "верхнего" значения будут относиться к разным строкам таблицы.
Что тогда будете делать?
Поэтому я предлагаю использовать агрегирующий подзапрос

select *
from t1
inner join (select max(id) id, t1Id from t2 group by t1Id) T2i on t1.id = T2i.t1Id
inner join t2 on t2.id = T2i.id

В большинстве своем мы получим более лучший план запроса, эффективность во времени, предсказуемость (точность) результата.