标签: sql-server

为什么这个查询不使用我的非聚集索引,我该如何做?

作为这个关于提高查询性能的问题的后续,我想知道是否有办法让我的索引默认使用。

此查询在大约 2.5 秒内运行:

SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Run Code Online (Sandbox Code Playgroud)

这个运行在大约 33 毫秒内:

SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' 
ORDER BY [DateEntered], [DeviceID];
Run Code Online (Sandbox Code Playgroud)

[ID] 字段 (pk) 上有一个聚集索引,[DateEntered],[DeviceID] 上有一个非聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题是两部分:

  • 为什么,因为两个查询在 [DateEntered] 字段上都有一个 WHERE 子句,服务器是否在第一个而不是第二个上使用聚集索引?
  • 即使没有orderby,如何在此查询中默认使用非聚集索引?(或者为什么我不想要这种行为?)

index sql-server optimization sql-server-2008-r2

14
推荐指数
2
解决办法
3万
查看次数

拒绝访问 SQL Server 中的信息架构

我正在寻找禁用SQL Server 中用户/组访问sys.tables/的最佳方法Information Schema。

我从 2008 年发现了这个线程

它显示了一种如何拒绝访问的方法,[sys].[something]如下所示:

 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
 GO
Run Code Online (Sandbox Code Playgroud)

但是没有办法如何禁用对以下内容的访问Information Schema:

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用。

如何禁用对 information_schema 的访问?

是否有更简单的方法禁用对所有sys/ 的访问information_schema?

更新: 实际上我不能同时运行以下语句:

DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server-2008 sql-server sql-server-2008-r2 information-schema

14
推荐指数
2
解决办法
2万
查看次数

“查看服务器状态”的安全和性能影响

这个问题指出,各种 DMV(动态管理视图)都需要“查看服务器状态”权限,但我找不到任何关于你做什么和不想授予权限的信息。

现在我当然理解“最少权限”,以及为什么您不想将其授予任何人,但我找不到有关如何评估是否应该授予它的任何指导。

所以,我的问题是:授予用户“查看服务器状态”权限对安全和性能有何影响。他们可以做什么,他们可能不应该被允许做......

更新:一个含义是用户将能够使用 DMV 来查看查询。如果查询或查询参数可以包含用户无法看到的机密信息,则允许 VIEW SERVER STATE 将允许他们这样做(即 dob = 或 ssn =)。

sql-server

14
推荐指数
1
解决办法
1万
查看次数

SQL Server 索引与统计

之间有什么区别CREATE INDEX和CREATE STATISTICS何时该使用的呢?

index sql-server statistics

14
推荐指数
1
解决办法
1万
查看次数

无法使用我的 Windows 帐户启动 SqlLocalDB 实例

我是管理员,只需运行以下命令:

 sqllocaldb start v11.0
Run Code Online (Sandbox Code Playgroud)

结果:

 Start of LocalDB instance "v11.0" failed because of the following error:
 Error occurred during LocalDB instance startup: SQL Server process failed to sta
 rt.
Run Code Online (Sandbox Code Playgroud)

事件查看器日志事件 ID:528

Windows API 调用 WaitForMultipleObjects 返回错误代码:575。Windows 系统错误消息是:{Application Error} 应用程序无法正确启动 (0x%lx)。单击确定关闭应用程序。在第 3621 行报告。

我尝试了另一个(用户和管理员)帐户,它们没有问题。

我卸载并重新安装了 2012 版的 SQLLocalDB.msi,但我没有运气。你有什么想法和解决办法吗?

sql-server sql-server-2012 sql-server-localdb

14
推荐指数
2
解决办法
6万
查看次数

31亿行数据如何管理?

我目前的任务是为相对大量的数据实施存储模式。将主要访问数据以确定当前data point值,但我还需要跟踪过去六个月的历史数据趋势/分析。

加入最近要求跟踪min/ max/sum在过去的小时值。

注意:理想情况下,我想考虑 MongoDB 选项,但我需要先证明我已经用完了 SQL-Server 选项。

数据

下表表示主要数据源(最常查询)。该表将有大约 500 万行。数据更改将主要是初始数据加载后UPDATE非常偶然的INSERT语句。我选择了对数据进行聚类,dataPointId因为您将始终选择all values for a given data point.

