T-SQL.RU


ALTER TABLE SWITCH statement failed. Check constraints or partition function of source table [XXX] a

Любой разработчик, который рано или поздно начинает работать с секционированными таблицами, может столкнуться при переключении секций на ошибку в формате

Msg 4972, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed. Check constraints or partition function of source table [XXX] allows values that are not allowed by check constraints or partition function on target table [YYY].


Сейчас я покажу одну из самых частых причин подобных ошибок!

Для начала создадим тестовую функцию и схему секционирования, в которой будет всего 5 "отрезков" с данными, которые мы будем хранить:

create partition function pf_dt ( datetime )
as range left for values ( '20140101', '20140102', '20140103' );
go

create partition scheme ps_dt 
as partition pf_dt all to ([primary]);
go

Т.к. у нас ранжирование LEFT, то схематически наше секционирование можно представить в виде рисунка ниже:

Точки, по которым идёт разбиение на секции буду принадлежать левому отрезку (опять же, т.к. у нас range left), кроме того, все строки, которым соответствуют значения NULL столбца секционирования, располагаются в самой левой секции, кроме случая, когда задано пустое граничное значение и параметр RIGHT. В данном случае самая левая секция является пустой, и в нее помещаются значения NULL.

Теперь создадим тестовую таблицу на нашей схеме секционирования:

create table tbl_test( id int, dt datetime, val varchar(50) ) on ps_dt(dt);
go

И создадим временную таблицу без схемы, которую мы попытаемся пер...

читать дальше...
добавлено: 04 апр 15 просмотры: 325, комментарии: 1



Индексы в табличных переменных

Сегодня я немного расскажу о том, как создать индексы на табличных переменных (это которые @table) в SQL Server 2014 и в ранних версиях. При этом я не буду останавливаться на том, зачем нужны индексы и не буду сравнивать табличные переменные с временными таблицами, т.к. на эту тему достаточно статей, например: http://www.sql-server-performance.com/2007/temp-tables-vs-variables/ или http://www.mssqltips.com/sqlservertip/2825/sql-server-temp-table-vs-table-variable-performance-testing/. При этом сразу оговорюсь, что одним из недостатков табличных переменных было именно отсутствие возможности явно создать индекс. Но давайте по порядку.

В SQL Server 2012 и ниже мы действительно не можем явно создать индекс на нужном нам поле (полях), но существует несколько приёмов с созданием индексов через ограничения (PRIMARY KEY и UNIQUE). Пример ниже:

declare @table table ( id int primary key
                     , a  varchar(10)
                     , b  datetime
                     , c  money
                     , unique (a,c)
                     );

select * from @table where id > 0;

select a, c from @table where a is not null;

И всё бы хорошо, но как создать неуникальный индекс? И вот теперь, начиная с SQL Server 2014 это стало возможно и в синтаксис добавили создание индекса на табличных переменных.

