我有一个关于 SQL Server 的广泛问题,这是在测验中给我的,但我不确定答案是什么,因为我在家无法访问 SQL Server。我的问题是如何利用 SQL Server 工具来识别查询优化、缺失索引等?
有人可以给我一个非常简短的答案吗?
谢谢
我有一个如下所示的查询:
Select t1.field1, t2.field2, sum(t1.field3)
From t1 inner join t2 on t1.id = t2.id
Group by t1.field1, t2.field2
Run Code Online (Sandbox Code Playgroud)
它被简化了,通常上面有更多的连接和属性。我现在的问题是,将 TOP N 子句添加到查询而不是在 N 行返回到我的 C# 代码后停止查询的影响有多大。
我知道,添加该条款对服务器更好,但我对粗略估计该条款有多大影响很感兴趣。我的猜测是,因为我有一个聚合,服务器无论如何都必须处理所有行,因此影响不是那么大。
编辑:C# Snippet 我们如何停止执行
var cmd = new SqlCommand();
cmd.CommandText = sqlStatement;
cmd.Connection = connectionString;
SqlDataReader dr;
dr = cmd.ExecuteReader();
while (dr.HasRows)
{
while (dr.Read())
{
MyDataRow newRow = new MyDataRowDataRow();
newRow.Parse(dr); //Parse the value from datarow to our format
result.Add(newRow);
if (topN.HasValue)
{
if (result.Count >= topN.Value)
{
break; //stop reading!
}
} …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 ETL 过程,该过程将大约 200 万行写入 SQL Server 数据库。
我正在尝试优化纯插入所需的时间(我猜更新是另一回事)。
我想知道将基本插入到 SQL 数据库的最大瓶颈是什么,或者是减少时间的最佳方法。
我的意思是,第一件事可能是数据的大小,对吗?行数、列数和每列中的数据大小。其中一些可能无法最小化,每行的 KB/ 占用空间是可以潜在优化的一件事,对吧?
还有什么可以优化或者是最大的因素?它是传输介质吗?我的意思是,写入同一台计算机上的数据库与通过 Web 连接写入(即强大、快速且 ping 为 1 毫秒?)之间有多大差异。
最后 --- 为什么与数据库的多个并行连接似乎将进程加速到某个点?我的意思是,当我有 20 个连接进行循环插入时,它比一个连接写入所有数据快 6-7 倍。我很好奇这是为什么。
现在我有 220 万行,总计 2.7 GB。这是每行 1.23 kb。
现在使用 14 个连接一次插入 1000 行 (1.23 MB) 需要 6.7 秒。这是蜗牛般的每秒 10.66 行。即使假设 1 个连接也一样快(它不是),最多为 150 行/秒,这也不是完全“快”。我正在写一个超快速、强大的网络连接 b/c,我们不能在与数据仓库相同的空间上进行 ETL 过程。
那么..如何优化这里的速度?
一次 1000 行的原因是因为数据来自 1000 页 - 但优化解析现在是一个单独的问题。
我相信我确实有一个主要索引,但没有什么写起来太昂贵。现在我只是在做蒙特卡罗之类的测试(尝试一下,看看什么是有效的),但我需要更专注的东西。
performance sql-server optimization parallelism query-performance
我有一个包含数百万行的表,分为几个类别(比如数字 1-5)。访问数据库的应用程序使用一个单一的数据库帐户。但是,该应用程序有自己的用户帐户,每个应用程序用户只能访问某些类别。因此,允许的类别列表通过会话变量传递给数据库:
SET SESSION mydb.allowed_categories = '1,3,5';
Run Code Online (Sandbox Code Playgroud)
我使用 RLS 根据会话变量过滤行:
CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (ARRAY[category] && string_to_array(current_setting('mydb.allowed_categories'),',')::int[]));
Run Code Online (Sandbox Code Playgroud)
问题在于,使用这种方法,RLS 行过滤需要花费大量时间。另一方面,当我通过以下方式进行实验时:
CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (category = 1 OR category = 3 OR category = 5);
Run Code Online (Sandbox Code Playgroud)
RLS 过滤几乎快了 10 倍。当然,这种硬编码是行不通的,因为我想在应用程序中动态更改允许的类别列表。
这 category列有一个 btree 索引,但是由于类别的数量相当少,查询计划器总是倾向于对 RLS 过滤器进行顺序扫描。
所以我的问题是 - 有没有办法优化 RLS 表达式,使其至少更接近硬编码方法?你会建议一个不同的解决方案吗?该应用程序有很多用户,所以我不想为每个用户都创建一个数据库帐户。
我今天在接受新工作的面试时被问到一个关于SELECT查询的问题:
SELECT lastname FROM users WHERE name='John';
Run Code Online (Sandbox Code Playgroud)
此SELECT查询将运行超过一百万行。
我被问到:你如何使它更快/更有效?
我没有答案,一些谷歌搜索也没有向我透露任何信息。
我知道这个问题被关闭的可能性很高,但我真的很想知道您如何使该查询运行得更快。有任何想法吗?
我改变了这个查询
SELECT ...
FROM linkedServer.DB.Schema.Table1 t1
LEFT JOIN linkedServer.DB.Schema.Table2 t2 ON t1.ORDER_ID = t2.ORDER_ID
WHERE t1.BRANCH_ID NOT IN (
'009991', '009992', '009993', '009994', '009995', '009996', '009999', '900001',
'900002', '900003', '900004', '900005', '900006', '900007', '900008', '999991',
'999992', '999993', '999994', '999995'
)
GROUP BY ...
Run Code Online (Sandbox Code Playgroud)
进入这个
SELECT ...
FROM linkedServer.DB.Schema.Table1 t1
LEFT JOIN linkedServer.DB.Schema.Table2 t2 ON t1.ORDER_ID = t2.ORDER_ID
WHERE t1.BRANCH_ID NOT IN (
SELECT b.BRANCH_ID
FROM TB_BRANCH b --25 rows in total
WHERE b.START_DT = '99999999' --the result of this sub-query …Run Code Online (Sandbox Code Playgroud) 我有以下查询:
SELECT id,
email,
first_name as "firstName",
last_name as "lastName",
is_active as "isActive",
password,
access,
CASE
WHEN access < 3 THEN (
SELECT
CASE WHEN count(*) = 1 THEN true ELSE false END
FROM user_rating_entity ure
WHERE ure.user_id = u.id
AND ure.rating_entity_id = :re_id
)
ELSE true
END as "isResponsible"
FROM users u
WHERE u.id = :id
Run Code Online (Sandbox Code Playgroud)
如果access > 3,字段“isResponsible”应直接设置为true,并且不应执行子查询。我在这两种情况下都使用了解释分析,其中 access>=和<to 3但我得到了相同的输出。
为什么呢?
我有这个查询:
SELECT my_code
FROM ranges
WHERE 123456789 BETWEEN first_number AND last_number
ORDER BY type_of_code ASC LIMIT 1 ;
Run Code Online (Sandbox Code Playgroud)
我的问题是,它会在ORDER BY从WHERE子句中选择行之后运行吗?
我KEY在first_number和last_number。我的桌子大约有 500 万行。我不想ORDER BY先。
我的查询返回大约 590 行和 8 列。我遇到的问题是从开始到结束查询需要 2 分 30 秒才能完成。这里的一群人教会了我很多如何编写更有效的查询,所以这里是另一个!
我使用的是date变量而不是变量,datetime因为我的变量只包含一个日期 - 我还使用Aaron Bertrand - Bad Habits To Kickyyyymmdd建议的格式存储我的日期。
我可以做些什么来优化此查询并使结果返回得更快?
DECLARE @Startdate date = '20170101',
@Enddate date = '20170131';
WITH fc As
(
Select
Teacher
,Team
,fc
FROM [Helper].[dbo].[fc]
)
,ia As
(
Select
Teacher
,tia
FROM dbo.ia
WHERE [hiredate] >= @Startdate
AND [hiredate] < DATEADD(DAY,1,@Enddate)
)
,inb As
(
Select
Teacher
,tinb
FROM inb
),
ripcord As
(
Select
Teacher
,pit
FROM [homebase].[dbo].[rip] …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化服务器的性能,这个特定的查询导致从数据库中读取大量数据,进而导致查询超时。此查询是从 Asp.Net MVC 中的 EF6 生成的。
这是有问题的查询:
exec sp_executesql N'SELECT
[Project1].[C1] AS [C1],
[Project1].[Date] AS [Date],
[Project1].[AssetID] AS [AssetID],
[Project1].[EventData] AS [EventData]
FROM ( SELECT
[Extent1].[AssetID] AS [AssetID],
[Extent1].[Date] AS [Date],
[Extent1].[EventData] AS [EventData],
1 AS [C1]
FROM [dbo].[Alarm] AS [Extent1]
WHERE ([Extent1].[AssetID] IN (cast(''c6e3142e-5b1f-4a91-90d2-03a504e86ece'' as uniqueidentifier), cast(''4de25e8a-7401-49ae-bd6d-0861d67f0d2f'' as uniqueidentifier), cast(''455e3a5f-1091-4784-9964-0a1a54eaa644'' as uniqueidentifier), cast(''04b46c21-c44f-4b67-b64b-12f2764c0448'' as uniqueidentifier), cast(''a350992b-8548-4bf1-bd22-131c114a5343'' as uniqueidentifier), cast(''98ec1f36-cc54-45d2-a0e3-22aa1b669373'' as uniqueidentifier), cast(''27abcf37-2093-43d5-ae62-2e7b10fe4692'' as uniqueidentifier), cast(''c9f43598-2b9c-47b0-9230-37440e6aea54'' as uniqueidentifier), cast(''c5964caa-5c73-4c0e-bb80-4c1dc7e11039'' as uniqueidentifier), cast(''6ac30678-3876-43c9-b708-61ef19b5ea17'' as uniqueidentifier), cast(''e69d870a-87de-4e3d-b4fc-62c962489a7b'' as uniqueidentifier), cast(''a7c2f407-c605-4491-85fe-66c16fc15586'' as uniqueidentifier), …Run Code Online (Sandbox Code Playgroud) performance sql-server optimization parameter-sniffing query-performance
optimization ×10
sql-server ×5
performance ×4
mysql ×2
postgresql ×2
cte ×1
explain ×1
group-by ×1
index ×1
limits ×1
order-by ×1
parallelism ×1
security ×1
subquery ×1
t-sql ×1
where ×1