// Simplified Table
CREATE TABLE [dbo].[DataPointValue](
    [dataPointId]  [int] NOT NULL,
    [valueId]      [int] NOT NULL,
    [timestamp]    [datetime] NOT NULL,
    [minimum]      [decimal](18, 0) NOT NULL,
    [hourMinimum]  [decimal](18, 0) NOT NULL,
    [current]      [decimal](18, 0) NOT NULL,
    [currentTrend] [decimal](18, 0) NOT NULL,
    [hourMaximum]  [decimal](18, 0) NOT NULL,
    [maximum]      [decimal](18, 0) …
Run Code Online (Sandbox Code Playgroud)

database-design sql-server

14
推荐指数
1
解决办法
3万
查看次数

查找孤立用户

在 SQL Server 2005 中,有没有办法找到在服务器级别不存在的用户(在服务器级别删除但在删除之前未与数据库解除关联的帐户)或未链接的帐户(帐户可能已在服务器级别而不是数据库级别被删除,然后重新读取但数据库级别从未被清理过)。

我有一个非常凌乱的服务器,如果可以运行查询来找到这些,那就太棒了。

sql-server-2005 sql-server users

14
推荐指数
2
解决办法
4万
查看次数

重置 SQL Server 2012 序列

我正在测试和填充利用该SEQUENCE对象的特定表。在这个过程中,我正在测试用数以万计的插入行填充表(因为我不熟悉如何编程)。我在这个特定表格中看到的问题是,当我开始另一个人口测试时,SEQUENCE它不会重置回我想要的第一个数字(即 1)。

当我想重新运行一个新的测试时,我删除了有问题的表,然后运行以下命令:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO
Run Code Online (Sandbox Code Playgroud)

当我想重新运行测试时,我运行以下SCHEMA&SEQUENCE命令,这些命令按以下顺序触发:

CREATE SCHEMA foo;
GO

CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;

GO
Run Code Online (Sandbox Code Playgroud)

然后我创建表:

CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)

GO
Run Code Online (Sandbox Code Playgroud)

完成后,我运行以下插入命令 50,000 次:

INSERT INTO [foo].[sample_table_with_data] 
(
    [order_number],
    [sample_column_one], 
    [sample_column_two], 
    [sample_column_three]
) 
VALUES 
(
    NEXT VALUE FOR foo.fee, 
    'Blah', 
    'Blah Blah', 
    'Blah …
Run Code Online (Sandbox Code Playgroud)

sql-server sequence sql-server-2012

14
推荐指数
2
解决办法
3万
查看次数

TRY-CATCH 未捕获链接服务器错误

我正在设置一个作业来遍历链接服务器列表并对每个服务器执行特定查询。我正在尝试在 TRY-CATCH 块内执行查询,因此如果某个特定服务器出现问题,我可以将其记录下来,然后继续处理其他服务器。

我在循环内执行的查询如下所示:

BEGIN TRY
    SELECT *
    FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;

PRINT 'We got past the Catch block!';
Run Code Online (Sandbox Code Playgroud)

如果连接到服务器出现问题,代码会立即失败并且不会传输到CATCH块。如果服务器连接但在实际查询中存在错误,例如被零除,那么这会被CATCH块按预期捕获。

例如,我为一个我知道不存在的名称创建了一个链接服务器。执行上述操作时,我只得到:

OLE DB provider "SQLNCLI" for linked server "nonserver" returned message 
    "Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message 
    "An error has occurred while establishing a connection to the server. 
    When connecting to SQL Server 2005, this failure may be …
Run Code Online (Sandbox Code Playgroud)

sql-server linked-server

14
推荐指数
2
解决办法
2万
查看次数

SOS_SCHEDULER_YIELD 等待问题排查

运行我们的企业 ERP (Dynamics AX 2012),我注意到我们的生产环境似乎比我们的开发系统慢得多。

在运行跟踪的同时在开发和生产环境中执行相同的活动后,我确认与开发相比,SQL 查询在我们的生产环境中的执行速度非常慢(平均慢 10-50 倍)。

起初我将此归因于负载,并在下班时间在生产环境上重新运行相同的活动,并在跟踪中发现相同的结果。

我清除了 SQL Server 中的等待统计信息,然后让服务器在正常生产负载下运行一段时间,然后运行以下查询:

WITH [Waits] AS
    (SELECT
        [wait_type],
        [wait_time_ms] / 1000.0 AS [WaitS],
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
        [signal_wait_time_ms] / 1000.0 AS [SignalS],
        [waiting_tasks_count] AS [WaitCount],
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
    FROM sys.dm_os_wait_stats
    WHERE [wait_type] NOT IN (
        N'CLR_SEMAPHORE',    N'LAZYWRITER_SLEEP',
        N'RESOURCE_QUEUE',   N'SQLTRACE_BUFFER_FLUSH',
        N'SLEEP_TASK',       N'SLEEP_SYSTEMTASK',
        N'WAITFOR',          N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
        N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
        N'XE_TIMER_EVENT',   N'XE_DISPATCHER_JOIN',
        N'LOGMGR_QUEUE',     N'FT_IFTS_SCHEDULER_IDLE_WAIT',
        N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
        N'CLR_AUTO_EVENT',   N'DISPATCHER_QUEUE_SEMAPHORE', …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 wait-types

14
推荐指数
1
解决办法
1万
查看次数