Иногда приходится сожалеть о том, что в Transact-SQL Microsoft SQL Server нет
такой структуры как Array (массив). Многие программисты SQL поддержат меня.
Массив - одна из наиболее общих и часто используемых структур программирования.
Действительно, T-SQL не предусматривает полностью функциональную структуру
массива. Однако SQL 2000 ввел новую возможность, называемую переменной
табличного типа, которая позволяет имитировать массив и/или использоваться
вместо курсора в SQL Server.
Одним из вопросов, все чаще обсуждаемых мной в последние дни с клиентами или
администраторами/разработчиками баз данных, является создание такой политики
компании, которая бы описывала ряд стандартов, которым должны следовать при
создании хранимых процедур для SQL server. С одной стороны, политика стандартов
уровня компании или подразделения не должна быть столь ограничительной или
"высеченной на камне", чтобы душить всякий творческий потенциал, который часто
необходим для решения требований бизнеса, стоящих перед разработчиками. С
другой стороны, она должна обеспечить такие рекомендации, которые ограничивали
стиль кодирования таким образом, чтобы он не создавал проблем безопасности,
падения производительности или проблем обслуживании в будущем.
Если хранимая процедура удовлетворяет следующим критериям, она является хорошим
кандидатом на то, чтобы переписать ее в виде табличнозначной функции:
Логика выражается единственным оператором SELECT, однако хранимая процедура
только потому используется вместо представления, что необходимы параметры. Вот
как можно поступить.
Вы можете вызывать скалярнозначные функции в предложениях WHERE или HAVING.
Если вы имеете таблицу employee, которая содержит годовую зарплату для одних
сотрудников и почасовую оплату для других, и если вы хотите выполнить запрос,
который использует недельную зарплату в качестве фильтра, вы можете создать
UDF, которая вернет недельную зарплату как функцию классификации (годовая или
почасовая). Запрос может выглядеть следующим образом, где weekly
- имя UDF:
В Microsoft SQL Server 2000 появился новый тип table, используемый в языке
Transact-SQL. Тип table подобен временным таблицам. Тип table можно
использовать с целью сохранения результирующего набора для последующей
обработки. Тип table можно использовать только для определения локальных
переменных данного типа и возврата значения из функции пользователя. Основное
использование типа table – временное хранилище для набора строк, которые
возвращаются как результирующий набор таб-личнозначной функции.
Вашему приложению может потребоваться индекс на основе длинной строки символов или,
что еще хуже, конкатенации двух строк или строки и одного-двух целых чисел. Для
небольшой таблицы вы можете не заметить какого-либо отрицательного влияния
такого индекса. Но если предположить, что рассматриваемая таблица содержит 50
миллионов записей? Теперь вы не сможете не заметить воздействия, которое
скажется как на требованиях к хранению, так и к производительности поиска.
Проблема, с которой я столкнулся, довольно известна. Я имею два
триггера, которые должны отработать в предопределенном порядке, т.е.
триггер A должен выполниться сначала, а после него должен отработать
триггер B. Вы можете поинтересоваться, а почему бы не иметь один
триггер, который объединит триггеры A и B в один триггер AB? Хороший
вопрос. К сожалению, триггер A используется для репликации (For
Replication), в то время как более поздний триггер - не для репликации,
что определяет наличие именно двух триггеров.
Временные таблицы всегда прекрасно помогали разработчикам. Раньше, когда я использовал
Access, я обычно создавал временные таблицы, которые удалял после решения задачи.
При использовании SQL Server решить задачу можно гораздо проще. Не так ли?
Каждая инсталляция SQL Server устанавливает несколько системных баз данных.
Согласно предписаниям покойного доктора Э. Ф. Кодда, информация о базе данных
должна быть доступна с использованием тех же самых команд, с помощью которых вы
запрашиваете данные из собственных баз данных. Может ли быть лучший способ
выполнить это назначение, чем хранить системную информацию в некоторой базе
данных?
Вам поручают создать запрос в SQL Server, содержащий нарастающие итоги на момент
наступления события. Классическим примером является счет в банке.
Для каждого заданного счета вы суммируете дебиты (депозиты) и кредиты (снятие средств)
на данный момент времени. После каждой транзакции Вы хотите знать текущий баланс.
В листинге А приводится простой пример создания такой таблицы.
Вам необходимо многократно передавать табличный результат в хранимую процедуру.
Несмотря на то, что SQL Server 2000 и SQL Server 2005 имеют тип данных, который
называется табличной переменной, Вы не можете использовать ее как параметр в хранимых
процедурах. Начиная с версии SQL 2000, Microsoft все в большей мере поддерживает
XML. Я знаю, что большинство из Вас уже использовало XML или, по крайней мере, много
слышало о XML; однако я не хочу углубляться в XML, а лишь хочу показать Вам варианты
его использования.
Эта статья появилась как ответ на предложение
Артура Фуллера (Arthur Fuller) использовать
хэш-функции в базах данных.
Что предлагает А.Фуллер?
"Вашему приложению может потребоваться индекс на основе длинной строки символов
или, что еще хуже, конкатенации двух строк или строки и одного-двух целых чисел.
Для небольшой таблицы вы можете не заметить какого-либо отрицательного влияния такого
индекса. Но если предположить, что рассматриваемая таблица содержит 50 миллионов
записей? Теперь вы не сможете не заметить воздействия, которое скажется как на требованиях
к хранению, так и к производительности поиска.
Однако вам не обязательно так поступать. Есть очень простая альтернатива, использующая
то, что еще известно под названием хэш-блоков или хэш-ключей."
В T-SQL имеются ограниченные возможности по сравнению текстовых строк. Они являются
либо равными, либо нет. Рано или поздно, обычно при очистке данных, требуется нечто
более тонкое! Когда Вы сравниваете два фрагмента текста или две строки в выражении на SQL Server,
Вы получите только значение 'true', которое возвращается, если эти два фрагмента
совпадают, 'false', если - нет, или 'null' ('unknown' - прим. переводчика), если
один из сравниваемых фрагментов был null. Всего лишь одного лишнего символа пробела достаточно, чтобы склонить чашу весов.
Это весьма не похоже на действительность - если мы смотрим на два фрагмента текста,
мы оцениваем их как одинаковые, почти одинаковые, близкие, совсем непохожие, и еще
много промежуточных оттенков. Итак, нам нужно оценить различия?
Функции ISNULL (MS SQL Server), NVL (Oracle) используются, чтобы заменить NULL-значения
некоторым другим значением, когда требуется как-то иначе обработать NULL-значение.
Функция COALESCE() - обобщенная форма функции NVL() или ISNULL() и входит в стандарт
ANSI, в то время как остальные представляют собой функции, реализованные в Oracle/SQL
Server. Эта функция имеется во всех ведущих РСУБД (Oracle, SQL Server и DB2). Основное
различие между COALESCE и ее конкурентами состоит в том, что COALESCE возвращает
первое не NULL-значение, и может иметь более 2-х выражений или значений в качестве
аргументов, в то время как ISNULL или NVL принимают только два аргумента. Первый
аргумент - это выражение или название столбца, а второй аргумент - выражение или
константа, которой мы хотим заменить первый аргумент, если он NULL. Давайте сначала
создадим таблицу и наполним ее некоторыми данными (в данном примере используется
синтаксис Oracle):
По материалам статьи Q184499 «INF Transaction Log Still Full After DUMP TRAN WITH NO_LOG».
Содержание этой статьи относится к Microsoft SQL Server 6.0, 6.
Intersoft Lab
Microsoft® SQL Server™ 2000 имеет ряд компонент (как показано на
рисунке), позволяющих трансформировать OLTP-данные и предоставлять
OLAP-информацию лицам, принимающим решения.
Татьяна Крамарская
В предлагаемой статье кратко описаны особенности хранения и поиска
текстовых данных в базах SQL Server 2000. Она адресована
администраторам и разработчикам, которые планируют реализовать такой
тип хранения.
Варианты хранения и загрузка текста в таблицы
Для начала стоит вспомнить форму хранения текстовой информации в базе
данных.
Горизонтальные, вертикальные, динамические и join фильтры дают возможность создать разделы данных,
которые потом будут изданы. Фильтруя предназначенные для издания данные, Вы можете:
Татьяна Крамарская, Журнал "Windows 2000 Magazine"
В предлагаемой статье рассматриваются способы получения информации о
физической структуре базы данных, отражение этой структуры в служебных
таблицах и динамика работы SQL Server 7.0 с экстентами.
Я думаю, этот материал будет интересен специалистам, которые знакомы с
документацией по SQL Server 7.
Перевод: Александра Гладченко
В этой статье рассматриваются некоторые важные темы организации репликации Microsoft SQL Server:
топология репликации, типы и агенты репликации. Также обсуждается Merge репликация: как создать
необходимые условия для этого типа репликации и как резервировать и восстановить базы данных при
таком сценарии репликации.
Brian Noyes
ADO.NET позволяет вам легко оформить несколько обращений к БД в
виде одной транзакции. Однако программисты часто неохотно используют такой
подход, поскольку они полностью не понимают взаимодействие между транзакциями,
объявленными в коде ADO.NET и транзакциями, использующимися в хранимых
процедурах (ХП).
Кэлен Дилани
Может ли файл readme предоставить дополнительную оперативную память?
При работе с версиями SQL Server, которые предшествовали SQL Server
7.0, системный администратор (sa) был вынужден выделять фиксированный
объем оперативной памяти для нужд самого SQL Server. Этот объем нельзя
было изменить, не останавливая работу SQL Server.
Информация в этой статье относится к версиям Microsoft SQL Server 4.2x, 6.0, 6.5, 7.0
В критических ситуациях, база данных может быть представлена Вам, как SUSPECT, из-за завершения неудачей
её восстановления во время старта сервера, причём обычно, это препятствует любому доступу клиентов к данным.
Перевод Александра Гладченко
Max degree of parallelism (DOP) - дополнительна опция
конфигурации SQL Server, с которой связано много вопросов и
которой посвящено множество публикаций.
InterBase обеспечивает уникальный тип данных
называемый Многоразменый Массив (Multi Dimensional Array
[MDA]). Тип MDA не реализован ни в одной другой РСУБД.
Тип MDA позволяет разработчику зранить массивы
любой длины и до 16 измерений. Поскольку массив
хранится в одном поле, только одна запись и
столбец требуются для выборки данных из массива.
Массивы предоставляют возможность хранения и
представления данных в случаях
В этой стате рассматриваются несколько способов, с помощью которых можно подсчитать количество записей в
таблицах базы данных MS SQL Server
Способ 1: Поскольку приведенный ниже sql-код для подсчета количества записей использует
таблицу sysindexes, его результат зависит от того, была ли обновлена статистика.
T-SQL:
select substring(o.name, 1, 30) Table_Name ,i.
По материалам статьи Alexander Chigrik на SWYNK.COM: "Data Validation
for Merge Replication"
Microsoft SQL Server 7.0/2000 позволяет Вам проверять предназначенные
для Merge репликации данные. Вы можете определить только rowcount
(число строк, на которые воздействовал последний запрос) для проверки
данных статьи или rowcount и сверку контрольной суммы.
По материалам статьи Andy Warren на SWYNK.COM: "Transactional Replication - Running in Non-Continous Mode"
Если Вы использовали репликацию транзакций, Вы вероятно обратили внимание на одну из устанавливаемых
в мастере опций, где Вы должны выбрать или непрерывный или планируемый по расписанию запуск
агента дистрибуции.
Кэлен Дилани, Журнал «SQL Magazine OnLine» Если ни один способ
легального доступа к метаданным, хранящимся в системных таблицах, не
помогает, остается попробовать напрямую обратиться к этим таблицам.
О некоторых стратегиях оптимизатора при построении сложных,
параллельных и распределенных планов А. Шуленин, Журнал "СУБД" Введение
Наверное, не будет большим преувеличением сказать, что процессор
запросов (query processor) является стержневым элементом архитектуры
серверов баз данных. Его эффективность в значительной мере определяет
популярность продукта на рынке СУБД.
Kalen Delaney
Две недокументированные команды помогут разрешить загадку fill-factor
Индексы и fill factor
Сначала, мы должны понять основы того, как организованы индексы. SQL Server организовывает
индексы как Би-дерево, с одной корневой страницей, являющейся отправной точкой для построения
индекса.
Сергей Катков, Для начала нам следут разобраться с понятиями -
весьма модная нынче тема. Я имею ввиду разборки и
понятия. ;) Нам следует убедиться, что мы будем
правильно понимать друг друга и называть
одинаковые вещи одинаковыми именами. Поэтому
определимся с терминами.
По материалам статьи Umachandar Jayachandran на sqlmag.com:
Speeding Up the Query
Поздравляем Кена Хали (Ken Haley), менеджера по разработкам в SPECTRUM Human Resource Systems
(Денвер, Колорадо) и Ивена Стюарта (Ewen Stewart), программного архитектора из Active Media Australia
(Мельбурн, Австралия).
Алексей Банасевич, Алексей Кудинов
Процесс переноса приложений с одной СУБД на другую в общем случае
является трудоемкой задачей, для решения которой полезно прежде
познакомиться с практическим опытом выполнения таких работ. В статье
рассказывается об особенностях переноса системы класса ERP с платформы
Informix On-Line Dynamic Server на Microsoft SQL Server 2000.
При проектировании распределенной базы данных для работы в
гетерогенной среде разработчику всегда приходится решать ряд важных
задач. Одна из них состоит в том, чтобы обеспечить минимум
конфликтов при тиражировании данных.
По материалам статьи Брайан Найт (Brian Knight) на sqlservercentral.com:
"
The Basics of Sizing a SQL Server Database"
Выбор оптимального размера базы данных является непростой задачей, которую должны решать
администраторы, аналитики или разработчики. Анализ базы данных занимает много времени, прежде
чем правильное решение будет найдено.
В этом примере мы рассмотрим возможную ситуация чтения
устаревших данных. Вспомним, что упреждающее чтение в SQL
Server читает большими блоками, но при этом игнорируются
страницы, состояние которых неизвестно. После завершения
чтения, буфер будет немедленно возвращён в свободную область,
и страница считается сохранённой к началу I/O запроса на
упреждающее чтение.
Время жизни "грязных" страниц - страница считается
"грязной", когда имели место изменения её данных. Грязная
страница не может быть удалена из буферного пула SQL Server,
пока вначале связанные с ней записи журнала транзакций и затем
сама страница не будут записаны непосредственно на
долговременный носитель.
Ключевым элементом обеспечения правил ACID является
протокол WAL. Протокол WAL требует, чтобы все записи журнала
транзакций, связанные с относящимися к ним страницами данных,
были сброшены на диск долговременного носителя до того, как
сами страницы данных будут сброшены на диск.
Поскольку на рынке продолжают появляться новые устройства и
решения для дисковых хранилищ, условия, в которых работает
Microsoft SQL Server, стали чрезвычайно разнообразным. Чтобы
гарантировать целостность данных, которые обслуживает SQL
Server, очень важно, что бы подсистема I/O обладала
соответствующими функциональными возможностями. Цель этой
статьи состоит в том, чтобы описать требования к I/O для
операций с файлами баз данных SQL Server, на основании чего
поставщики решений и пользователи могли бы проанализировать и
оптимизировать свои системы с SQL Server.
В этой статье я расскажу, как работает Log Shipping, какие
задания создаются при его на-стройке, как они функционируют,
где хранится системная информация о передаче журналов, а также
немного расскажу, как найти причину ошибки, возникающую в
процессе работы.
В десятилетней истории Microsoft SQL Server выход версии 7.0 можно
охарактеризовать, пожалуй, как наиболее значительный рывок к мощной и в
то же время масштабируемой СУБД и унифицированным средствам обработки
информации.
пер. Гладченко А., sql.ru
По материалам статьи Rahul Sharma на sqlservercentral.com:
"SQL Server 2000 Improvements"
SQL Server 2000 рекламируется как часть интегрированной Internet платформы (Windows DNA),
предназначенная для построения и развёртывания решений, которые интегрируют заказчиков, партнеров,
бизнес процессы и прикладные программы.
Представьте себе, что однажды утром вы приходите на работу, занимаете свое
место за компьютером, вооружившись чашкой кофе и кусочком кекса, открываете
инструментарий управления базой данных и… обнаруживаете, что не можете работать
с экранами и клавиатурой! Как выполнять резервное копирование? Как проверить
блокировку? Где добавлять новых пользователей? Вы просыпаетесь в холодном поту,
тяжело дыша.
Морис Льюис, Журнал "SQL Server Magazine ONLINE"
Администраторам баз данных наверняка приходилось настраивать сервер
базы данных на быструю и эффективную обработку посылаемых приложениями
запросов. Независимо от того, кем было разработано приложение, -
сторонними фирмами или своей командой программистов, на программу лучше
смотреть, как на черный ящик, в котором ничего изменить нельзя.