SELECT * 測試

来源:http://www.cnblogs.com/jil-wen/archive/2017/05/21/6837245.html
-Advertisement-
Play Games

描述 大家通常禁止在生產環境直接使用select * 已成常識了,也常常在開發規範中就會規定不允許直接使用select *,那麼我們為什麼不允許使用select * ,在一些什麼場景下select * 會出問題?能否控制不能直接使用select *?出於這些疑問,我們特別測試記錄一下。 測試環境 M ...


描述

大家通常禁止在生產環境直接使用select * 已成常識了,也常常在開發規範中就會規定不允許直接使用select *,那麼我們為什麼不允許使用select * ,在一些什麼場景下select * 會出問題?能否控制不能直接使用select *?出於這些疑問,我們特別測試記錄一下。

 

測試環境

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)  Feb 10 2012 19:39:15  Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )  

select * 可能會造成業務功能出錯

假設我們有一個視圖 V_test 代碼如下:
1 CREATE VIEW v_test
2 AS
3     SELECT  *
4     FROM    test

 

你在web前端調用直接使用如下腳本並對應好顯示的欄位,當時功能是正常的。
   SELECT  *
    FROM    v_test

 

test 表結構如下: 表結構  後來因為業務調整,有人調整了test表 ,並加一個欄位F ,那麼接下來的後果就會前端相應的功能因新增的欄位F直接報錯。  

select * 可能會造成性能方面的問題

測試數據準備
 1 --新建測試表
 2 IF OBJECT_ID('test', 'U') IS NOT NULL
 3     DROP TABLE test;
 4 CREATE TABLE test
 5     (
 6       id int IDENTITY(1, 1) ,
 7       a nvarchar(20) ,
 8       b nvarchar(15) ,
 9       c nvarchar(20) ,
10       d int ,
11       e float
12     );
 1 --造測試數據
 2 DECLARE @i INT; 
 3 SET @i = 10000;
 4 WHILE ( @i > 0 )
 5     BEGIN 
 6         INSERT  INTO test
 7                 ( a ,
 8                   b ,
 9                   c ,
10                   d ,
11                   e
12                 )
13                 SELECT  RAND() * 1000 ,
14                         RAND() * 1000 ,
15                         REPLICATE('a', 3) ,
16                         @i ,
17                         @i - 1;
18         SELECT  @i = @i - 1;
19     END; 
1 --新建索引(主鍵、非聚集索引)
2 ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
3 CREATE INDEX IX_test_1 ON dbo.test(a);

 

查詢條件使用主鍵欄位的執行計劃,主鍵是預設覆蓋全部欄位。 查詢 如直接使用欄位a做查詢條件 a  還是聚集索引掃描,全表掃,無法使用我們已新建好的非聚集索引IX_test_1,在上述語句中因該索引未覆蓋到非a 的欄位。假設實際場景我們只需取a欄位,那麼執行計劃又是怎麼樣的? a欄位  如上圖,就會走我們期望的索引,同時也可以減少因select * 而多讀的欄位(id、b、c、d、e)的網路傳輸,所以,儘量指定自己所需的欄位名,可以避免一些無謂的性能開銷。  

如何控制不讓 select *

假設我們不允許在上述測試表test上執行select * 可以如何處理
 1 --新建測試表
 2 IF OBJECT_ID('test', 'U') IS NOT NULL
 3     DROP TABLE test;
 4 CREATE TABLE test
 5     (
 6       id int IDENTITY(1, 1) ,
 7       a nvarchar(20) ,
 8       b nvarchar(15) ,
 9       c nvarchar(20) ,
10       d int ,
11       e float,
12       abort_select_all  AS  (1/0)        ---新增控制欄位
13     );
14 --造測試數據
15 DECLARE @i INT; 
16 SET @i = 10000;
17 WHILE ( @i > 0 )
18     BEGIN 
19         INSERT  INTO test
20                 ( a ,
21                   b ,
22                   c ,
23                   d ,
24                   e
25                 )
26                 SELECT  RAND() * 1000 ,
27                         RAND() * 1000 ,
28                         REPLICATE('a', 3) ,
29                         @i ,
30                         @i - 1;
31         SELECT  @i = @i - 1;
32     END; 
33 --新建索引 (主鍵、非聚集索引)
34 ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
35 CREATE INDEX IX_test_1 ON dbo.test(a);

 

如下圖,如果select *  因讀取了abort_select_all欄位(1/0)就會直接報錯,從而達到不能直接select *的效果; select *
  直接按欄位名查詢沒有問題(非abort_select_all欄位)。 非select * 直接按欄位名查詢沒有問題。
 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文來自:http://www.runoob.com/w3cnote/android-tutorial-imageview.html 本節引言: 本節介紹的UI基礎控制項是:ImageView(圖像視圖),見名知意,就是用來顯示圖像的一個View或者說控制項! 官方API:ImageView;本節講解的 ...
  • 在導出資料庫dmp文件時,有資料庫表空記錄的情況下,該空表不會被導出表結構,應用如下格式代碼: select 'alter table ' || table_name || ' allocate extent(size 64k);' sql_text, table_name, tablespace_ ...
  • " 1、SQL 語句分類 " "1.1、分類方法及類型" "1.2、數據定義語言" "1.3、數據操縱語言" "1.4、其它語句" " 2、動態 SQL 理論 " "2.1、動態 SQL 的用途" "2.2、動態 SQL 的語法" "2.3、綁定變數" " 3、動態 SQL 實戰 " "3.1、封裝 ...
  • 在日常工作中,會碰到如下的場景,如mysql資料庫升級,主伺服器硬體升級等,這個時候就需要將寫操作切換到另外一臺伺服器上,那麼如何進行線上切換呢?同時,要求切換過程短,對業務的影響比較小。 MHA就提供了這樣一種優雅的方式,只會堵塞業務0.5~2s的時間,在這段時間內,業務無法讀取和寫入。 集群信息 ...
  • 這裡向大家介紹一個新的生成T-SQL腳本的SQL Server命令行工具:mssql-scripter。它支持在SQL Server、Azure SQL DB以及Azure SQL DW中為資料庫生成CREATE和INSERT T-SQL腳本。 Mssql-scripter是一個跨平臺的命令行工具, ...
  • 前幾天朋友問我,關於SQLServer資料庫中對樹形結構的表數據統計問題,需求大致如下: 分類表(遞歸數據),A的子分類是B,B的子分類是C……分類關係不間斷,A為第一層,B為第二層,C為第三層……需要統計“每個分類所在的層數”、“子分類的總數”和“子分類的層數”。 ...
  • 此文為慕課網MySql學習筆記,地址:http://www.imooc.com/learn/122 一、在my.ini中配置預設字元集為utf8 a.客戶端:[mysql] default-character-set=utf8 b.服務端:[mysqld] character-set-server= ...
  • MHA(Master High Availability)是一套相對成熟的MySQL高可用方案,能做到在0~30s內自動完成資料庫的故障切換操作,在master伺服器不宕機的情況下,基本能保證數據的一致性。 它由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。其中,MH ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...