declare @table table ( id int primary key 
                     , a  varchar(10)
                     , b  datetime  
                     , c  money
  ...
читать дальше...
добавлено: 19 мар 15 просмотры: 488, комментарии: 1



Секционированные представления и магические 64 таблицы

Хочу показать на живом примере, как план запроса может меняться в зависимости от того, сколько таблиц фигурирует в секционированном представлении (или просто в запросе). При этом и производительность может существенно "просесть" на таких запросах. Пример из реальной жизни, но с тестовыми данными.

Ситуация воспроизводится на разных версиях SQL Server, в том числе и на версии SQL Server 2014.

Но прежде нам необходимо создать несколько объектов (100 таблиц и 1 представление).

use tempdb;
go
set nocount on;
go
------------
--В динамике создаём 100 таблиц с чеками, в каждую таблицу вставляю по 100 записей
------------
declare @cmd varchar(4096)
      , @i int = 1
      , @dt datetime = '20140101';

while @i <= 100
begin
set @cmd = ' create table dbo.tbl_' + right( '00' + cast( @i as varchar ), 3 ) 
         + ' ( id uniqueidentifier, dt datetime '
         + ' , constraint ck_' + right( '00' + cast( @i as varchar ), 3 ) 
         + ' check ( dt >= ' + quotename ( convert( varchar, @dt, 126 ),'''' ) 
         + ' and dt < ' + quotename ( convert( varchar, @dt + 1, 126 ),'''' ) + ' )'
         + ' , constraint pk_' + right( '00' + cast( @i as varchar ), 3 )
         + ' primary key( dt, id )' 
         + ' );';
exec ( @cmd );
 
set @cmd = ' insert into dbo.tbl_' + right( '00' + cast( @i as varchar ), 3 ) 
         + ' select top 100 newid(), dateadd( mi, t1.number, ' + quotename ( convert( varchar, @dt, 126 ),'''' ) 
         + ' ) from master....
читать дальше...
добавлено: 19 фев 15 просмотры: 870, комментарии: 1





Очередная раздача книг по SQL Server (Microsoft_eBooks)


Troubleshooting
SQL Server
AlwaysOn

5 Tips for a Smooth
SSIS Upgrade to
SQL Server 2012

A Hitchiker's Guide
to Microsoft StreamInsight
Queries

Data Mining Extensions
(DMX) Reference

Data Quality Services

High Availability
Solutions

Master Data Services

Monitor and Tune
for Performance

Multidimensional
Expressions (MDX)
Reference

SQL Server Distributed
Replay

Transact-SQL Data
Definition Language
(DDL) Reference

XQuery Language
Reference

Integration Services:
Extending Packages
with Scripting

Multidimensional Model
Programming

SQL Server 2012 Tutorials:
Reporting Services

SQL Server 2012 Tutorials:
Writing Transact-SQL
Statements

SQL Server Community
FAQs Manual

SQL Server 2012
Tutorials: Analysis
Services - Tabular
Modeling

Microsoft SQL Server
AlwaysOn Solutions
Guide for High
Availability and Disaster
Recovery

Transact-SQL Data
Manipulation Language (DML)
Reference

QuickStart: Learn DAX
Basics in 30 Minutes

SQL Server 2012
Tutorials: Analysis
Services - Data Mining

Microsoft SQL Server
Analysis Services
Multidimensional
Performance and
Operations Guide

Data Analysis
Expressions (DAX)
Reference

SQL Server 2012
Upgrade Technical
Guide

Backup and Restore of
SQL Server Databases

SQL Server 2012
Tutorials: Analysis
Services -
Multidimensional
Modeling

Master Data Services
Capacity Guidelines

Optimized Bulk Loading
of Data into Oracle

Planning Disaster
Recovery for Microsoft
SQL Server Reporting
Services in ...
читать дальше...
добавлено: 13 июл 14 просмотры: 2002, комментарии: 0



SQL Server 2014

добавлено: 11 апр 14 просмотры: 1286, комментарии: 0



T-SQL - язык года (2013)

По итогам 2013-ого года T-SQL был признан языком года (по результатам исследований "TIOBE Software"). При этом за прошедший год популярность языка выросла более чем на 12 пунктов и Transact-SQL вошёл в десятку самых популярных языков в мире. По итогам 2012-ого года он находился всего лишь на 22 месте.

Что касаемо PL/SQL, то он тоже имеет положительный тренд по итогам года и его популярность увеличилась с 21 места до 17-ого, но при этом он всё-таки значительно уступает T-SQL.

Общий результат TOP20 популярности языков программирования на январь 2014 года ниже:

 

И для полноты картины языки-лидеры за последние 10 лет:

 

читать дальше...
добавлено: 31 янв 14 просмотры: 1910, комментарии: 0



eBooks: бесплатные книги по SQL Server

Большая коллекция бесплатных книг по SQL Server от лучших экспертов по базам данных. Коллекция постоянно пополняется и эта страница будет периодически обновляться.

 

 

 

 

SQL Development
SQL Server Execution Plans
SQL Server Execution Plans Every day, out in the various online forums devoted to SQL Server, and on Twitter, the same types of questions come up repeatedly: Why is this query running slowly? Why is SQL Server ignoring my index? Why does this query run quickly sometimes and slowly at others? My response is the same in each case: have you looked at the execution plan?
An execution plan describes what's going on behind the scenes when SQL Server executes a query. It shows how the query optimizer joined the data from the various tables defined in the query, which indexes it used, if any, how it performed any aggregations or sorting, and much more. It also estimates the cost of all of these operations, in terms of the relative load placed on the system.
Every Database Administrator, developer, report writer, and anyone else who writes T-SQL to access SQL Server data, must understand how to read and interpret execution plans. My book leads you right from the basics of capturing plans, through how to interrupt them in their various forms, graphical or XML, and then how to use the information you find there to diagnose the most common causes of poor query performance, and so optimize your SQL queries, and improve your indexing strategy.
Inside the SQL Server ...
читать дальше...
добавлено: 21 янв 14 просмотры: 2982, комментарии: 1



SSIS: ReplaceNull

Одной из частовозникающих задач в пакетах SSIS является замена значений NULL на какое-то конкретное значение. К сожалению, прежде это была не совсем тривиальная задача, т.к. в Integration Services не было оператора аналогичного оператору ISNULL() в языке T-SQL. Точнее даже так: оператор такой есть, но работает он немного иначе.
ISNULL (SSIS) - Возвращает результат в виде логического выражения, в зависимости от того, имеет ли выражение значение NULL.

Поэтому для задачи, в которой основное требование было обработать значения NULL и вывести вместо них значение 0 (ноль), решалась следующим скриптом:

(ISNULL(OpPriceAir) ? (DT_CY)0 : OpPriceAir) + (ISNULL(OpPriceExt) ? (DT_CY)0 : OpPriceExt)



С выходом SQL Server 2012 всё меняется, т.к. в SSIS появился новый оператор REPLACENULL. И теперь та же задача решается следующим образом:

REPLACENULL(OpPriceAir,0) + REPLACENULL(OpPriceExt,0)



Мелочь, но приятно.

читать дальше...
добавлено: 01 янв 14 просмотры: 932, комментарии: 0



SQL Server 2014: Параллельная операция SELECT INTO

SQL Server 2014Совсем недавно в общем доступе появилась версия SQL Server 2014 CTP1 - http://technet.microsoft.com/ru-ru/evalcenter/dn205290.aspx.
Microsoft SQL Server 2014 представляет на рынке новые возможности памяти, встроенные в основную базу данных, включая встроенную в память оперативную обработку транзакций (OLTP), дополняющую существующие возможности бизнес-аналитики и хранения данных в памяти, для создания самого многофункционального решения хранящейся в памяти базы данных. SQL Server 2014 также предлагает новые облачные возможности, позволяющие упростить перемещение существующих баз данных SQL в облако и открыть для себя новые сценарии гибридного развертывания.

Поэтому пора начать смотреть, что нового, что интересного нас ждёт в новой версии самой популярной промышленной СУБД.

Говоря о новинках стоит обратиться к ряду документов, которые так же появились в общем доступе:


Но обо всём по порядку, и начнём с одной очень интересной возможности, которая появилась в SQL Server 2014 - это параллельное выполнение операции SELECT...INTO.

Тесту буду проводить на 2-х версиях:

SQL Server 2012

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
	Dec 28 2012 20:23:12 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1  
         (Build 7601: Service Pack 1)

SQL Server 2014 CTP1

Microsoft SQL S...
читать дальше...
добавлено: 08 авг 13 просмотры: 2098, комментарии: 0