AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-37243

Riley Major's questions

Martin Hope
Riley Major
Asked: 2023-03-30 22:39:21 +0800 CST

String de conexão do SQL Server - MultiSubnetFailover Verdadeiro ou Sim?

  • 5

A opção MultiSubnetFailover nas strings de conexão do banco de dados controla como o cliente tenta se conectar a um servidor de banco de dados, especialmente quando vários IPs estão disponíveis.

Há documentação conflitante sobre se a sintaxe correta da string de conexão é:

MultiSubnetFailover=Yes

https://learn.microsoft.com/en-us/sql/connect/oledb/features/oledb-driver-for-sql-server-support-for-high-availability-disaster-recovery?view=sql-server- ver16

Ou:

MultiSubnetFailover=True

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery

Ambos "Sim" e "Verdadeiro" são suportados? Ou varia de driver? Se for o último, há uma lista de quais drivers suportam qual sintaxe?

Atualização 2023-03-30:

Esta documentação da Microsoft indica que "Verdadeiro" ou "Sim" funcionará para outra opção:

A configuração padrão para a palavra-chave Persist Security Info é false. Defini-lo como true ou yes permite que informações confidenciais de segurança, incluindo o ID do usuário e a senha, sejam obtidas da conexão depois que a conexão for aberta. Mantenha Persist Security Info definido como false para garantir que uma fonte não confiável não tenha acesso a informações confidenciais da string de conexão.

https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/connection-string-syntax

(enfase adicionada)

sql-server
  • 2 respostas
  • 1372 Views
Martin Hope
Riley Major
Asked: 2021-06-17 07:10:51 +0800 CST

Por que uma pesquisa de chave clusterizada em uma chave primária tem uma alta estimativa de linhas por execução?

  • 10

Temos uma consulta com uma pesquisa de chave que estima milhares de linhas por execução. Pelo que entendi, deve haver apenas uma linha por execução. Entendo que as estatísticas podem ser enganosas, mas o otimizador não entende que uma chave primária seria exclusiva?

A tabela envolvida nesta consulta tem uma chave primária agrupada desta forma:

