• В чем разница объявления таблицы через @ и через # в ms sql?

    AlanDenton
    @AlanDenton
    SQL Server DBA
    # - локальная временная таблица и видима только в текущем соединении
    ## - глобальная временная таблица и видна во всех соединения
    @ - табличная переменная видна в только в текущем батче

    Кто бы не говорил, но на физическом это все таблицы, которые создаются и хранятся в tempdb. С точки зрения разница между ними... она действительно есть. Во первых, на табличных переменных нет статистики и ожидаемое количество строк всегда равно 1. При большом числе строк в итоге оптимизатор может генерировать не сильно оптимальные планы. Кроме того, табличные переменные мешают использовать оптимизатором параллельный план выполнения. Минимально логируются и не поддерживают транзакции.

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

    AlanDenton
    @AlanDenton
    SQL Server DBA
    Вначале нужно определиться с тем, что Вы хотите построить. Судя по Вашему описанию это будет Data Warehouse. Если Вам нужно делать сложный анализ, то выбирать можно среди SQL Server и Oracle. Данныt СУБД имеют очень хороший оптимизатор запросов и много разных функций по аналитике. Плюс в SQL Server (про оракл не скажу точно) есть columnstore индексы, которые в Вашем случае могут снизить размер Вашего файлового хранилища. Много чего можно еще сказать, но задача Вами поставлена размыто (какой прирост данных, структура и тд)

    Если заморачиваться с реляционностью не сильно хочется, то обратите внимание на NoSQL.
    Ответ написан
    Комментировать
  • Получение всех связанных «родительских» таблиц MSSQL Server 2008 r2

    AlanDenton
    @AlanDenton
    SQL Server DBA
    На днях, в нашем dbForge мы как раз решали эту же проблему. Я немного упростил поиск, чтобы он подходил под начальные условия. Надеюсь, что это решит Вашу проблему:

    DECLARE @tables TABLE ([object_id] INT PRIMARY KEY)
    INSERT INTO @tables ([object_id])
    SELECT OBJECT_ID('dbo.Table1', 'U')
    
    DECLARE @rows INT = 1
    
    WHILE @rows > 0 BEGIN
    	
    	SET @rows = 0
    
    	INSERT INTO @tables ([object_id])
    	SELECT fk.parent_object_id
    	FROM @tables t
    	JOIN sys.foreign_keys fk WITH(NOLOCK) ON fk.referenced_object_id = t.[object_id]
    	WHERE NOT EXISTS(
    			SELECT 1
    			FROM @tables t2
    			WHERE t2.[object_id] = fk.parent_object_id
    		)
    
    	SELECT @rows = @rows + @@ROWCOUNT
    
    END
    
    SELECT [object_name] = OBJECT_NAME([object_id])
    FROM @tables
    
    Ответ написан
    Комментировать
  • Получение всех связанных «родительских» таблиц MSSQL Server 2008 r2

    AlanDenton
    @AlanDenton
    SQL Server DBA
    Этот скрипт должен помочь:

    ;WITH cte AS
    (
    	SELECT parent_object_id = OBJECT_ID('dbo.Table1', 'U')
    
    	UNION ALL
    
    	SELECT fk.parent_object_id
    	FROM cte t
    	JOIN sys.foreign_keys fk ON t.parent_object_id = fk.referenced_object_id
    )
    SELECT OBJECT_NAME(parent_object_id)
    FROM cte
    
    Ответ написан
    1 комментарий