<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>bydlokoder</title>
  <link>http://bydlokoder.livejournal.com/</link>
  <description>bydlokoder - LiveJournal.com</description>
  <lastBuildDate>Fri, 28 Aug 2009 19:43:38 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>bydlokoder</lj:journal>
  <lj:journalid>16370739</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/3293.html</guid>
  <pubDate>Fri, 28 Aug 2009 19:43:38 GMT</pubDate>
  <title>Полезный прием редактирования хранимок</title>
  <link>http://bydlokoder.livejournal.com/3293.html</link>
  <description>Я снова здесь.&lt;br /&gt;&lt;br /&gt;Нередко при создании хранимых процедур, вставляющих или апдейтящих данные возникает проблема преобразования конструкции типа&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;  ,@ResourcesTitanium&lt;br /&gt;  ,@ResourcesSilicon&lt;br /&gt;  ,@ResourcesAM&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;(это перечисление переменных на Insert)&lt;br /&gt;&lt;br /&gt;к виду, необходимому на Update:&lt;br /&gt;&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;  ResourcesTitanium = @ResourcesTitanium&lt;br /&gt; ,ResourcesSilicon = @ResourcesSilicon&lt;br /&gt; ,ResourcesAM = @ResourcesAM&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;В простейшем случае это можно сделать и руками, при помощи копипасты. Но сейчас мне понадобилось провести эту операцию для таблицы, имеющей 24 поля. Поэтому пришлось обратиться к такому редко используемому средству обработки текста в IDE от Microsoft, как регулярные выражения. Проблема решилась следующим образом: в окне Find and Replace 1. в Find what вводится: \@{(.*)}\n&lt;br /&gt;2. в Replace with вводится просто: \1 = \0</description>
  <comments>http://bydlokoder.livejournal.com/3293.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/2865.html</guid>
  <pubDate>Mon, 08 Sep 2008 11:42:25 GMT</pubDate>
  <title>Блокировка файла по имени</title>
  <link>http://bydlokoder.livejournal.com/2865.html</link>
  <description>В данный момент разрабатываю небольшую подсистему логирования. Возникла проблема - при много поточной записи в файл лога легко возможна ситуация с конфликтом доступа:&lt;br /&gt;&lt;br /&gt; &lt;em&gt;IO exception while trying to write into file log:The process cannot access the file bla-bla-bla&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Есть стандартное решение проблемы - добавить объект для блокировки:&lt;br /&gt;&lt;br /&gt;        private object _fileLock = new object();&lt;br /&gt;...&lt;br /&gt;        lock(_fileLock){...}&lt;br /&gt;Но, оказывается, в данном случае можно обойтись и без него. Дело в том, что в .NET строка - immutable object, то есть две строки с одинаковым значением всегда ссылаются на один и тот же объект. Поэтому &lt;br /&gt;         lock (CurrentFileName)&lt;br /&gt;Вполне работает.</description>
  <comments>http://bydlokoder.livejournal.com/2865.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/2647.html</guid>
  <pubDate>Mon, 08 Sep 2008 11:26:30 GMT</pubDate>
  <title>[HUMOR] Работа для истинного быдлокодера</title>
  <link>http://bydlokoder.livejournal.com/2647.html</link>
  <description>&lt;a href=&quot;http://www.getacoder.com/projects/programming_c_87390.html&quot;&gt;&lt;em&gt;I need someone to program me a new OS (Operasting System) that looks different than Ms Windows XP etc. but has the same style. It does not need to run on a mac but all the other PCs. It&apos;s supposed to have a stylish look with clear edges etc. And ITS NOT SUPPOSED TO BE JUST A REDESIGNED WINDOWS as I&apos;m going to sell that operating system later on. &lt;/em&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Обратите внимание на бюджет проекта.</description>
  <comments>http://bydlokoder.livejournal.com/2647.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/2321.html</guid>
  <pubDate>Fri, 22 Aug 2008 15:37:14 GMT</pubDate>
  <title>[C#] Безопасные синглтоны</title>
  <link>http://bydlokoder.livejournal.com/2321.html</link>
  <description>Старенькая, но далеко не потерявшая ещё актуальности статья о реализации потоково-безопасных синглтонов:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.yoda.arachsys.com/csharp/singleton.html&quot;&gt;Implementing the Singleton Pattern in C#&lt;/a&gt;</description>
  <comments>http://bydlokoder.livejournal.com/2321.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/2114.html</guid>
  <pubDate>Wed, 20 Aug 2008 21:33:14 GMT</pubDate>
  <title>[C# 2.0] yield return - особая уличная магия</title>
  <link>http://bydlokoder.livejournal.com/2114.html</link>
  <description>yield операторы, на мой взгляд - одно из самых прекрасных нововведений в C# 2.0 . Хотя есть информация, что для программистов Ruby и Python такой подход не внове.&lt;br /&gt;Что такое yield return? Кратко - возврат результата без потери контекста функции. При этом на базе функции автоматически создается итератор, который будет выполнять необходимый код при каждом переходе к следующему элементу коллекции.&lt;br /&gt;Сейчас я чувствую себя слишком усталым для подробного теоретического раскрытия темы, поэтому приведу лучше пару примеров, реализованных при помощи этого оператора:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример 1&lt;/b&gt;. Итерация по нескольким коллекциям без создания промежуточной коллекции:&lt;br /&gt;&lt;br /&gt;       &lt;blockquote&gt;private IEnumerable JoinCollections(params IEnumerable[] colls)&lt;br /&gt;        {&lt;br /&gt;          &lt;blockquote&gt;foreach (IEnumerable col in colls)&lt;br /&gt;            {&lt;br /&gt;             &lt;blockquote&gt;foreach (object obj in col)&lt;br /&gt;                {&lt;br /&gt;                   &lt;blockquote&gt;yield return obj;&lt;/blockquote&gt; }&lt;/blockquote&gt;             }&lt;br /&gt;            yield break;&lt;/blockquote&gt;         }&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Вызов этой функции для коллекций:&lt;br /&gt;   &lt;blockquote&gt;string[] a = new string[] { &quot;a1&quot;, &quot;a2&quot;, &quot;a3&quot; };&lt;br /&gt;            string[] b = new string[] { &quot;b1&quot;, &quot;b2&quot;};&lt;br /&gt;            string[] c = new string[] { &quot;c1&quot;, &quot;c2&quot;,&quot;c3&quot;,&quot;c4&quot; };&lt;br /&gt;&lt;br /&gt;            foreach (string s in JoinCollections(a, b, c))&lt;br /&gt;            {&lt;br /&gt;                &lt;blockquote&gt;System.Diagnostics.Trace.WriteLine(s);&lt;/blockquote&gt;&lt;br /&gt;            }&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;Даст следующий результат:&lt;br /&gt;a1&lt;br /&gt;a2&lt;br /&gt;a3&lt;br /&gt;b1&lt;br /&gt;b2&lt;br /&gt;c1&lt;br /&gt;c2&lt;br /&gt;c3&lt;br /&gt;c4&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример 2&lt;/b&gt;.   &quot;Отложенная сортировка&quot;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;код..&quot;&gt;Введите содержимое врезки&lt;br /&gt;private IEnumerable YieldSorting(List&amp;lt;int&amp;gt; array)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int min = Int32.MaxValue;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int? prevMin = null;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int count = 0;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int totalCount = array.Count;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int resultCount = 0;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(resultCount&amp;lt;totalCount)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (int val in array)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(prevMin.HasValue &amp;amp;&amp;amp; val&amp;lt;=prevMin)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val &amp;lt; min)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; min = val;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = 1;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (val == min) count++;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; count; i++)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield return min;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; resultCount += count;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prevMin = min;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; min = Int32.MaxValue;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;</description>
  <comments>http://bydlokoder.livejournal.com/2114.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/2046.html</guid>
  <pubDate>Mon, 18 Aug 2008 20:56:19 GMT</pubDate>
  <title>[SQL Server 2005] Случайная выборка - 3.</title>
  <link>http://bydlokoder.livejournal.com/2046.html</link>
  <description>Вновь на тему.&lt;br /&gt;В предыдущих выпусках были рассмотрены два способа получить случайную выборку из таблицы.&lt;br /&gt;Напомню, самый распространенный (и неправильный для больших объемов данных) - ORDER BY NEWID(). Это не мудренно, так как подразумевается ПОЛНАЯ сортировка таблицы. EPIC FAIL, если число записей исчисляется миллионами.&lt;br /&gt;Затем идет способ с генерацией временной таблицы случайных id и join&apos;ом на эту таблицу. Этот способ существенно быстрее, но несколько громоздок в исполнении. Преимущество он дает в том случае, когда поле join&apos;а является кластеризованным индексом - обычным, наверное, тоже может быть неплохо - но на кластеризованном мы получаем впечатляющие результаты.&lt;br /&gt;Но этим ли исчерпывается наше стремление к совершенству?&lt;br /&gt;Красиво выглядит такая конструкция, не правда ли?&lt;br /&gt;&lt;blockquote&gt;select top 50000 * from dbo.test1 where id % 10 = checksum(newid()) % 10&lt;/blockquote&gt;&lt;br /&gt;Да и скорость впечатляет, потому что здесь также применяется clustered index scan.&lt;br /&gt;Но, к сожалению, в этом бочонке меда не без ложечки дегтя.&lt;br /&gt;Во-первых, нужно вручную подбирать делитель, остаток от которого мы используем, для определения среднего размера &quot;шага&quot; по выборке.&lt;br /&gt;Во-вторых, что более важно, этот запрос содержит ошибку.&lt;br /&gt;Если запустить его на тестовом наборе данных размером 7 млн. записей, например, обнаружится, что в выборку попадут только записи из первых 900 тысяч.&lt;br /&gt;А как же остальные?&lt;br /&gt;А они не попали в выборку, потому что требуемое число записей неизбежно накапливается раньше полного прохода.&lt;br /&gt;По условию же задачи нам нужны случайные элементы из &lt;b&gt;всей&lt;/b&gt; таблицы.&lt;br /&gt;Но этот вопрос решаемый:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;declare @count int&lt;br /&gt;set @count = (select count(*) from dbo.test1)&lt;br /&gt;&lt;br /&gt;declare @step int&lt;br /&gt;set @step = @count/50000;&lt;br /&gt;&lt;br /&gt;select top 50000 * from dbo.test1 where id % @step = checksum(newid()) % @step&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Вуаля! Наш запрос ничем не уступает по скорости варианту два, но при этом гораздо лаконичнее.&lt;br /&gt;&lt;br /&gt;Похоже, мы практически познали дао случайной выборки.</description>
  <comments>http://bydlokoder.livejournal.com/2046.html</comments>
  <category>sql</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/1691.html</guid>
  <pubDate>Sun, 17 Aug 2008 11:42:58 GMT</pubDate>
  <title>[C# 2.0] Анонимус не прощает</title>
  <link>http://bydlokoder.livejournal.com/1691.html</link>
  <description>Когда я устанавливал на sql сервер свою сборку, всплыл еще один забавный факт.&lt;br /&gt;Сборка ставилась с уровнем доступа SAFE, а этот уровень доступа не позволяет использовать статические переменные класса, если они не объявлены как readonly. И я получил следующее сообщение:&lt;br /&gt;&lt;font face=&quot;Verdana, Arial, Helvetica&quot; size=&quot;2&quot;&gt;&lt;br /&gt;&lt;/font&gt;&lt;blockquote&gt;&lt;font face=&quot;Verdana, Arial, Helvetica&quot; size=&quot;2&quot;&gt; &quot;CREATE ASSEMBLY failed because method &apos;.ctor&apos; on type &apos;StoredProcedures&apos; in   &lt;/font&gt;&lt;br /&gt;&lt;font face=&quot;Verdana, Arial, Helvetica&quot; size=&quot;2&quot;&gt; safe assembly &apos;SomeAssembly&apos; is storing to a static field. Storing to a static   &lt;/font&gt;&lt;br /&gt;&lt;font face=&quot;Verdana, Arial, Helvetica&quot; size=&quot;2&quot;&gt; field is not allowed in safe assemblies.&quot; &lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Проблема же была в том, что класс не использовал не одного статического поля.&lt;br /&gt;Конструктор, однако, содержал определение анонимного делегата - приблизительно такого вида:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; delegate int SomeDelegate();&lt;br /&gt;&lt;br /&gt;    class XClass&lt;br /&gt;    {&lt;br /&gt;        &lt;br /&gt;        public XClass()&lt;br /&gt;        {&lt;br /&gt;            SomeDelegate myDelegate = delegate&lt;br /&gt;            {&lt;br /&gt;                return 0;&lt;br /&gt;            };&lt;br /&gt;&lt;br /&gt;            RegisterDelegate(myDelegate);&lt;br /&gt;        }&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Использование рефлектора подтверждает все догадки:&lt;br /&gt;1. Это само тело определенного нами анонимного метода. Пока ничего военного - статические методы использовать можно.&lt;br /&gt;&lt;blockquote&gt;[CompilerGenerated]&lt;br /&gt;private static int &amp;lt;.ctor&amp;gt;b__0()&lt;br /&gt;{&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;/blockquote&gt;2.А это что? Без нашего на то желания компилятор сгенерил нам статическое поле класса.&lt;br /&gt;[CompilerGenerated]&lt;br /&gt;&lt;blockquote&gt;private static SomeDelegate &amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate1;&lt;/blockquote&gt;&lt;br /&gt;3. Ну и при просмотре кода конструктора в режиме IL наши опасения полностью подтверждены:&lt;br /&gt;&lt;blockquote&gt;ldsfld class SomeNS.SomeDelegate SomeNS.XClass::&amp;lt;&amp;gt;9__CachedAnonymousMethodDelegate1&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Так то!</description>
  <comments>http://bydlokoder.livejournal.com/1691.html</comments>
  <category>c# 2.0</category>
  <category>грабельки</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://bydlokoder.livejournal.com/1488.html</guid>
  <pubDate>Sat, 16 Aug 2008 14:20:41 GMT</pubDate>
  <title>[SQL Server 2005] Случайная выборка - 2.</title>
  <link>http://bydlokoder.livejournal.com/1488.html</link>
  <description>&lt;a href=&quot;http://bydlokoder.livejournal.com/911.html?thread=399#t399&quot;&gt;Вот здесь&lt;/a&gt; мне справедливо указали на недостаток этого распространенного решения.&lt;br /&gt;Действительно, оно далеко не оптимально по производительности.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt; &lt;blockquote&gt;declare @count int&lt;br /&gt;set @count = (select count(*) from dbo.test1)&lt;br /&gt;&lt;br /&gt;declare @t TABLE(rowNum int)&lt;br /&gt;declare @counter int&lt;br /&gt;	&lt;br /&gt;set @counter = 0&lt;br /&gt;while @counter &amp;lt; 50000&lt;br /&gt;begin&lt;br /&gt;  set @counter = @counter + 1&lt;br /&gt;  insert into @t (rowNum) values (rand()*@count)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;select distinct master.id,master.* from @t temp&lt;br /&gt;join (select *,Row_Number() OVER(ORDER BY id) [row] from dbo.test1) master&lt;br /&gt;on master.row=temp.rowNum&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Здесь меня смущает два фактора: во-первых некоторая тяжеловесность всей конструкции, требующая помещения в отдельную сторед процидурку, во-вторых - необходимость сортировки для получения Row_Number().&lt;br /&gt;Тем не менее время выборки на таблице в 7 млн. записей - в пять раз меньше, что для исходного варианта.&lt;br /&gt;&lt;br /&gt;UPD: Самый эффективный на сегодняшний момент вариант:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;declare @rnd int;&lt;br /&gt;set @rnd = checksum(newid()) % 10&lt;br /&gt;&lt;br /&gt;select top 10000 * from dbo.test1 where checksum(id) % 10 = @rnd&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Здесь id - GUID.&lt;br /&gt;&lt;br /&gt;UPD1: С предыдущим примером тоже есть свои проблемы...</description>
  <comments>http://bydlokoder.livejournal.com/1488.html</comments>
  <category>sql</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