/****** Object:  Index [PK_Table_Name]    Script Date: 6/16/2021 9:52:12 AM ******/
ALTER TABLE [dbo].[Table_Name] ADD  CONSTRAINT [PK_Table_Name] PRIMARY KEY CLUSTERED 
(
    [Table_Name_ID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO

Pelo que entendi, uma chave primária fornece uma referência exclusiva a uma única linha na tabela.

Portanto, para cada linha encontrada no índice não clusterizado, ele deve ser capaz de usar a referência desse índice ao índice clusterizado para recuperar a única linha necessária para satisfazer o restante da filtragem de consulta para a linha em que está atuando. (Este é um operador de junção de loops aninhados.)

Então, por que estima que quase 4.000 linhas serão retornadas como parte da pesquisa de chave? (Não "para todas as execuções", que em cerca de 36.000.000 é o produto dessas 4.000 e das 9.000 linhas que espera da busca de índice não clusterizado.)

Plano de consulta mostrando linhas grandes por execução para pesquisa de chave

As estatísticas de tempo de execução mostram 2.851 linhas e 2.851 execuções para essa busca de índice clusterizado, que é o que eu esperava.

Estatísticas de tempo de execução mostrando uma linha por execução para busca de índice clusterizado

Caso ajude, isso está no Banco de Dados SQL do Azure, com @@version:

Microsoft SQL Azure (RTM) - 12.0.2000.8 
    Apr 29 2021 13:52:20 
    Copyright (C) 2019 Microsoft Corporation
sql-server query-performance
  • 1 respostas
  • 475 Views
Martin Hope
Riley Major
Asked: 2021-04-23 13:27:28 +0800 CST

O SQL Server 2008 R2 sempre falha com um erro de nível de gravidade 20 com certa manipulação de texto grande?

  • 5

Quando executamos isso em nossas instâncias do SQL Server 2008 R2, sempre causa um erro de gravidade 20. Ele não tem esse problema em nossas instâncias do SQL Server 2016.

Consulta:

DECLARE @v varchar(MAX) = REPLICATE(CONVERT(varchar(max),'a'),524289);
SELECT @v = @v FROM(SELECT 1 AS a) AS b;

Resultado:

Location:    tmpilb.cpp:3256
Expression:  fNoReaderWriterConflict
SPID:        90
Process ID:  1576
Location:    tmpilb.cpp:3306
Expression:  fNoReaderWriterConflict
SPID:        90
Process ID:  1576
Msg 3624, Level 20, State 1, Line 4
A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data corruption. To check for database corruption, consider running DBCC CHECKDB. If you agreed to send dumps to Microsoft during setup, a mini dump will be sent to Microsoft. An update might be available from Microsoft in the latest Service Pack or in a QFE from Technical Support. 
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command.  The results, if any, should be discarded.

SELECT @@VERSION:

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) 
    Aug 19 2014 12:21:34 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

SQLDump0002.txt (do servidor de não produção):

Computer type is Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz.                                                
Bios Version is DELL   - 1                                                                                       
Phoenix ROM BIOS PLUS Version 1.10 2.5.0                                                                         
8 X64 level 8664, 2 Mhz processor (s).                                                                           
Windows NT 6.1 Build 7601 CSD Service Pack 1. 

Memory                               
MemoryLoad = 87%                     
Total Physical = 32762 MB            
Available Physical = 4058 MB         
Total Page File = 65524 MB           
Available Page File = 27332 MB       
Total Virtual = 8388607 MB           
Available Virtual = 8355194 MB       
**Dump thread - spid = 0, EC = 0x00000003EF7E5F00                                                       

 

Isso é um bug nesta versão do SQL Server 2008 R2?

Atualizações:

  • Isso produz um conjunto de arquivos relacionados ao despejo de memória. As seções legíveis para leigos basicamente repetem o resultado do erro acima.
  • Reconhecemos que o SQL Server 2008 R2 é antigo e não tem suporte. Estaremos atualizando.
  • Já resolvemos esse problema definindo a variável de texto grande fora de uma instrução SELECT.
  • Estávamos curiosos se isso acontecia em outros ambientes e queríamos que isso fosse documentado publicamente caso acontecesse com outra pessoa.
sql-server-2008-r2 errors
  • 2 respostas
  • 126 Views
Martin Hope
Riley Major
Asked: 2019-12-28 10:07:58 +0800 CST

Como corrigir o erro de edição das propriedades da etapa do trabalho no SSMS 18?

  • 3

Sempre que tento editar as propriedades de uma etapa de trabalho do SQL Server Agent no SQL Server Management Studio (SSMS) versão 18, o aplicativo gera um erro e não consigo continuar. Como faço para corrigir esse erro?

Link da postagem do UserVoice:

https://feedback.azure.com/forums/908035-sql-server/suggestions/37642465-ssms-18-0-job-properties-window-click-on-step-fa

SSMS versão 18.4:

  • SQL Server Management Studio 15.0.18206.0
  • Ferramentas Cliente do Microsoft Analysis Services 15.0.1567.0
  • Componentes de acesso a dados da Microsoft (MDAC) 10.0.18362.1
  • Microsoft MSXML 3.0 4.0 6.0
  • Microsoft Internet Explorer 9.11.18362.0
  • Microsoft .NET Framework 4.0.30319.42000
  • Sistema operacional 10.0.18362

Texto completo do erro:

===================================

The system cannot find the file specified.

------------------------------
Program Location:

at Microsoft.SqlServer.Dts.Runtime.Application.get_LogProviderInfos()
at Microsoft.DataTransformationServices.DTSExecUI.Controls.LoggingCtrl..ctor(IDTSExecViewManager treePanel)
at Microsoft.SqlServer.Management.SqlManagerUI.DTSJobSubSystemDefinition.InitializeControls()
at Microsoft.SqlServer.Management.SqlManagerUI.DTSJobSubSystemDefinition..ctor(CDataContainer dataContainer, IMessageBoxProvider messageProvider)
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepSubSystems.CreateJobStepSubSystemSsis(AgentSubSystem agentSubSystem, CDataContainer dataContainer, JobStepData data, IMessageBoxProvider messageProvider)
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepSubSystems.CreateJobStepSubSystem(AgentSubSystem agentSubSystem, CDataContainer dataContainer, JobStepData data, IMessageBoxProvider messageProvider, IServiceProvider serviceProvider)
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepSubSystems..ctor(CDataContainer dataContainer, JobStepData data, IMessageBoxProvider messageProvider, IServiceProvider serviceProvider)
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepProperties.get_SubSystems()
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepProperties.FilterStepCombo(DatabaseEngineEdition engineEdition)
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepProperties.InitializeStepCombo()
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepProperties.InitializeData()
at Microsoft.SqlServer.Management.SqlManagerUI.JobStepProperties.OnInitialization()
at Microsoft.SqlServer.Management.SqlMgmt.ViewSwitcherControlsManager.SetView(Int32 index, TreeNode node)
at Microsoft.SqlServer.Management.SqlMgmt.ViewSwitcherControlsManager.SelectCurrentNode()
at Microsoft.SqlServer.Management.SqlMgmt.ViewSwitcherControlsManager.InitializeUI(ViewSwitcherTreeView treeView, ISqlControlCollection viewsHolder, Panel rightPane)
at Microsoft.SqlServer.Management.SqlMgmt.LaunchForm.InitializeForm(XmlDocument doc, IServiceProvider provider, ISqlControlCollection control)
at Microsoft.SqlServer.Management.SqlMgmt.LaunchForm..ctor(ISqlControlCollection control, IServiceProvider provider)
at Microsoft.SqlServer.Management.SqlManagerUI.JobSteps.OnDoubleClick(Object sender, MouseButtonDoubleClickedEventArgs args)
at Microsoft.SqlServer.Management.UI.Grid.GridControl.OnMouseButtonDoubleClicked(HitTestResult htArea, Int64 nRowIndex, Int32 nColIndex, Rectangle rCellRect, MouseButtons btn, GridButtonArea headerArea)
at Microsoft.SqlServer.Management.SqlManagerUI.SqlManagerUIDlgGrid.OnMouseButtonDoubleClicked(HitTestResult htArea, Int64 rowIndex, Int32 colIndex, Rectangle cellRect, MouseButtons btn, GridButtonArea headerArea)
at Microsoft.SqlServer.Management.UI.Grid.GridControl.OnMouseDown(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at Microsoft.SqlServer.Management.UI.Grid.GridControl.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Microsoft.SqlServer.Management.SqlMgmt.RunningFormsTable.RunningFormsTableImpl.ThreadStarter.StartThread()

===================================

The system cannot find the file specified.

------------------------------
Program Location:

at Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass.get_LogProviderInfos()
at Microsoft.SqlServer.Dts.Runtime.Application.get_LogProviderInfos()
ssms
  • 1 respostas
  • 1111 Views
Martin Hope
Riley Major
Asked: 2019-05-23 13:46:02 +0800 CST

Como você recupera o valor de identidade de uma linha inserida na OUTPUT de uma instrução UPDATE?

  • 2

Como você recupera o valor de identidade de uma linha inserida quando essa linha é inserida a partir OUTPUTde uma UPDATEinstrução? Nem @@IDENTITYnem SCOPE_IDENTITY()parece estar definido corretamente.

Considere este código:

DECLARE @UpdateTable table (UpdateTableID int IDENTITY, UpdateTableValue int);
DECLARE @InsertTable table (InsertTableID int IDENTITY, UpdateTableValue1 int, UpdateTableValue2 int);
DECLARE @TestValue int = 5;
INSERT INTO @UpdateTable (UpdateTableValue) VALUES (1),(2),(3);
SELECT [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY()] = SCOPE_IDENTITY();

INSERT INTO @InsertTable (UpdateTableValue1, UpdateTableValue2)
SELECT
    UpdateTableValue1, UpdateTableValue2
FROM        (
                UPDATE      @UpdateTable
                SET         UpdateTableValue = UpdateTableValue + @TestValue
                OUTPUT      deleted.UpdateTableValue, inserted.UpdateTableValue
                WHERE       UpdateTableID = 2
            ) AS UpdateResults (UpdateTableValue1, UpdateTableValue2);

SELECT [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY()] = SCOPE_IDENTITY();

A última linha inserida tem um valor de identidade de 1, mas as funções @@IDENTITYe SCOPE_IDENTITY()estão retornando seus valores originais do original INSERTantes da última instrução executada.

@@VERSION:

Microsoft SQL Azure (RTM) - 12.0.2000.8 2 de maio de 2019 20:11:13 Copyright (C) 2019 Microsoft Corporation

sql-server t-sql
  • 1 respostas
  • 2012 Views
Martin Hope
Riley Major
Asked: 2019-04-11 13:14:48 +0800 CST

T-SQL para mostrar Azure SQL Managed Instance vs Azure SQL Database

  • 2

Reafirmado: Como posso usar o T-SQL para determinar se uma instância é uma Instância Gerenciada de SQL do Azure ou um Banco de Dados SQL do Azure?

azure-sql-database
  • 1 respostas
  • 550 Views
Martin Hope
Riley Major
Asked: 2019-03-09 14:56:44 +0800 CST

Como posso criar linhas sem uma tabela subjacente no IBM DB2 SQL?

  • 0

No T-SQL, posso executar o seguinte:

SELECT      *
FROM        (SELECT 1 AS n UNION ALL SELECT 2 AS n) AS t;

No IBM DB2 SQL, isso falha com:

[IBM][System i Access ODBC Driver][DB2 para i5/OS]SQL0199 - Palavra-chave UNION não esperada. Tokens válidos: , FROM INTO.

Uma SELECTdeclaração parece exigir uma FROMcláusula. De fato, uma instrução SQL redutiva, como:

SELECT 1 AS n

Também erros com:

[IBM][System i Access ODBC Driver][DB2 para i5/OS]SQL0104 - O token não era válido. Tokens válidos: , FROM INTO.

Existe uma função UNNEST que pode criar linhas de um array, mas parece que o array já deve ser representado por algo como uma variável ou parâmetro.

Eu entendo que poderia contornar isso fazendo a SELECTpartir de uma tabela arbitrária com um critério impossível como 1 = 0, mas isso parece ser um requisito bobo.

Então, como posso construir linhas sem uma tabela subjacente?

(palavras-chave: tabela de contagem; tabela derivada)

db2
  • 2 respostas
  • 5995 Views
Martin Hope
Riley Major
Asked: 2017-09-20 09:04:41 +0800 CST

Por que tempos de compilação altos para funções com XML no SQL Server 2016?

  • 7

Temos funções inline que reúnem dados em XML, passam esse XML derivado para outras funções, que então o fragmentam e o reformam como uma string.

(Seu "você não deveria fazer esse tipo de coisa em T-SQL" é uma discussão para outro dia.)

Isso funcionou bem por anos com 2005 e 2008 R2. Agora estamos atualizando para 2016 SP1. Uma consulta usando essas funções que é executada em menos de um segundo em nosso servidor de produção agora é ainda mais rápida no 2016 SP1. Isso seria ótimo, mas leva uma hora para compilar no 2016 SP1. Seriamente:

insira a descrição da imagem aqui

Ambiente de produção:

insira a descrição da imagem aqui

(Ambos são do SQL Sentry Plan Explorer.)

Tentamos com o banco de dados nos níveis de compatibilidade de 2008 (100) e 2016 (130) (mas ainda não jogamos com as configurações "Legacy Cardinality Estimation" e "Query Optimizer Fixes", que estão "OFF" atualmente). Tentamos usar QUERYTRACEON 9481, o que parece não ter efeito.

Novamente, não se trata dos planos resultantes, pois todos eles são executados em uma boa quantidade de tempo. É sobre o tempo que leva para fazer o plano.

Conseguimos reproduzir esse problema - até certo ponto - com um conjunto simplificado de código. Uma instrução que chama a função de nível superior do exemplo abaixo leva de 30 a 60 segundos para compilar no SQL Server 2016 (SP1-CU5), mas leva menos de um segundo para compilar e executar no SQL Server 2008 R2 (SP3).

Exemplo

/*

Create and populate table...

*/

CREATE TABLE TestXMLStuff (OrderID int, ProdLength int, ProdWidth int, ProdHeight int);
INSERT INTO TestXMLStuff (OrderID, ProdLength, ProdWidth, ProdHeight) VALUES
    (1, 10, 15, 20),
    (1, 15, 20, 25),
    (2, 20, 25, 30),
    (2, 25, 30, 35),
    (2, 30, 35, 40);
GO

/*

Function which accepts XML, shreds it and reforms it as a string...

*/


CREATE FUNCTION TestCalc
(   
    @T varchar(8000),
    @X xml
)
RETURNS TABLE 
AS
RETURN 
    WITH p AS
    (
        SELECT  
            LF = CHAR(13) + CHAR(10),
            Tab = CHAR(9),
            T = isNull(@T,'')
    ), pid AS
    (
        SELECT
            isNull(ProdInfoXMLTable.ProdInfoXML.query('(/ProdInfo)').value('(.)[1]','varchar(max)'),'') AS ProdInfoText
        FROM        (
                        SELECT
                            ProdInfoXML =
                                (
                                    SELECT
                                        ProdInfo = 
                                            CASE WHEN Products.ProdNum > 1 THEN '--' + p.LF ELSE '' END +
                                            'Product Number: ' + CONVERT(varchar(50),Products.ProdNum) + p.LF +
                                                CASE WHEN Products.ProdLength       = '' THEN '' ELSE p.Tab + 'Length: '                + Products.ProdLength       + p.LF END +
                                                CASE WHEN Products.ProdWidth        = '' THEN '' ELSE p.Tab + 'Width: '                 + Products.ProdHeight       + p.LF END +
                                                CASE WHEN Products.ProdHeight       = '' THEN '' ELSE p.Tab + 'Height: '                + Products.ProdHeight       + p.LF END
                                    FROM        (
                                                    SELECT
                                                        ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS ProdNum,
                                                        isNull(P.X.value('(./Length)[1]','varchar(500)'),'') AS ProdLength,
                                                        isNull(P.X.value('(./Width)[1]','varchar(500)'),'') AS ProdWidth,
                                                        isNull(P.X.value('(./Height)[1]','varchar(500)'),'') AS ProdHeight
                                                    FROM        @x.nodes('/Products/Product') AS P(X)
                                                ) AS Products
                                    CROSS JOIN  p
                                    FOR XML PATH(''), TYPE
                                )
                    ) AS ProdInfoXMLTable
    )
    SELECT
        Final = p.T + p.LF + p.LF + pid.ProdInfoText
    FROM        p
    CROSS JOIN  pid;

GO

/*

Function to create XML in the format required for TestCalc...

*/

CREATE FUNCTION TestGetXML
(   
    @N int
)
RETURNS TABLE 
AS
RETURN 
    WITH p AS
    (
        SELECT  
            N = isNull(@N,0)
    )
    SELECT
        ProdInfoXML =
            (
                SELECT
                    [Length] = ProdData.ProdLength,
                    [Width] = ProdData.ProdWidth,
                    [Height] = ProdData.ProdHeight
                FROM        TestXMLStuff ProdData
                WHERE       ProdData.OrderID = @N
                FOR XML PATH('Product'), ROOT('Products'), TYPE
            );
GO

/*

Function to join the other two functions, gathering the XML and feeding it to the string creator which shreds and reforms it...

*/

CREATE FUNCTION TestGetFromTableUsingFunc
(   
    @N int
)
RETURNS TABLE 
AS
RETURN 
    WITH p AS
    (
        SELECT  
            N = isNull(@N,0)
    )
    SELECT
        FinalResult = 'This is a ' + TestCalcResults.Final
    FROM        p
    CROSS APPLY TestGetXML
                (
                    p.N
                ) AS x
    CROSS APPLY TestCalc
                (
                    'test',
                    x.ProdInfoXML
                ) AS TestCalcResults;
GO

/*

Code to call the function. This is what takes around 60 seconds to compile on our 2016 system but basically no time on the 2008 R2 system.

*/

SELECT      *
FROM        TestXMLStuff
CROSS APPLY TestGetFromTableUsingFunc
            (
                OrderID
            )
OPTION      (RECOMPILE);
GO

Produção @@versiononde a compilação não é um problema:

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)

Teste @@versiononde a compilação leva "para sempre":

Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) 

