我有一些使用 Entity Framework Code First 创建的数据库;应用程序正在运行,总的来说,我对 Code First 让我做的事情感到非常满意。我首先是一名程序员,其次是 DBA,这是必要的。我正在阅读 DataAttributes 以在 C# 中进一步描述我希望数据库执行的操作;我的问题是:将这些nvarchar(max)字符串放在我的桌子上会吃什么惩罚(见下面的例子)?
在这个特定的表中有几列;在 C# 中,它们是这样定义的:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }
Run Code Online (Sandbox Code Playgroud)
我希望根据名称、来源、生成和书面内容进行查询和/或排序。我希望 Name 和 Source 的长度为 0-50 个字符,有时可达 150 个。我希望这个表开始时很小(<100k 行),但随着时间的推移显着增长(>1m 行)。显然消息可以是小或大的,并且可能不会被查询。
我想知道的是,我的 Name 和 Source …
sql-server entity-framework sql-server-2008-r2 azure-sql-database
我在 SSMS 周围闲逛,注意到我的INT列的“大小”是 4 个字节(预期),但看到我的BIT列是一个完整字节时,我有点震惊。
我误解了我在看什么吗?
我有 Log 和 LogItem 表;我正在编写一个查询来从两者中获取一些数据。有数千个,Logs每个Log最多可以有 125 个LogItems
有问题的查询很复杂,所以我跳过它(如果有人认为它很重要,我可以发布它),但是当我运行 SSMS 估计查询计划时,它告诉我一个新的非聚集索引可以将性能提高到 100% .
Existing Index: Non-clustered
Key Colums (LogItem): ParentLogID, DateModified, Name, DatabaseModified
Query Plan Recommendation
CREATE NONCLUSTERED INDEX [LogReportIndex]
ON [dbo].[LogItem] ([ParentLogID],[DatabaseModified])
Run Code Online (Sandbox Code Playgroud)
只是为了好玩,我创建了这个新索引并运行了查询,令我惊讶的是,我的查询现在需要大约 1 秒才能运行,而之前是 10+ 秒。
我假设我现有的索引会覆盖这个新查询,所以我的问题是为什么在我的新查询中使用的唯一列上创建一个新索引可以提高性能?我是否应该为我的where子句中使用的每个唯一的列组合创建一个索引?
注意:我不认为这是因为 SQL Server 正在缓存我的结果,我在创建索引之前运行了大约 25-30 次查询并且它持续花费了 10-15 秒,在索引之后它现在持续 ~1或更少。
鉴于这种:
DECLARE
TYPE T_ARRAY IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
MY_ARRAY T_ARRAY;
V_COUNT INTEGER;
Run Code Online (Sandbox Code Playgroud)
我想要做:
BEGIN
-- ... some code filling the MY_ARRAY array
-- obviously COUNT_ELEMENTS() does not exists, this is what I'm looking for :-)
V_COUNT := COUNT_ELEMENTS(MY_ARRAY);
DBMS_OUTPUT.PUT_LINE('My array containts ' || V_COUNT || ' elements.');
END;
Run Code Online (Sandbox Code Playgroud)
有什么比创建一个执行基本循环递增计数器的过程更好的方法吗?也许 PL/SQL 本机函数已经这样做了COUNT_ELEMENTS()?
我有一个查询目前平均需要 2500 毫秒才能完成。我的表很窄,但有 4400 万行。我有什么选择可以提高性能,或者这是否已经达到了最好的效果?
查询
SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats]
WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31';
Run Code Online (Sandbox Code Playgroud)
桌子
CREATE TABLE [dbo].[Heartbeats](
[ID] [int] IDENTITY(1,1) NOT NULL,
[DeviceID] [int] NOT NULL,
[IsPUp] [bit] NOT NULL,
[IsWebUp] [bit] NOT NULL,
[IsPingUp] [bit] NOT NULL,
[DateEntered] [datetime] NOT NULL,
CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
指数
CREATE NONCLUSTERED INDEX …Run Code Online (Sandbox Code Playgroud) 作为这个关于提高查询性能的问题的后续,我想知道是否有办法让我的索引默认使用。
此查询在大约 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] 上有一个非聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题是两部分:
风景
CREATE VIEW [dbo].[vProductList]
WITH SCHEMABINDING
AS
SELECT
p.[Id]
,p.[Name]
,price.[Value] as CalculatedPrice
,orders.[Value] as OrdersWithThisProduct
FROM
products as p
INNER JOIN productMetadata as price ON p.Id = price.ProductId AND price.MetaId = 1
INNER JOIN productMetadata as orders ON p.Id = orders.ProductId AND orders.MetaId = 2
Run Code Online (Sandbox Code Playgroud)
为简单起见,假设productMetadata列ProductId, MetaId, Value有~87m 行,products表中有大约 400k 行。
针对此视图的一般查询完美地工作:
SELECT * FROM vProductList WHERE CalculatedPrice > 500
Run Code Online (Sandbox Code Playgroud)
查询结果在 2-4 秒内(通过 vpn 和远程,所以我很擅长)。
将上述更改为计数同样快:
SELECT COUNT(*) from vProductList WHERE …Run Code Online (Sandbox Code Playgroud) 如何在 Oracle 中按我自己自定义的顺序对 Varchar2 或 NVarchar2 列进行排序。或者是否有任何现有的选项可以先放字母,然后是数字,然后是所有特殊字符。
我们的第一种方法是使用一个函数来手动将字符映射到数字。
select id, sorted_column
from some_table
order FN_SPECIAL_SORT_KEY(sorted_column,'asc')
Run Code Online (Sandbox Code Playgroud)
特殊的排序函数将每个字符映射到一个 2 位数字,返回值用于排序。这似乎只是非常昂贵的串联,感觉不对。
for i in 1..length(sorted_text)
loop
v_result:=v_result || case substr(sorted_text,i,1)
WHEN ' ' THEN 82 WHEN '!' THEN 81 WHEN '"' THEN 80 WHEN '#' THEN 79 WHEN '$'
..............
WHEN 'u' THEN 15 WHEN 'U' THEN 15 WHEN 'v' THEN 14 WHEN 'V' THEN 14 WHEN 'w' THEN 13 WHEN 'W' THEN 13 WHEN 'x'
....
else 90 end;
end loop;
Run Code Online (Sandbox Code Playgroud)
我很难想出另一种方法。我想知道这种方法存在哪些问题。也许我们别无选择。 …
阅读了Using Replication for Scale-Out,我如何将不同的查询路由到不同的服务器,例如,SELECT我想路由到从服务器和NON-SELECT主服务器。我假设作为负载均衡器我可以使用haproxy,但我没有发现可以在haproxy级别上区分查询?另外,假设有人直接到达了master,master如何识别这是SELECT查询和显示发送到slave,或loadbalancer。
我正在为时间跟踪应用程序设计数据库架构,我需要一些建议。应用程序必须允许用户为一周中的每一天输入他为特定项目工作的时间。在您看来,存储这些值的最佳方式是什么?
sql-server ×5
index ×2
optimization ×2
oracle ×2
performance ×2
datatypes ×1
mysql ×1
oracle-10g ×1
order-by ×1
plsql ×1
replication ×1
scalability ×1
sorting ×1
view ×1