我在 SQL Server 2012 中有一堆表。
这些表由其他表提供。每天都有一些例程会截断(完全删除)它们并运行将结果插入其中的查询。它们就像静态视图,存储那些处理过的数据,以便更快地查询它们。
还有源表,每天接收数百万条新记录,这些不会被删除。
所有这些表都有一段时间会插入很多内容,而在一天的剩余时间里,它们只会被读取。
即使使用这些“静态视图”表,我认为我也可以提高整体性能。是否有处理这些行为的最佳实践?
对于第一种情况,我运行了一些基准测试,发现最好的性能来自对过滤最多的字段使用非聚集索引。我在截断之前删除这些索引并在插入后重新创建它们。删除和重新创建比重建更快,插入也更快。
我也应该保留 PK(没有语义意义)和聚集索引吗?我想如果没有索引,这些插入会更快,但是如果这些表没有 PK,我会有什么问题吗?它们从不明确使用。
我问这个是因为当我创建表并设置它的 PK 时
idBenchmark int NOT NULL IDENTITY (1,1) PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)
聚集索引是自动创建的,具有随机名称,因此我无法删除并重新创建它。
sql-server optimization clustered-index nonclustered-index query-performance
我在 ExtJS 中开发了 SQL Server 2012 中查询结果的报告。
我将 Ext.Grid 与分页一起使用,因此我可以使用偏移量来限制查询将返回的记录数量。但是为了让这个 ExtJS 功能起作用,我仍然必须向它提供给定查询所具有的记录总数。
有些报告在白天使用过滤器和数据更改,因此我只能通过运行查询来知道总数。这导致运行它两次:一次使用 count(*) 获得总计数,再次获得正确的数据。
有没有办法找到查询的总数,即使它有偏移命令,而不必像我现在所做的那样运行它两次,也不必循环遍历所有记录?
我有一个表作为这个例子:
CREATE TABLE customerEvent(
customerID int NOT NULL,
eventID int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
customerID 可能出现在许多记录中。我使用以下查询来识别最常用的 customerID:
SELECT
customerID,eventID
,row_number() OVER(PARTITION BY customerID ORDER BY eventID) as frequency
FROM customerEvent
ORDER BY frequency DESC
Run Code Online (Sandbox Code Playgroud)
有了这个我看到了那些最频繁的customerID。但它们仅在列表顶部出现一次。例子:
customerID eventID frequency
7 3 5
15 9 4
7 1 4
9 4 3
7 10 3
15 2 3
Run Code Online (Sandbox Code Playgroud)
我需要最频繁的 customerID 的所有记录出现在顶部,例如:
customerID eventID frequency
7 3 5
7 1 4
7 10 3
15 9 4
15 2 3
9 4 3
Run Code Online (Sandbox Code Playgroud)
知道如何构建一个查询吗?
sys.tables 列出单个数据库中的所有用户表,但没有它们的架构名称。
如果我在创建代码时知道现有数据库,我可以使用它USE来浏览所有数据库,查询sys.tables其表,并将列表插入到临时表中以供以后使用。
但是,有没有更简单的方法来做到这一点,并且通过唯一的查询能够从所有用户数据库中检索所有用户表及其架构?
我注意到我可以在master数据库中创建表、模式、存储过程等。
我不知道是什么授予此权限。这很烦人,因为当我们在 SSMS 中打开一个 *.sql 文件时,它默认与master 相关。如果在CREATE没有注意到并设置正确的数据库上下文的情况下执行操作,则在master 中创建表。
如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就创建好了,后面我们才看到错误,需要删除重新创建。我注意到在master中已经错误地创建了一些表。
我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。
在不破坏 SQL Server 的情况下从master撤销创建权限的最佳方法是什么?
security sql-server permissions sql-server-2012 master-system-database