Perguntas

  1. Por que há uma degradação no tempo de compilação indo para 2016 a partir de 2008 R2?

  2. Essa resposta revela uma solução fácil para esse dilema além de mudar a maneira como tudo isso funciona? (Estou esperando por sinalizadores de rastreamento mágico ou uma próxima atualização da Microsoft.)

(Se isso fosse o SQL Server 2017, eu usaria JSON para coletar e passar os dados, o que parece ser mais rápido e com menor sobrecarga, e então usaria as funções JSON para fragmentar e STRING_AGGreformar em texto. Mas, infelizmente, isso ainda não é acessível.)

Com base em uma dica de Joe Obbish , reuni os resultados ao usar o sinalizador de rastreamento 8675 , usando este código:

DBCC TRACEON(3604)
SELECT      *
FROM        TestXMLStuff
CROSS APPLY TestGetFromTableUsingFunc
            (
                OrderID
            )
OPTION      (RECOMPILE, QUERYTRACEON 8675);
DBCC TRACEOFF(3604)

Em uma instância R2 de 2008, demorou muito menos de um segundo e produziu isto:

DBCC execution completed. If DBCC printed error messages, contact your system administrator. End of simplification, time: 0.008 net: 0.008 total: 0.008 net: 0.008

end exploration, tasks: 597 no total cost time: 0.005 net: 0.005 total: 0.014 net: 0.014

