我有一张表,里面有大约 200 万条记录。我创建了一个空间索引,使用边界框以外的默认值。我一直注意到有些查询非常快,有些则非常慢。决定因素出现在查询中使用的多边形的大小。
在较大的搜索区域,使用WITH(INDEX(SIX_FT5))会大大减慢查询速度(从 0 秒到 15 秒以上)。在较小的搜索区域,情况正好相反。
以下是我正在测试的一些查询:
快速地:
SELECT TOP(1000)
*
FROM [FT5]
WHERE
shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1
Run Code Online (Sandbox Code Playgroud)
减缓:
SELECT TOP(1000)
*
FROM [FT5] WITH(INDEX(SIX_FT5)) -- Index hint is the only difference
WHERE
shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1
Run Code Online (Sandbox Code Playgroud)
为什么 WITH 子句有时会减慢速度?
有人问我“我们什么时候需要使用覆盖索引,为什么?” 由 DBA。
我的解释是:
它允许引擎直接从索引本身的值中提取所有相关数据。
对于问我这个问题的 DBA,我的解释并不令人满意。还有哪些相关的细节?
我知道聚集索引和非聚集索引之间的区别
我不是 DBA,而是最终用户,将公司内各种数据库的数据混合在一起以产生洞察力。
当我第一次遇到一个新的(对我来说)数据库时,我会花时间滚动浏览 SSMS 或 Power Query 中的表/视图/列,以了解数据库中的数据及其结构。这是一个手动过程,在滚动长列表时我可能会忽略关键表。
有没有一个简单的工具可以扫描数据库并直观地表示数据库结构?我相信旧版本的 Visio 可以对数据库进行逆向工程并生成数据库模型/实体关系图,但当前版本不能。如果重要的话,有问题的数据库都是 MSSQL
我正在使用 SQL Server 2008 R2 进行数据库设计,基本上它是一个简单的论坛数据库设计(就像游戏迷论坛一样)。幸运的是,我正在努力解决它,因为我没有找到任何免费样品来将我的工作与它进行比较。
正如一些人在评论中要求的那样,这就是我目前所做的:对于一个论坛,我考虑了一个用户(表),每个用户都有一个帖子(表),每个帖子都可以启动一个主题(表)。
表用户:用户 ID (PK)、昵称、电子邮件、密码、头像。
表格帖子:PostID (PK)、UserID (FK)、DateTime、Description。
我没有答案的问题:-
有什么方法可以对 postgresql 中的数组元素进行模式匹配(9.4,如果版本有所不同)?我有一个聚合函数,除其他外,它返回一个元素数组,例如:
SELECT
lognum
,array_agg(flightnum) as flightnums
FROM logs
GROUP BY lognum;
Run Code Online (Sandbox Code Playgroud)
其中flightnum字段是包含文本字符串或三或四位数字的 varchar。现在假设我要选择航班号以“8”开头的所有日志(即“800”或“8000”系列航班)。我的第一个想法是做这样的事情:
SELECT
*
FROM (
SELECT
lognum
,array_agg(flightnum) as flightnums
FROM logs
GROUP BY
lognum
) s1
WHERE
'8%' like ANY(flightnums);
Run Code Online (Sandbox Code Playgroud)
但是,虽然这不会给出错误,但它也不会返回任何结果。我猜测这是因为通配符位于运算符的左侧。当然,反过来就是:
WHERE ANY(flightnum) like '8%'
Run Code Online (Sandbox Code Playgroud)
给我一个语法错误。那么有什么方法可以运行此查询,以便获得包含以 8(或其他)开头的航班号的任何行吗?
请注意,这是一个简化的示例,仅演示了我遇到困难的部分。
我对 SQL 非常非常陌生,并且无法正确配置服务器。我现在要做的只是一份我工作的公司的数据库模式的小副本,其中包含随机数据。运行一个只有几个表的小型服务器,我只是偶尔查询以测试应用程序,我可以将 SQL 配置为“按需”使用资源(可能是一个侦听查询的代理,并且仅执行此操作,而不是在内存中缓存数据)还是使用最少的系统资源?
我发现,即使只有 15 个表,总共 250MB 的存储空间,SQL 总是在只有 8GB 可用空间的机器上使用至少 2GB 的内存。
我确实在 StackExchange 上寻找过类似的问题,但只发现了关于将多少内存用于操作系统而不是服务器计算机上的数据库的争论。
我正在一台规格合理的机器上运行一些 Microsoft SQL Server 2014 负载测试。我当然不是 SQL Server 调优细节方面的专家,但根据我从各个地方收集的一些片段,我认为设置非常好。
表演中的一个元素确实令人困惑,因此我在这里伸出援手。我正在测试的数据库是历史上建立的,最初是针对 2008r2 创建的。兼容性设置是从那个版本继承过来的。上周我分两个阶段提高了该设置,但是当我将其从 2012 年提高到 2014 年的兼容性时,突然间 CPU 负载飙升。
当来回更改此设置时,它似乎是系统性的。我可以使用 2012 设置在 8 核数据库上运行 X 个模拟用户(数据库前面的 Web 应用程序)。如果我将其提高到 2014 年,我只能逃脱 60% 的 X 个模拟用户。反之,对于 X 用户,2014 年设置的批量请求数降低了 40%。
据我了解,切换回兼容性级别不会恢复数据库,而只会关闭功能。这种情况似乎表明一个功能在没有明显增益的情况下消耗 CPU,所以我想知道可能是哪个功能以及是否有办法单独打开该特定功能?
serverfault 上的其他帖子指出升级后重建索引,我已经这样做了,但这似乎并没有真正产生影响。
需要注意的是,手头的应用程序会生成许多不是准备好的语句的查询。这可能导致我在 perfmon 中看到大量编译(编译/批处理请求:0.25)。我对此无能为力,所以告诉我先做些什么并不能真正帮助我前进。
要查看“最近的昂贵查询”,我使用活动监视器。那里的一些查询带有参数。
有没有办法知道这些值?
我最近开始使用SQL Server,但我仍然不知道做一些事情的最佳方式。
我创建了所有以列 ID 作为主键的表。现在,当我尝试插入值时,出现以下错误:
“无法将值 NULL 插入列 'id'、表 'Project.dbo.Table';列不允许为空值。插入失败。语句已终止。”
这个问题有什么好的、简单的解决方案?
我最近用以下代码示例回答了一个问题:
Create Table #Testing
(
emaildomain varchar(100) -- Still bigger than functionally needed but better than MAX
);
INSERT INTO #Testing VALUES (REVERSE('@myfreepaysite.com')); -- Changed
Create Table #DataToCheck
(
fullemail varchar(200) -- Still bigger than functionally needed but better than MAX
);
Insert Into #DataToCheck VALUES(REVERSE('rr1234@myfreepaysite.com')); --Changed
Select Top 1
REVERSE(fullemail)
, REVERSE(emaildomain)
FROM #DataToCheck
INNER JOIN #Testing ON fullemail LIKE emaildomain + '%';
Run Code Online (Sandbox Code Playgroud)
当我写最后一行时,我想知道EmailDomain用通配符连接列是否是 SQL 注入的开始。这是我应该注意这种类型的代码还是 SQL Server 会将其评估为单个统一参数以便我不必担心使用这种方法?
sql-server ×9
aggregate ×1
array ×1
erd ×1
index-tuning ×1
like ×1
memory ×1
performance ×1
postgresql ×1
spatial ×1