end search(0),  cost: 2071.66 tasks: 2267 time: 0.005 net: 0.005 total: 0.02 net: 0.02

end exploration, tasks: 2703 Cost = 2071.66 time: 0.002 net: 0.002 total: 0.022 net: 0.022

end search(1),  cost: 1731.11 tasks: 3362 time: 0.004 net: 0.004 total: 0.026 net: 0.026

end exploration, tasks: 3363 Cost = 1731.11 time: 0 net: 0 total:
0.026 net: 0.026

end search(1),  cost: 1731.11 tasks: 3382 time: 0 net: 0 total: 0.026 net: 0.026

end exploration, tasks: 3413 Cost = 1731.11 time: 0 net: 0 total:
0.027 net: 0.027

end search(2),  cost: 1731.11 tasks: 3515 time: 0 net: 0 total: 0.027 net: 0.027

End of post optimization rewrite, time: 0.001 net: 0.001 total: 0.029 net: 0.029

End of query plan compilation, time: 0.001 net: 0.001 total: 0.03 net:
0.03


(5 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Em uma instância SP1-CU5 de 2016, levou 1 minuto e 11 segundos e produziu isto:

DBCC execution completed. If DBCC printed error messages, contact your system administrator. End of simplification, time: 0.004 net: 0.004 total: 0.004 net: 0.004

end exploration, tasks: 612 no total cost time: 0.003 net: 0.003 total: 0.008 net: 0.008

end exploration, tasks: 613 no total cost time: 0 net: 0 total: 0.008 net: 0.008

end exploration, tasks: 2305 no total cost time: 0.002 net: 0.002 total: 0.011 net: 0.011

end exploration, tasks: 2306 no total cost time: 0 net: 0 total: 0.011 net: 0.011

end search(0),  cost: 4402.32 tasks: 2306 time: 0 net: 0 total: 0.011 net: 0.011

end exploration, tasks: 2738 Cost = 4402.32 time: 0.001 net: 0.001 total: 0.013 net: 0.013

end exploration, tasks: 2739 Cost = 4402.32 time: 0 net: 0 total:
0.013 net: 0.013

end exploration, tasks: 3466 Cost = 4402.32 time: 0.002 net: 0.002 total: 0.015 net: 0.015

end exploration, tasks: 3467 Cost = 4402.32 time: 0 net: 0 total:
0.015 net: 0.015

end search(1),  cost: 3938.19 tasks: 3467 time: 0 net: 0 total: 0.015 net: 0.015

end exploration, tasks: 3468 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end exploration, tasks: 3469 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end exploration, tasks: 3489 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end exploration, tasks: 3490 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end search(1),  cost: 3938.19 tasks: 3490 time: 0 net: 0 total: 0.015 net: 0.015

end exploration, tasks: 3521 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end exploration, tasks: 3522 Cost = 3938.19 time: 0 net: 0 total:
0.015 net: 0.015

end exploration, tasks: 3625 Cost = 3938.19 time: 0 net: 0 total:
0.016 net: 0.016

end exploration, tasks: 3626 Cost = 3938.19 time: 0 net: 0 total:
0.016 net: 0.016

end search(2),  cost: 3938.19 tasks: 3626 time: 0 net: 0 total: 0.016 net: 0.016

End of post optimization rewrite, time: 0 net: 0 total: 0.016 net:
0.016

End of query plan compilation, time: 0.001 net: 0.001 total: 0.018 net: 0.018


(5 row(s) affected) DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Embora mais esteja acontecendo, parece que o tempo decorrido foi de apenas 0,018 (segundos?), que é menor que os 0,03 em 2008 R2. Então essa fase de compilação/otimização/execução não deve ser o que está demorando tanto. Mas algo definitivamente é.


Nossa eventual instância de produção de 2016 terá o mesmo "hardware" da produção atual de 2008 R2. As instâncias de teste/desenvolvimento 2016 têm especificações diferentes, portanto, essas comparações não são maçãs com maçãs. Prod é de 78 giga. Dev é de 16 GB. Mas testei em outra caixa R2 2008 com 20 giga e foi rápido. Também estamos falando de pequenas quantidades de dados bem indexadas. E durante a compilação pouco IO, mas muita CPU.

Eu pude ver as estatísticas sendo um problema com as funções reais que atingem tabelas reais (grandes), mas no meu exemplo simplificado e planejado, leva mais de 1 minuto para fazer alguma manipulação simples de XML/texto em 5 linhas carregadas de inteiros. Eu poderia digitar os resultados mais rápido. :) Acredito que temos estatísticas automáticas na produção e não vejo outros problemas de desempenho aparentemente relacionados a estatísticas. E outro ambiente de desenvolvimento/teste 2008 R2 de não produção (com cópia de produção obsoleta semelhante ao desenvolvimento/teste 2016) é lickety-split.

sql-server optimization
  • 2 respostas
  • 1143 Views
Martin Hope
Riley Major
Asked: 2017-07-25 14:37:36 +0800 CST

Qual é o número máximo de ações vinculadas permitidas para um evento estendido?

  • 14

Se você adicionar "muitas" ações a um evento em uma sessão de evento, receberá este erro:

Msg 25639, Level 16, State 23, Line 1 O evento, "[nome do evento]", excede o número de ações vinculadas permitidas.

Quantas ações são permitidas? Varia de acordo com o evento?

A resposta, baseada na experimentação, parece ser 27 para sqlserver.rpc_completed. Mas não encontrei esse número em nenhuma documentação da Microsoft . E parece variar de acordo com o evento, pois consegui 30 por sqlserver.sql_batch_completed.

Código de exemplo que falha:

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username,
        sqlserver.plan_handle))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

Código de exemplo que é bem-sucedido (o mesmo, exceto excluindo o último item):

CREATE EVENT SESSION [Test] ON SERVER 
ADD EVENT sqlserver.rpc_completed(
    ACTION(
        package0.callstack,
        package0.collect_cpu_cycle_time,
        package0.collect_current_thread_id,
        package0.collect_system_time,
        package0.event_sequence,
        package0.last_error,
        package0.process_id,
        sqlos.cpu_id,
        sqlos.numa_node_id,
        sqlos.scheduler_address,
        sqlos.scheduler_id,
        sqlos.system_thread_id,
        sqlos.task_address,
        sqlos.task_elapsed_quantum,
        sqlos.task_resource_group_id,
        sqlos.task_resource_pool_id,
        sqlos.task_time,
        sqlos.worker_address,
        sqlserver.client_app_name,
        sqlserver.client_connection_id,
        sqlserver.client_hostname,
        sqlserver.client_pid,
        sqlserver.context_info,
        sqlserver.database_id,
        sqlserver.database_name,
        sqlserver.is_system,
        sqlserver.nt_username))
GO
DROP EVENT SESSION [Test] ON SERVER
GO

(Tentei algumas ações diferentes e não parece estar relacionado a quais ações estão incluídas - mas talvez seja baseado em uma contagem total de caracteres de nomes de ações?)

Lista completa de ações com as quais estava trabalhando:

package0.callstack,
package0.collect_cpu_cycle_time,
package0.collect_current_thread_id,
package0.collect_system_time,
package0.event_sequence,
package0.last_error,
package0.process_id,
sqlos.cpu_id,
sqlos.numa_node_id,
sqlos.scheduler_address,
sqlos.scheduler_id,
sqlos.system_thread_id,
sqlos.task_address,
sqlos.task_elapsed_quantum,
sqlos.task_resource_group_id,
sqlos.task_resource_pool_id,
sqlos.task_time,
sqlos.worker_address,
sqlserver.client_app_name,
sqlserver.client_connection_id,
sqlserver.client_hostname,
sqlserver.client_pid,
sqlserver.context_info,
sqlserver.database_id,
sqlserver.database_name,
sqlserver.is_system,
sqlserver.nt_username,
sqlserver.plan_handle,
sqlserver.query_hash,
sqlserver.query_hash_signed,
sqlserver.query_plan_hash,
sqlserver.query_plan_hash_signed,
sqlserver.request_id,
sqlserver.server_instance_name,
sqlserver.server_principal_name,
sqlserver.server_principal_sid,
sqlserver.session_id,
sqlserver.session_nt_username,
sqlserver.session_resource_group_id,
sqlserver.session_resource_pool_id,
sqlserver.session_server_principal_name

@@VERSION Saída:

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 
    Oct 28 2016 18:17:30 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)
sql-server sql-server-2016
  • 1 respostas
  • 1096 Views
Martin Hope
Riley Major
Asked: 2017-06-08 09:24:01 +0800 CST

Por que GETUTCDATE é anterior a SYSDATETIMEOFFSET?

  • 8

Como alternativa, como a Microsoft tornou possível a viagem no tempo?

Considere este código:

DECLARE @Offset datetimeoffset = sysdatetimeoffset();
DECLARE @UTC datetime = getUTCdate();
DECLARE @UTCFromOffset datetime = CONVERT(datetime,SWITCHOFFSET(@Offset,0));
SELECT
    Offset = @Offset,
    UTC = @UTC,
    UTCFromOffset = @UTCFromOffset,
    TimeTravelPossible = CASE WHEN @UTC < @UTCFromOffset THEN 1 ELSE 0 END;

@Offseté definido antes @UTC de , mas às vezes tem um valor posterior . (Eu tentei isso no SQL Server 2008 R2 e no SQL Server 2016. Você precisa executá-lo algumas vezes para capturar as ocorrências suspeitas.)

Isso não parece ser simplesmente uma questão de arredondamento ou falta de precisão. (Na verdade, acho que o arredondamento é o que "conserta" o problema ocasionalmente.) Os valores para uma execução de amostra são os seguintes:

  • Desvio
    • 07-06-2017 12:01:58.8801139 -05:00
  • UTC
    • 07-06-2017 17:01:58.877
  • UTC do deslocamento:
    • 07-06-2017 17:01:58.880

Portanto, a precisão de data e hora permite o .880 como um valor válido.

Mesmo os exemplos GETUTCDATE da Microsoft mostram os valores SYS* sendo posteriores aos métodos mais antigos, apesar de terem sido SELECTed antes :

SELECT 'SYSDATETIME()      ', SYSDATETIME();  
SELECT 'SYSDATETIMEOFFSET()', SYSDATETIMEOFFSET();  
SELECT 'SYSUTCDATETIME()   ', SYSUTCDATETIME();  
SELECT 'CURRENT_TIMESTAMP  ', CURRENT_TIMESTAMP;  
SELECT 'GETDATE()          ', GETDATE();  
SELECT 'GETUTCDATE()       ', GETUTCDATE();  
/* Returned:  
SYSDATETIME()            2007-05-03 18:34:11.9351421  
SYSDATETIMEOFFSET()      2007-05-03 18:34:11.9351421 -07:00  
SYSUTCDATETIME()         2007-05-04 01:34:11.9351421  
CURRENT_TIMESTAMP        2007-05-03 18:34:11.933  
GETDATE()                2007-05-03 18:34:11.933  
GETUTCDATE()             2007-05-04 01:34:11.933  
*/

Presumo que isso seja porque eles vêm de diferentes informações do sistema subjacente. Alguém pode confirmar e dar detalhes?

A documentação SYSDATETIMEOFFSET da Microsoft diz que "o SQL Server obtém os valores de data e hora usando a API do Windows GetSystemTimeAsFileTime()" (obrigado srutzky), mas sua documentação GETUTCDATE é muito menos específica, dizendo apenas que o "valor é derivado do sistema operacional do computador no qual a instância do SQL Server está sendo executada".

(Isso não é totalmente acadêmico. Encontrei um pequeno problema causado por isso. Eu estava atualizando alguns procedimentos para usar SYSDATETIMEOFFSET em vez de GETUTCDATE, na esperança de maior precisão no futuro, mas comecei a obter pedidos estranhos porque outros procedimentos foram ainda usando GETUTCDATE e ocasionalmente "saltando à frente" dos meus procedimentos convertidos nos logs.)

sql-server datetime
  • 1 respostas
  • 4038 Views
Martin Hope
Riley Major
Asked: 2016-05-26 12:02:32 +0800 CST

Como faço para definir uma string Unicode / NVARCHAR do SQL Server para um emoji ou caractere suplementar?

  • 34

Eu quero definir uma variável de string Unicode para um caractere específico com base em seu ponto de código Unicode.

Desejo usar um ponto de código além de 65535, mas o banco de dados SQL Server 2008 R2 tem um agrupamento de SQL_Latin1_General_CP1_CI_AS.

De acordo com a documentação do NCHAR da Microsoft , a NCHARfunção recebe um inteiro da seguinte forma:

expressão_inteiro

Quando o agrupamento do banco de dados não contém o sinalizador de caractere suplementar (SC), esse é um número inteiro positivo de 0 a 65535 (0 a 0xFFFF). Se um valor fora desse intervalo for especificado, NULL será retornado. Para obter mais informações sobre caracteres suplementares, consulte Collation and Unicode Support.

Quando o agrupamento do banco de dados oferece suporte ao sinalizador de caractere suplementar (SC), esse é um número inteiro positivo de 0 a 1114111 (0 a 0x10FFFF). Se for especificado um valor fora desse intervalo, será retornado NULL.

Então este código:

SELECT NCHAR(128512);

Retorna NULLneste banco de dados.

Eu gostaria que ele retornasse o mesmo que isso:

SELECT N'?';

Como posso definir uma variável de string Unicode (por exemplo, nvarchar) para um emoji usando código (sem usar o caractere emoji real) em um banco de dados onde o agrupamento "não contém o sinalizador de caractere suplementar (SC)"?

Lista completa de pontos de código Unicode emoji

(Em última análise, quero que qualquer personagem funcione. Apenas escolhi emoji para facilitar a referência.)

(Embora o servidor seja o SQL Server 2008 R2, também estou curioso sobre as soluções para versões posteriores.)

Supondo que não há como, eu poderia fazer referência a uma função definida pelo usuário em linha em outro banco de dados que tivesse um agrupamento apropriado?

Como faço para encontrar um agrupamento que tenha o sinalizador "caractere suplementar"?

Isso não retorna nenhum registro em nosso servidor:

SELECT * FROM sys.fn_helpcollations() 
WHERE name LIKE 'SQL%[_]SC';

Parece que o SQL Server 2012 foi introduzido Latin1_General_100_CI_AS_SC, o que funcionaria. Você pode instalar agrupamentos em instâncias mais antigas?

Referências de agrupamento:

  • Resposta para Qual é a diferença entre char, nchar, varchar e nvarchar no SQL Server?
  • Informações de agrupamento de caracteres suplementares da Microsoft
  • Lista de agrupamentos do SQL Server 2008 R2 da Microsoft

Existe uma explicação de por que, independentemente do agrupamento, o SQL Server pode entender e lidar com os caracteres estendidos, exceto da perspectiva de NCHAR?

sql-server t-sql
  • 1 respostas
  • 43026 Views
Martin Hope
Riley Major
Asked: 2014-10-07 13:05:33 +0800 CST

Por que o SSAS continua reiniciando a cada poucos segundos?

  • 1

Temos um SQL Server 2005 Analysis Server que começou a reiniciar neste fim de semana, aparentemente sem nenhuma alteração externa.

O estado atual do servidor é que, enquanto o serviço SSAS estiver habilitado, ele continuará reiniciando. Se o serviço for desabilitado manualmente e, em seguida, interrompido, o serviço não será mais executado. Mas assim que for habilitado, o serviço começará a circular novamente.

A pesquisa na Internet encontra alguns exemplos desse comportamento, mas sem uma resolução que pareça aplicável. Consulte, por exemplo: Contas de Nível de Serviço - SQL 2005 SSAS - Erro ao conectar-se a OLAP . Consulte também, por exemplo: Não consigo me conectar ao Analysis Services no SSMS...

Brent Ozar relatou um problema semelhante no LessThanDot, mas não houve solução no tópico e a última entrada foi em sexta-feira, 27 de março de 2009, 16h08.

Este é um trecho do arquivo msmdsrv.log:

(10/6/2014 3:21:43 PM) Message: The flight recorder was started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210005)
(10/6/2014 3:21:43 PM) Message: Service started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210000)
(10/6/2014 3:22:40 PM) Message: Service stopped. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210001)
(10/6/2014 3:22:45 PM) Message: The flight recorder was started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210005)
(10/6/2014 3:22:45 PM) Message: Service started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210000)
(10/6/2014 3:23:41 PM) Message: Service stopped. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210001)
(10/6/2014 3:23:47 PM) Message: The flight recorder was started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210005)
(10/6/2014 3:23:47 PM) Message: Service started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210000)
(10/6/2014 3:24:41 PM) Message: Service stopped. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210001)
(10/6/2014 3:24:47 PM) Message: The flight recorder was started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210005)
(10/6/2014 3:24:47 PM) Message: Service started. (Source: \\?\S:\CubeLog\msmdsrv.log, Type: 1, Category: 289, Event ID: 0x41210000)

O visualizador de eventos para log do sistema, repetidamente, tem:

"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a stop control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a start control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a stop control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a start control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a stop control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a start control."
"The SQL Server Analysis Services (MSSQLSERVER) service was successfully sent a stop control."
etc....

Não há arquivos SQLDmprNNNN.mdmp que parecem ter sido criados. Não há nenhum outro log de erros que tenhamos conhecimento.

Como podemos descobrir o que há de errado? Existe uma maneira de saber se algum serviço ou processo de terceiros está alternando o serviço SSAS?

Também postamos esta questão no SQL Server Central .

sql-server ssas
  • 1 respostas
  • 1192 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve